diff --git a/.clang-tidy b/.clang-tidy index ef41eda3bb7b5..4c42ea906b772 100644 --- a/.clang-tidy +++ b/.clang-tidy @@ -1,4 +1,97 @@ -Checks: 'clang-diagnostic-*,modernize-use-using' +# Enable some categories of checks and then disable individual ones. +# The disabled checks that appear as part of the initial alphabetical section +# enabling categories (e.g. cert-err58-cpp) are ones that do not make sense for +# this codebase and we do not intend to fix. The disabled checks appearing +# thereafter in a separate alphabetical list have yet to be triaged. We may +# fix their errors or recategorise them as checks we don't care about. +Checks: "\ +bugprone-*,\ +cata-*,\ +cert-*,\ +-cert-err58-cpp,\ +clang-diagnostic-*,\ +cppcoreguidelines-slicing,\ +llvm-namespace-comment,\ +misc-*,\ +modernize-*,\ +performance-*,\ +readability-*,\ +-bugprone-inaccurate-erase,\ +-bugprone-incorrect-roundings,\ +-bugprone-integer-division,\ +-bugprone-macro-parentheses,\ +-bugprone-misplaced-widening-cast,\ +-bugprone-narrowing-conversions,\ +-bugprone-string-integer-assignment,\ +-bugprone-too-small-loop-variable,\ +-bugprone-undefined-memory-manipulation,\ +-bugprone-unused-return-value,\ +-bugprone-use-after-move,\ +-cert-dcl03-c,\ +-cert-dcl16-c,\ +-cert-dcl21-cpp,\ +-cert-dcl50-cpp,\ +-cert-dcl58-cpp,\ +-cert-dcl59-cpp,\ +-cert-env33-c,\ +-cert-err34-c,\ +-cert-flp30-c,\ +-cert-msc30-c,\ +-cert-msc32-c,\ +-cert-msc50-cpp,\ +-cert-msc51-cpp,\ +-misc-definitions-in-headers,\ +-misc-non-private-member-variables-in-classes,\ +-misc-redundant-expression,\ +-misc-static-assert,\ +-misc-unconventional-assign-operator,\ +-modernize-avoid-c-arrays,\ +-modernize-deprecated-headers,\ +-modernize-loop-convert,\ +-modernize-make-unique,\ +-modernize-pass-by-value,\ +-modernize-raw-string-literal,\ +-modernize-return-braced-init-list,\ +-modernize-use-auto,\ +-modernize-use-default-member-init,\ +-modernize-use-emplace,\ +-modernize-use-equals-default,\ +-modernize-use-equals-delete,\ +-modernize-use-nullptr,\ +-modernize-use-override,\ +-modernize-use-transparent-functors,\ +-performance-for-range-copy,\ +-performance-inefficient-vector-operation,\ +-performance-move-const-arg,\ +-performance-noexcept-move-constructor,\ +-performance-implicit-conversion-in-loop,\ +-performance-inefficient-algorithm,\ +-performance-inefficient-string-concatenation,\ +-performance-type-promotion-in-math-fn,\ +-performance-unnecessary-copy-initialization,\ +-performance-unnecessary-value-param,\ +-readability-avoid-const-params-in-decls,\ +-readability-braces-around-statements,\ +-readability-const-return-type,\ +-readability-else-after-return,\ +-readability-function-size,\ +-readability-implicit-bool-conversion,\ +-readability-inconsistent-declaration-parameter-name,\ +-readability-isolate-declaration,\ +-readability-magic-numbers,\ +-readability-named-parameter,\ +-readability-non-const-parameter,\ +-readability-container-size-empty,\ +-readability-redundant-control-flow,\ +-readability-redundant-declaration,\ +-readability-redundant-member-init,\ +-readability-redundant-preprocessor,\ +-readability-redundant-string-init,\ +-readability-simplify-boolean-expr,\ +-readability-static-accessed-through-instance,\ +-readability-string-compare,\ +-readability-uppercase-literal-suffix,\ +" WarningsAsErrors: '*' HeaderFilterRegex: '(src|test).*' FormatStyle: none diff --git a/.travis.yml b/.travis.yml index 5e0562eaff1c6..1aaca516a5538 100644 --- a/.travis.yml +++ b/.travis.yml @@ -105,12 +105,12 @@ jobs: osx_image: xcode10.1 compiler: clang - - env: CLANG=clang++-8 TILES=1 SOUND=1 CXXFLAGS=-Wno-unused-command-line-argument CMAKE=1 CATA_CLANG_TIDY=clang-tidy-8 + - env: CLANG=clang++-8 TILES=1 SOUND=1 CXXFLAGS=-Wno-unused-command-line-argument CMAKE=1 CATA_CLANG_TIDY=plugin name: "Clang-tidy CMake build with Tiles and Sound" compiler: clang addons: &clang8 apt: - packages: ["clang-8", "clang-tidy-8", "libsdl2-dev", "libsdl2-ttf-dev", "libsdl2-image-dev", "libsdl2-mixer-dev"] + packages: ["clang-8", "libclang-8-dev", "llvm-8-dev", "llvm-8-tools", "libsdl2-dev", "libsdl2-ttf-dev", "libsdl2-image-dev", "libsdl2-mixer-dev"] sources: [*apt_sources, llvm-toolchain-xenial-8] # Finally check the compiler variants diff --git a/CMakeLists.txt b/CMakeLists.txt index 049cc922f6de9..24d62f1df2b4f 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -8,6 +8,8 @@ SET(CMAKE_MODULE_PATH ${CMAKE_SOURCE_DIR}/CMakeModules ) +SET(CMAKE_TLS_VERIFY ON) + # Build options option(TILES "Build graphical tileset version." "OFF") option(CURSES "Build curses version." "ON" ) @@ -17,8 +19,11 @@ option(USE_HOME_DIR "Use user's home directory for save files." "ON" ) option(LOCALIZE "Support for language localizations. Also enable UTF support." "ON" ) option(LANGUAGES "Compile localization files for specified languages." "" ) option(DYNAMIC_LINKING "Use dynamic linking. Or use static to remove MinGW dependency instead." "ON") -option(GIT_BINARY "Git binary name or path." "") -OPTION(PREFIX "Location of Data & GFX directories" "") +option(CATA_CLANG_TIDY_PLUGIN "Build Cata's custom clang-tidy plugin" "OFF") +set(CATA_CLANG_TIDY_INCLUDE_DIR "" CACHE STRING "Path to internal clang-tidy headers required for plugin (e.g. ClangTidy.h)") +set(CATA_CHECK_CLANG_TIDY "" CACHE STRING "Path to check_clang_tidy.py for plugin tests") +set(GIT_BINARY "" CACHE STRING "Git binary name or path.") +set(PREFIX "" CACHE STRING "Location of Data & GFX directories") include(CTest) @@ -33,7 +38,7 @@ MESSAGE(" \\ \\____ / __ \\_ | | / __ \\_\\ \\___ | |__ \\___ | \\__ MESSAGE(" \\______ /\(____ / |__| \(____ / \\___ >|____/ / ____|/____ >|__|_| / ") MESSAGE(" \\/ \\/ \\/ \\/ \\/ \\/ \\/ ") MESSAGE(" --= Dark Days Ahead =--") -MESSAGE("\n * http://en.cataclysmdda.com/\n") +MESSAGE("\n * https://cataclysmdda.org/\n") MESSAGE(STATUS "${PROJECT} build environment -- \n") @@ -341,6 +346,9 @@ if (NOT MSVC) add_subdirectory(src/chkjson) endif() add_subdirectory(tests) +if (CATA_CLANG_TIDY_PLUGIN) + add_subdirectory(tools/clang-tidy-plugin) +endif() CONFIGURE_FILE( "${CMAKE_CURRENT_SOURCE_DIR}/cmake_uninstall.cmake.in" diff --git a/COMPILING-CMAKE.md b/COMPILING-CMAKE.md index ed65b15642589..5c23c529dfa43 100644 --- a/COMPILING-CMAKE.md +++ b/COMPILING-CMAKE.md @@ -3,7 +3,6 @@ **WARNING**: CMake build is **NOT** official and should be used for *dev purposes ONLY*. For official way to build CataclysmDDA See: - * The latest instructions on how to compile can be found on [our wiki](http://tools.cataclysmdda.com/wiki). * [COMPILING.md](https://github.com/CleverRaven/Cataclysm-DDA/blob/master/COMPILING.md) diff --git a/COMPILING.md b/COMPILING.md index 542279119541a..5955f13cc4a4a 100644 --- a/COMPILING.md +++ b/COMPILING.md @@ -575,7 +575,7 @@ Open Terminal's preferences, turn on "Use bright colors for bold text" in "Prefe ## Visual Studio Guide -Visual Studio 2015 (or later) is required to build Cataclysm. If you use a later version of Visual Studio, you will need to [enable the Visual Studio 2015 (v140) platform toolset](https://developercommunity.visualstudio.com/content/problem/48806/cant-find-v140-in-visual-studio-2017.html). We created solution and project files in directory `msvc-full-features`. Because of the complexity and how troublesome defining every combination of build feature options are, in Visual Studio project we added all build features, including tiles, sound and localization. +Visual Studio 2017 (or later) is required to build Cataclysm: Dark Days Ahead. Solutions and project files are located in directory `msvc-full-features`. Because of the complexity and how troublesome defining every combination of build feature options are, Visual Studio projects have all build features enabled, including tiles, sound and localization. ### Dependencies diff --git a/Makefile b/Makefile index a2b335ea34ade..55607bf03a2ee 100644 --- a/Makefile +++ b/Makefile @@ -685,6 +685,8 @@ TESTSRC := $(wildcard tests/*.cpp) TESTHDR := $(wildcard tests/*.h) JSON_FORMATTER_SOURCES := tools/format/format.cpp src/json.cpp CHKJSON_SOURCES := src/chkjson/chkjson.cpp src/json.cpp +CLANG_TIDY_PLUGIN_SOURCES := \ + $(wildcard tools/clang-tidy-plugin/*.cpp tools/clang-tidy-plugin/*/*.cpp) TOOLHDR := $(wildcard tools/*/*.h) # Using sort here because it has the side-effect of deduplicating the list ASTYLE_SOURCES := $(sort \ @@ -694,6 +696,7 @@ ASTYLE_SOURCES := $(sort \ $(TESTHDR) \ $(JSON_FORMATTER_SOURCES) \ $(CHKJSON_SOURCES) \ + $(CLANG_TIDY_PLUGIN_SOURCES) \ $(TOOLHDR)) _OBJS = $(SOURCES:$(SRC_DIR)/%.cpp=%.o) diff --git a/build-scripts/build.sh b/build-scripts/build.sh index 7fae2b527ac7f..ee1011cbe5bf5 100755 --- a/build-scripts/build.sh +++ b/build-scripts/build.sh @@ -19,6 +19,7 @@ then build-scripts/lint-json.sh make -j "$num_jobs" style-json + tools/dialogue_validator.py data/json/npcs/* data/json/npcs/*/* data/json/npcs/*/*/* # Also build chkjson (even though we're not using it), to catch any # compile errors there make -j "$num_jobs" chkjson @@ -40,6 +41,17 @@ then build_type=Debug fi + cmake_extra_opts= + + if [ "$CATA_CLANG_TIDY" = "plugin" ] + then + cmake_extra_opts="$cmake_extra_opts -DCATA_CLANG_TIDY_PLUGIN=ON" + # Need to specify the particular LLVM / Clang versions to use, lest it + # use the llvm-7 that comes by default on the Travis Xenial image. + cmake_extra_opts="$cmake_extra_opts -DLLVM_DIR=/usr/lib/llvm-8/lib/cmake/llvm" + cmake_extra_opts="$cmake_extra_opts -DClang_DIR=/usr/lib/llvm-8/lib/cmake/clang" + fi + mkdir build cd build cmake \ @@ -48,9 +60,25 @@ then -DCMAKE_BUILD_TYPE="$build_type" \ -DTILES=${TILES:-0} \ -DSOUND=${SOUND:-0} \ + $cmake_extra_opts \ .. if [ -n "$CATA_CLANG_TIDY" ] then + if [ "$CATA_CLANG_TIDY" = "plugin" ] + then + make -j$num_jobs CataAnalyzerPlugin + export PATH=$PWD/tools/clang-tidy-plugin/clang-tidy-plugin-support/bin:$PATH + if ! which FileCheck + then + ls -l tools/clang-tidy-plugin/clang-tidy-plugin-support/bin + ls -l /usr/bin + echo "Missing FileCheck" + exit 1 + fi + CATA_CLANG_TIDY=clang-tidy + lit -v tools/clang-tidy-plugin/test + fi + "$CATA_CLANG_TIDY" --version # Run clang-tidy analysis instead of regular build & test @@ -94,7 +122,7 @@ then analyze_files_in_random_order "$remaining_cpp_files" else # Regular build - make -j3 + make -j$num_jobs cd .. # Run regular tests [ -f "${bin_path}cata_test" ] && run_tests "${bin_path}cata_test" @@ -117,3 +145,5 @@ else fi fi ccache --show-stats + +# vim:tw=0 diff --git a/build-scripts/clang-tidy-wrapper.sh b/build-scripts/clang-tidy-wrapper.sh index 187248f004bb0..8ca192cedae43 100755 --- a/build-scripts/clang-tidy-wrapper.sh +++ b/build-scripts/clang-tidy-wrapper.sh @@ -15,5 +15,12 @@ then exit 0 fi +plugin=build/tools/clang-tidy-plugin/libCataAnalyzerPlugin.so + set -x -"$CATA_CLANG_TIDY" "$@" +if [ -f "$plugin" ] +then + LD_PRELOAD=$plugin "$CATA_CLANG_TIDY" "$@" +else + "$CATA_CLANG_TIDY" "$@" +fi diff --git a/build-scripts/requirements.sh b/build-scripts/requirements.sh index 99ad8505ab89c..327463af1854a 100644 --- a/build-scripts/requirements.sh +++ b/build-scripts/requirements.sh @@ -21,6 +21,8 @@ if just_json; then export CODE_COVERAGE="" fi +set -x + if [ -n "${CODE_COVERAGE}" ]; then travis_retry pip install --user pyyaml cpp-coveralls export CXXFLAGS="$CXXFLAGS --coverage" @@ -28,7 +30,7 @@ if [ -n "${CODE_COVERAGE}" ]; then fi if [ -n "$CATA_CLANG_TIDY" ]; then - travis_retry pip install --user compiledb + travis_retry pip install --user compiledb lit fi # Influenced by https://github.com/zer0main/battleship/blob/master/build/windows/requirements.sh diff --git a/data/help/texts.json b/data/help/texts.json index 5e679aacdc0bc..395951f6e81fb 100644 --- a/data/help/texts.json +++ b/data/help/texts.json @@ -194,7 +194,7 @@ "It's a good idea to pull the handbrake - \"s\" - when parking, just to be safe. If you want to get out, hit the lights, toggle cruise control, turn the engine on or off, or otherwise use the vehicle controls, press to bring up the \"Vehicle Controls\" menu, which has options for things you'd do from the driver's seat.", "Examining () a vehicle brings up the vehicle interaction window. The left pane shows a top-down view of your vehicle and each part of it. The middle pane shows a summmary of the vehicle's engines, batteries, storage tanks, weapons, and seating. The right panel is context sensitive, but normally has descriptions of the vehicle parts in the tile highlighted in the vehicle view on the left.", "Across the bottom are a summary of the most important parameters of your vehicle. Safe speed is how fast you can drive without damaging the engine and maximum speed is how fast you can drive at the engine's maximum output. Acceleration is how fast your vehicle can increase speed each turn. Cargo volume is how much cargo you can store and how much stuff you have in your vehicle, mass is how much the vehicle weighs, and the Status and Wheels give a summary of the vehicle condition and wheel condition. There are also fuel indicators on the lower right that give an estimate of how quickly your fuel will run out.", - "Air drag, water drag, rolling drag, and static drag are all values that influence your vehicle's safe and maximum speed. The interaction of drag and engine power is complicated, but generally speaking, more powerful engines will make your vehicle go faster but aslo consume fuel faster.", + "Air drag, water drag, rolling drag, and static drag are all values that influence your vehicle's safe and maximum speed. The interaction of drag and engine power is complicated, but generally speaking, more powerful engines will make your vehicle go faster but also consume fuel faster.", "Air drag increases as your vehicle gets wider or has more parts that increase the vehicle's height like full boards, aisles, or turrets. It also increases as the vehicle has a less aerodynamic profile, such as having exposed passengers or full boards at the front of the vehicle. Air drag strongly influences vehicle speed, especially at high speeds.", "Rolling drag increases with vehicle weight and wheel count. Rigid wheels have less rolling drag per wheel than inflatable wheels, but weigh more so rolling drag may still increase when moving from inflatable wheels to rigid wheels. Tank treads have enormous rolling resistance and are very heavy, so tanks have a lot of rolling resistance. Rolling drag influences vehicle speed, but less than air drag does, especially at high speeds.", "Vehicles that can move in water have a water drag. Water drag increases with vehicle width and draft, and draft increases with vehicle weight but is reduced by adding more boat boards and by widening or lengthening the vehicle. Water drag has enormous effect on vehicle speed in the water. See the section on water vehicles for more about draft and water drag.", diff --git a/data/json/bionics.json b/data/json/bionics.json index 76c2b2ce07648..fcbc454bcc287 100644 --- a/data/json/bionics.json +++ b/data/json/bionics.json @@ -131,6 +131,7 @@ "type": "bionic", "name": "Optical Dampers", "description": "The lenses surgically installed over your eyes can be tinted to block out incoming light.", + "included": true, "flags": [ "BIONIC_TOGGLED" ] }, { @@ -305,6 +306,7 @@ "type": "bionic", "name": "Sound Dampeners", "description": "When this bionic is active, you can block hearing completely (with Enhanced Hearing deactivated) or dampen sound slightly (with Enhanced Hearing activated).", + "included": true, "flags": [ "BIONIC_TOGGLED" ] }, { @@ -713,6 +715,7 @@ "id": "bio_plutdump", "type": "bionic", "name": "Plutonium Purger", + "included": true, "description": "Emergency reactor fuel purge ejects all fuel from your reactor.", "act_cost": 1 }, @@ -1033,6 +1036,7 @@ "name": "Extended Toolset", "description": "Extend or withdraw your integrated toolset to cut metal, pry things, or other stuff. This takes up your hand.", "fake_item": "toolset_extended", + "included": true, "flags": [ "BIONIC_TOGGLED", "BIONIC_WEAPON" ] }, { diff --git a/data/json/construction.json b/data/json/construction.json index ac5cd16adbea8..0df3e5532a955 100644 --- a/data/json/construction.json +++ b/data/json/construction.json @@ -135,7 +135,7 @@ "required_skills": [ [ "fabrication", 2 ] ], "time": "30 m", "qualities": [ [ { "id": "HAMMER", "level": 2 } ], [ { "id": "SAW_W", "level": 2 } ] ], - "components": [ [ [ "2x4", 2 ] ], [ [ "wood_panel", 1 ] ], [ [ "nail", 12 ] ] ], + "components": [ [ [ "2x4", 2 ] ], [ [ "wood_panel", 1 ] ], [ [ "nail", 12 ] ], [ [ "hinge", 2 ] ] ], "pre_terrain": "t_door_frame", "post_terrain": "t_door_c" }, @@ -266,7 +266,7 @@ "required_skills": [ [ "fabrication", 3 ] ], "time": "90 m", "qualities": [ [ { "id": "HAMMER", "level": 2 } ], [ { "id": "SAW_W", "level": 2 } ] ], - "components": [ [ [ "2x4", 6 ], [ "wood_panel", 1 ] ], [ [ "2x4", 6 ] ], [ [ "nail", 48 ] ] ], + "components": [ [ [ "2x4", 6 ], [ "wood_panel", 1 ] ], [ [ "2x4", 6 ] ], [ [ "nail", 48 ] ], [ [ "hinge", 1 ] ] ], "pre_flags": "BARRICADABLE_DOOR", "post_terrain": "t_rdoor_c" }, @@ -290,7 +290,11 @@ "required_skills": [ [ "fabrication", 7 ] ], "time": "120 m", "qualities": [ [ { "id": "HAMMER", "level": 2 } ], [ { "id": "SAW_M", "level": 1 } ], [ { "id": "WRENCH", "level": 1 } ] ], - "components": [ [ [ "steel_lump", 4 ], [ "steel_chunk", 12 ], [ "scrap", 36 ] ], [ [ "steel_plate", 2 ], [ "sheet_metal", 8 ] ] ], + "components": [ + [ [ "steel_lump", 4 ], [ "steel_chunk", 12 ], [ "scrap", 36 ] ], + [ [ "steel_plate", 2 ], [ "sheet_metal", 8 ] ], + [ [ "hinge", 3 ] ] + ], "pre_terrain": "t_mdoor_frame", "post_terrain": "t_door_metal_c" }, @@ -1183,7 +1187,7 @@ "required_skills": [ [ "fabrication", 2 ], [ "survival", 1 ] ], "time": "30 m", "qualities": [ [ { "id": "HAMMER", "level": 2 } ], [ { "id": "DIG", "level": 2 } ] ], - "components": [ [ [ "pointy_stick", 2 ], [ "spear_wood", 2 ] ], [ [ "2x4", 5 ] ], [ [ "nail", 12 ] ] ], + "components": [ [ [ "pointy_stick", 2 ], [ "spear_wood", 2 ] ], [ [ "2x4", 5 ] ], [ [ "nail", 12 ] ], [ [ "hinge", 2 ] ] ], "pre_flags": "DIGGABLE", "post_terrain": "t_fencegate_c" }, @@ -1248,7 +1252,7 @@ "time": "150 m", "components": [ [ [ "wire", 20 ] ], [ [ "steel_chunk", 3 ], [ "scrap", 12 ] ], [ [ "pipe", 20 ] ] ], "pre_note": "Needs to be supported on both sides by fencing, walls, etc.", - "pre_special": "check_support", + "pre_special": "check_empty", "post_terrain": "t_chaingate_c" }, { @@ -1280,9 +1284,9 @@ "category": "CONSTRUCT", "required_skills": [ [ "fabrication", 2 ] ], "time": "45 m", - "components": [ [ [ "wire", 10 ] ], [ [ "2x4", 5 ] ], [ [ "nail", 20 ] ] ], + "components": [ [ [ "wire", 10 ] ], [ [ "2x4", 5 ] ], [ [ "nail", 20 ] ], [ [ "hinge", 2 ] ] ], "pre_note": "Needs to be supported on both sides by fencing, walls, etc.", - "pre_special": "check_support", + "pre_special": "check_empty", "post_terrain": "t_chickenwire_gate_c" }, { @@ -1804,7 +1808,7 @@ "time": "180 m", "qualities": [ [ { "id": "SAW_M", "level": 1 } ], [ { "id": "SCREW", "level": 1 } ] ], "using": [ [ "welding_standard", 8 ] ], - "components": [ [ [ "rebar", 16 ] ], [ [ "sheet_metal_small", 12 ] ] ], + "components": [ [ [ "rebar", 16 ] ], [ [ "sheet_metal_small", 12 ] ], [ [ "hinge", 2 ] ] ], "pre_terrain": "t_mdoor_frame", "post_terrain": "t_door_bar_c" }, @@ -2159,6 +2163,44 @@ "pre_terrain": "t_rock_floor", "post_special": "done_mine_downstair" }, + { + "type": "construction", + "description": "Repair Wooden Staircase", + "//": "Fix the broken back to normal", + "category": "REPAIR", + "required_skills": [ [ "fabrication", 4 ] ], + "time": "120 m", + "qualities": [ [ { "id": "HAMMER", "level": 2 } ] ], + "components": [ [ [ "2x4", 6 ] ], [ [ "nail", 20 ] ], [ [ "wood_panel", 3 ] ] ], + "pre_terrain": "t_wood_stairs_up_broken", + "post_terrain": "t_wood_stairs_up", + "post_special": "done_wood_stairs" + }, + { + "type": "construction", + "description": "Build Wooden Staircase", + "//": "Step 1: stairs frame in an empty space", + "category": "CONSTRUCT", + "required_skills": [ [ "fabrication", 6 ] ], + "time": "360 m", + "qualities": [ [ { "id": "HAMMER", "level": 2 } ] ], + "components": [ [ [ "2x4", 12 ] ], [ [ "nail", 24 ] ] ], + "pre_special": "check_empty_up_OK", + "post_terrain": "t_wood_stairs_up_half" + }, + { + "type": "construction", + "description": "Build Wooden Staircase", + "//": "Step 2: complete the half made stairs by putting paneling on it", + "category": "CONSTRUCT", + "required_skills": [ [ "fabrication", 6 ] ], + "time": "360 m", + "qualities": [ [ { "id": "HAMMER", "level": 2 } ], [ { "id": "SAW_W", "level": 2 } ] ], + "components": [ [ [ "wood_panel", 4 ] ], [ [ "nail", 30 ] ] ], + "pre_terrain": "t_wood_stairs_up_half", + "post_terrain": "t_wood_stairs_up", + "post_special": "done_wood_stairs" + }, { "type": "construction", "description": "Mine Upstair", @@ -2717,6 +2759,17 @@ "pre_terrain": "t_fence_post", "post_terrain": "t_wall_rammed_earth" }, + { + "type": "construction", + "description": "Hang Hanging Meathook", + "category": "CONSTRUCT", + "required_skills": [ [ "fabrication", 1 ] ], + "time": 15, + "qualities": [ [ { "id": "HAMMER", "level": 2 } ], [ { "id": "SCREW", "level": 1 } ] ], + "components": [ [ [ "grip_hook", 1 ] ], [ [ "chain", 1 ] ] ], + "pre_special": "check_support", + "post_terrain": "f_hanging_meathook" + }, { "type": "construction", "description": "Build Counter Gate", @@ -2724,7 +2777,7 @@ "required_skills": [ [ "fabrication", 1 ] ], "time": "30 m", "qualities": [ [ { "id": "HAMMER", "level": 2 } ] ], - "components": [ [ [ "2x4", 6 ] ], [ [ "nail", 10 ] ] ], + "components": [ [ [ "2x4", 6 ] ], [ [ "nail", 10 ] ], [ [ "hinge", 2 ] ] ], "pre_special": "check_empty", "post_terrain": "f_counter_gate_c" }, @@ -2735,7 +2788,7 @@ "required_skills": [ [ "fabrication", 2 ], [ "survival", 1 ] ], "time": "30 m", "qualities": [ [ { "id": "HAMMER", "level": 2 } ], [ { "id": "DIG", "level": 2 } ] ], - "components": [ [ [ "pointy_stick", 2 ], [ "spear_wood", 2 ] ], [ [ "2x4", 5 ] ], [ [ "nail", 12 ] ] ], + "components": [ [ [ "pointy_stick", 2 ], [ "spear_wood", 2 ] ], [ [ "2x4", 5 ] ], [ [ "nail", 12 ] ], [ [ "hinge", 2 ] ] ], "pre_flags": "DIGGABLE", "post_terrain": "t_splitrail_fencegate_c" }, @@ -2746,7 +2799,7 @@ "required_skills": [ [ "fabrication", 2 ], [ "survival", 1 ] ], "time": "30 m", "qualities": [ [ { "id": "HAMMER", "level": 2 } ], [ { "id": "DIG", "level": 2 } ] ], - "components": [ [ [ "pointy_stick", 2 ], [ "spear_wood", 2 ] ], [ [ "2x4", 8 ] ], [ [ "nail", 20 ] ] ], + "components": [ [ [ "pointy_stick", 2 ], [ "spear_wood", 2 ] ], [ [ "2x4", 8 ] ], [ [ "nail", 20 ] ], [ [ "hinge", 2 ] ] ], "pre_flags": "DIGGABLE", "post_terrain": "t_privacy_fencegate_c" }, diff --git a/data/json/construction_category.json b/data/json/construction_category.json new file mode 100644 index 0000000000000..6722d4aa31bf7 --- /dev/null +++ b/data/json/construction_category.json @@ -0,0 +1,54 @@ +[ + { + "//": "Should be first in the list", + "type": "construction_category", + "id": "ALL", + "name": "All" + }, + { + "type": "construction_category", + "id": "CONSTRUCT", + "name": "Constructions" + }, + { + "type": "construction_category", + "id": "FURN", + "name": "Furniture" + }, + { + "type": "construction_category", + "id": "DIG", + "name": "Digging and Mining" + }, + { + "type": "construction_category", + "id": "REPAIR", + "name": "Repairing" + }, + { + "type": "construction_category", + "id": "REINFORCE", + "name": "Reinforcing" + }, + { + "type": "construction_category", + "id": "DECORATE", + "name": "Decorative" + }, + { + "type": "construction_category", + "id": "FARM_WOOD", + "name": "Farming and Woodcutting" + }, + { + "type": "construction_category", + "id": "OTHER", + "name": "Others" + }, + { + "//": "Should be last in the list", + "type": "construction_category", + "id": "FILTER", + "name": "Filter" + } +] diff --git a/data/json/doll_speech.json b/data/json/doll_speech.json deleted file mode 100644 index 9f040d2059a8b..0000000000000 --- a/data/json/doll_speech.json +++ /dev/null @@ -1,194 +0,0 @@ -[ - { - "type": "speech", - "speaker": "talking_doll", - "sound": "Wanna play with me?", - "volume": 10 - }, - { - "type": "speech", - "speaker": "talking_doll", - "sound": "Sing with me!", - "volume": 10 - }, - { - "type": "speech", - "speaker": "talking_doll", - "sound": "I love you!", - "volume": 10 - }, - { - "type": "speech", - "speaker": "talking_doll", - "sound": "Please take me with you!", - "volume": 10 - }, - { - "type": "speech", - "speaker": "talking_doll", - "sound": "May I have a cookie?", - "volume": 10 - }, - { - "type": "speech", - "speaker": "talking_doll", - "sound": "Let's play together!", - "volume": 10 - }, - { - "type": "speech", - "speaker": "talking_doll", - "sound": "Time to play!", - "volume": 10 - }, - { - "type": "speech", - "speaker": "talking_doll", - "sound": "Om nom nom! Delicious!", - "volume": 10 - }, - { - "type": "speech", - "speaker": "talking_doll", - "sound": "Are you my mommy?", - "volume": 10 - }, - { - "type": "speech", - "speaker": "talking_doll", - "sound": "Oh, how fun!", - "volume": 10 - }, - { - "type": "speech", - "speaker": "talking_doll", - "sound": "You're my best friend!", - "volume": 10 - }, - { - "type": "speech", - "speaker": "talking_doll", - "sound": "Heehee!", - "volume": 10 - }, - { - "type": "speech", - "speaker": "talking_doll", - "sound": "Let's have fun!", - "volume": 10 - }, - { - "type": "speech", - "speaker": "talking_doll", - "sound": "Let's have a tea party!", - "volume": 10 - }, - { - "type": "speech", - "speaker": "talking_doll", - "sound": "You're the best!", - "volume": 10 - }, - { - "type": "speech", - "speaker": "creepy_doll", - "sound": "You shouldn't have done that.", - "volume": 10 - }, - { - "type": "speech", - "speaker": "creepy_doll", - "sound": "Let's play... Russian roulette.", - "volume": 10 - }, - { - "type": "speech", - "speaker": "creepy_doll", - "sound": "I hate you.", - "volume": 10 - }, - { - "type": "speech", - "speaker": "creepy_doll", - "sound": "Go kill yourself!", - "volume": 10 - }, - { - "type": "speech", - "speaker": "creepy_doll", - "sound": "Big Brother is watching you...", - "volume": 10 - }, - { - "type": "speech", - "speaker": "creepy_doll", - "sound": "Die for me!", - "volume": 10 - }, - { - "type": "speech", - "speaker": "creepy_doll", - "sound": "Why won't you die?", - "volume": 10 - }, - { - "type": "speech", - "speaker": "creepy_doll", - "sound": "Blood... Delicious.", - "volume": 10 - }, - { - "type": "speech", - "speaker": "creepy_doll", - "sound": "See you... IN HELL!", - "volume": 10 - }, - { - "type": "speech", - "speaker": "creepy_doll", - "sound": "AAAIEEEEEEE!", - "volume": 10 - }, - { - "type": "speech", - "speaker": "creepy_doll", - "sound": "FUCK YOU!", - "volume": 10 - }, - { - "type": "speech", - "speaker": "creepy_doll", - "sound": "What did you do with my Mommy?", - "volume": 10 - }, - { - "type": "speech", - "speaker": "creepy_doll", - "sound": "Stay with me... forever!", - "volume": 10 - }, - { - "type": "speech", - "speaker": "creepy_doll", - "sound": "Hey kids. Want some candy?", - "volume": 10 - }, - { - "type": "speech", - "speaker": "creepy_doll", - "sound": "Down here, they ALL float!", - "volume": 10 - }, - { - "type": "speech", - "speaker": "creepy_doll", - "sound": "Do you really need that much honey?", - "volume": 10 - }, - { - "type": "speech", - "speaker": "creepy_doll", - "sound": "My previous owner squealed like a pig when I gutted her!", - "volume": 10 - } -] diff --git a/data/json/effects.json b/data/json/effects.json index c6ad9f986d391..d51e1105990a1 100644 --- a/data/json/effects.json +++ b/data/json/effects.json @@ -1229,7 +1229,7 @@ ], "max_intensity": 4, "apply_message": "You feel lightheaded.", - "int_dur_factor": 1000, + "int_dur_factor": 6000, "miss_messages": [ [ "You feel woozy.", 1 ] ], "base_mods": { "vomit_chance": [ -43 ], "sleep_chance": [ -1003 ], "sleep_min": [ 2500 ], "sleep_max": [ 3500 ] }, "scaling_mods": { "per_mod": [ -0.5 ], "dex_mod": [ -0.5 ], "int_mod": [ -0.75 ], "vomit_chance": [ 21 ], "sleep_chance": [ 501 ] } diff --git a/data/json/emit.json b/data/json/emit.json index 42db5caf96584..37ca4db7efdb1 100644 --- a/data/json/emit.json +++ b/data/json/emit.json @@ -4,7 +4,7 @@ "type": "emit", "//": "Intermittent cigarette smoke (example: lit cigarette)", "field": "fd_cigsmoke", - "density": 2, + "intensity": 2, "chance": 50 }, { diff --git a/data/json/flags.json b/data/json/flags.json index a0ee54123c657..b683c1546dbd2 100644 --- a/data/json/flags.json +++ b/data/json/flags.json @@ -559,5 +559,59 @@ "type": "json_flag", "context": [ "SPELL" ], "description": "This makes the spell's Area of Effect ignore walls." + }, + { + "id": "HOSTILE_SUMMON", + "type": "json_flag", + "context": [ "SPELL" ], + "description": "This makes the spell's summoned monster always hostile. Note that the spell needs to be a summon spell for this to do anything." + }, + { + "id": "HOSTILE_50", + "type": "json_flag", + "context": [ "SPELL" ], + "description": "This makes the spell's summoned monster hostile 50% of the time. Note that the spell needs to be a summon spell for this to do anything." + }, + { + "id": "SILENT", + "type": "json_flag", + "context": [ "SPELL" ], + "description": "The spell makes no sound at its point of impact." + }, + { + "id": "LOUD", + "type": "json_flag", + "context": [ "SPELL" ], + "description": "This spell is much louder at its point of impact." + }, + { + "id": "VERBAL", + "type": "json_flag", + "context": [ "SPELL" ], + "description": "The caster must speak in order to cast the spell. More mouth encumbrannce increases failure percent, and the caster speaks when casting." + }, + { + "id": "SOMATIC", + "type": "json_flag", + "context": [ "SPELL" ], + "description": "The spell requires arm movement to cast. Arm encumbrance affects failure percentage and casting time." + }, + { + "id": "NO_HANDS", + "type": "json_flag", + "context": [ "SPELL" ], + "description": "The spell does not require hands in order to cast it. Encumbrance penalties on hands are nullified." + }, + { + "id": "NO_LEGS", + "type": "json_flag", + "context": [ "SPELL" ], + "description": "This spell does not require leg movement in order to be cast. All encumbrance penalties for legs are nullified." + }, + { + "id": "CONCENTRATE", + "type": "json_flag", + "context": [ "SPELL" ], + "description": "This spell requires focus to cast. The lower your focus, the higher failure rate to cast." } ] diff --git a/data/json/furniture.json b/data/json/furniture.json index d5402bc29f826..f327e44ff00ea 100644 --- a/data/json/furniture.json +++ b/data/json/furniture.json @@ -537,7 +537,7 @@ "id": "f_leaves_pile", "name": "pile of leaves", "symbol": "#", - "description": "A sizeable pile of leaves. You could sleep on it if you don't care about comfort or warmth.", + "description": "A sizable pile of leaves. You could sleep on it if you don't care about comfort or warmth.", "color": "brown", "move_cost_mod": 3, "coverage": 35, @@ -692,7 +692,7 @@ "id": "f_bathtub", "name": "bathtub", "symbol": "~", - "description": "You could lay in and take a soothing bath, if there were running water. The plug is intact, so you could use it to store liquids.", + "description": "You could lay in and take a soothing bath, if there were running water. The plug is intact, so you could use it to store liquids.", "color": "white", "move_cost_mod": 2, "coverage": 30, @@ -1144,7 +1144,14 @@ "required_str": -1, "max_volume": 4000, "flags": [ "TRANSPARENT", "FLAMMABLE", "ORGANIC", "MOUNTABLE", "SHORT", "FLAT_SURF" ], - "deconstruct": { "items": [ { "item": "2x4", "count": 4 }, { "item": "rag", "count": 4 }, { "item": "nail", "charges": [ 6, 10 ] } ] }, + "deconstruct": { + "items": [ + { "item": "2x4", "count": 4 }, + { "item": "rag", "count": 4 }, + { "item": "wood_panel", "count": 1 }, + { "item": "nail", "charges": [ 6, 10 ] } + ] + }, "bash": { "str_min": 12, "str_max": 50, @@ -1169,7 +1176,9 @@ "coverage": 60, "required_str": 10, "flags": [ "TRANSPARENT", "FLAMMABLE", "ORGANIC", "MOUNTABLE", "SHORT", "FLAT_SURF" ], - "deconstruct": { "items": [ { "item": "2x4", "count": 6 }, { "item": "nail", "charges": [ 6, 8 ] } ] }, + "deconstruct": { + "items": [ { "item": "2x4", "count": 4 }, { "item": "wood_panel", "count": 1 }, { "item": "nail", "charges": [ 6, 10 ] } ] + }, "max_volume": 4000, "bash": { "str_min": 12, @@ -1185,7 +1194,7 @@ "type": "furniture", "id": "f_counter_gate_c", "name": "closed counter gate", - "description": "A commercial quality swining door made of wood that allows passage behind counters.", + "description": "A commercial quality swinging door made of wood that allows passage behind counters.", "symbol": "+", "color": "blue", "move_cost": 3, @@ -1195,7 +1204,7 @@ "flags": [ "TRANSPARENT", "FLAMMABLE_ASH", "DOOR", "ORGANIC" ], "connects_to": "COUNTER", "open": "f_counter_gate_o", - "deconstruct": { "ter_set": "t_floor", "items": [ { "item": "2x4", "count": 6 }, { "item": "nail", "charges": 10 } ] }, + "deconstruct": { "items": [ { "item": "2x4", "count": 4 }, { "item": "wood_panel", "count": 1 }, { "item": "nail", "charges": 10 } ] }, "bash": { "str_min": 12, "str_max": 40, @@ -1217,7 +1226,7 @@ "connects_to": "COUNTER", "flags": [ "TRANSPARENT", "FLAMMABLE_ASH", "FLAT", "ROAD", "ORGANIC" ], "close": "f_counter_gate_c", - "deconstruct": { "ter_set": "t_floor", "items": [ { "item": "2x4", "count": 6 }, { "item": "nail", "charges": 10 } ] }, + "deconstruct": { "items": [ { "item": "2x4", "count": 4 }, { "item": "wood_panel", "count": 1 }, { "item": "nail", "charges": 10 } ] }, "bash": { "str_min": 12, "str_max": 40, @@ -1329,7 +1338,9 @@ "coverage": 70, "required_str": 8, "flags": [ "TRANSPARENT", "CONTAINER", "FLAMMABLE", "PLACE_ITEM", "ORGANIC", "BLOCKSDOOR", "MOUNTABLE" ], - "deconstruct": { "items": [ { "item": "2x4", "count": 6 }, { "item": "nail", "charges": [ 6, 8 ] } ] }, + "deconstruct": { + "items": [ { "item": "2x4", "count": 6 }, { "item": "wood_panel", "count": [ 0, 1 ] }, { "item": "nail", "charges": [ 6, 8 ] } ] + }, "max_volume": 8000, "bash": { "str_min": 12, @@ -1415,7 +1426,13 @@ "coverage": 80, "required_str": 9, "flags": [ "FLAMMABLE", "PLACE_ITEM", "ORGANIC", "BLOCKSDOOR" ], - "deconstruct": { "items": [ { "item": "2x4", "count": 12 }, { "item": "nail", "charges": [ 12, 16 ] } ] }, + "deconstruct": { + "items": [ + { "item": "2x4", "count": 12 }, + { "item": "wood_panel", "count": [ 0, 1 ] }, + { "item": "nail", "charges": [ 12, 16 ] } + ] + }, "max_volume": 8000, "bash": { "str_min": 6, @@ -1658,7 +1675,12 @@ "FLAT_SURF" ], "deconstruct": { - "items": [ { "item": "2x4", "count": 12 }, { "item": "nail", "charges": [ 12, 24 ] }, { "item": "rag", "count": [ 15, 20 ] } ] + "items": [ + { "item": "2x4", "count": 12 }, + { "item": "nail", "charges": [ 12, 24 ] }, + { "item": "wood_panel", "count": [ 0, 1 ] }, + { "item": "rag", "count": [ 15, 20 ] } + ] }, "max_volume": 3500, "bash": { @@ -1686,7 +1708,12 @@ "required_str": 12, "flags": [ "TRANSPARENT", "CONTAINER", "FLAMMABLE", "PLACE_ITEM", "ORGANIC", "MOUNTABLE", "SHORT" ], "deconstruct": { - "items": [ { "item": "2x4", "count": 12 }, { "item": "nail", "charges": [ 12, 24 ] }, { "item": "rag", "count": [ 15, 20 ] } ] + "items": [ + { "item": "2x4", "count": 12 }, + { "item": "nail", "charges": [ 12, 24 ] }, + { "item": "wood_panel", "count": [ 0, 1 ] }, + { "item": "rag", "count": [ 15, 20 ] } + ] }, "max_volume": 3500, "bash": { @@ -1724,7 +1751,9 @@ "SHORT" ], "examine_action": "locked_object", - "deconstruct": { "items": [ { "item": "2x4", "count": 4 }, { "item": "nail", "charges": [ 6, 10 ] } ] }, + "deconstruct": { + "items": [ { "item": "2x4", "count": 4 }, { "item": "wood_panel", "count": [ 1, 2 ] }, { "item": "nail", "charges": [ 6, 10 ] } ] + }, "max_volume": 4000, "bash": { "str_min": 12, @@ -1745,7 +1774,9 @@ "coverage": 60, "required_str": 10, "flags": [ "TRANSPARENT", "CONTAINER", "FLAMMABLE", "PLACE_ITEM", "ORGANIC", "MOUNTABLE", "SHORT" ], - "deconstruct": { "items": [ { "item": "2x4", "count": 4 }, { "item": "nail", "charges": [ 6, 10 ] } ] }, + "deconstruct": { + "items": [ { "item": "2x4", "count": 4 }, { "item": "wood_panel", "count": [ 0, 1 ] }, { "item": "nail", "charges": [ 6, 10 ] } ] + }, "max_volume": 4000, "bash": { "str_min": 12, @@ -2064,7 +2095,7 @@ "type": "furniture", "id": "f_flower_fungal", "name": "fungal flower", - "description": "This flower has been overgrown by grey, sinewy tendrils of fungus, and the color has leached from its petals and stem. It gently sways of its own volition.", + "description": "This flower has been overgrown by gray, sinewy tendrils of fungus, and the color has leached from its petals and stem. It gently sways of its own volition.", "symbol": "f", "color": "dark_gray", "move_cost_mod": 1, @@ -2307,7 +2338,7 @@ "type": "furniture", "id": "f_planter", "name": "planter", - "description": "A garden planter full of soil and slatted to allow adequate drainage. Can be used for planting crops.", + "description": "A garden planter full of soil and slatted to allow adequate drainage. Can be used for planting crops.", "symbol": "^", "color": "green", "move_cost_mod": 1, @@ -2341,7 +2372,7 @@ "type": "furniture", "id": "f_planter_seed", "name": "planter with seed", - "description": "A garden planter full of soil and slatted to allow adequate drainage. Can be used for planting crops. This one contains a planted seed", + "description": "A garden planter full of soil and slatted to allow adequate drainage. Can be used for planting crops. This one contains a planted seed", "symbol": "^", "color": "brown", "looks_like": "f_plant_seed", @@ -2375,7 +2406,7 @@ "type": "furniture", "id": "f_planter_seedling", "name": "planter with seedling", - "description": "A garden planter full of soil and slatted to allow adequate drainage. Can be used for planting crops. This one contains a planted seedling", + "description": "A garden planter full of soil and slatted to allow adequate drainage. Can be used for planting crops. This one contains a planted seedling", "symbol": "^", "color": "green", "looks_like": "f_plant_seedling", @@ -2409,7 +2440,7 @@ "type": "furniture", "id": "f_planter_mature", "name": "planter with mature plant", - "description": "A garden planter full of soil and slatted to allow adequate drainage. Can be used for planting crops. This one contains a planted seed", + "description": "A garden planter full of soil and slatted to allow adequate drainage. Can be used for planting crops. This one contains a planted seed", "symbol": "#", "color": "green", "looks_like": "f_plant_mature", @@ -2443,7 +2474,7 @@ "type": "furniture", "id": "f_planter_harvest", "name": "planter with harvestable plant", - "description": "A garden planter full of soil and slatted to allow adequate drainage. Can be used for planting crops. This one contains a planted seed", + "description": "A garden planter full of soil and slatted to allow adequate drainage. Can be used for planting crops. This one contains a planted seed", "symbol": "#", "color": "light_green", "looks_like": "f_plant_harvest", @@ -2694,8 +2725,8 @@ { "type": "furniture", "id": "f_small_satelitte_dish", - "name": "satelitte dish", - "description": "A small satelitte dish for home entertainment.", + "name": "satellite dish", + "description": "A small satellite dish for home entertainment.", "symbol": "(", "color": "light_gray", "move_cost_mod": -2, @@ -3453,7 +3484,9 @@ }, { "type": "furniture", - "id": "f_floor_canvas", + "id": "f_punching_bag", + "aliases": "f_floor_canvas", + "looks_like": "f_floor_canvas", "name": "heavy punching bag", "description": "Punch Punch! Exercise those arms! Main selling point: it doesn't fight back!", "symbol": "0", @@ -4177,7 +4210,7 @@ "name": "camp chair", "symbol": "#", "looks_like": "f_chair", - "description": "Sit down, have a drink. It can folded for easy transportation.", + "description": "Sit down, have a drink. It can folded for easy transportation.", "color": "brown", "move_cost_mod": 1, "coverage": 35, @@ -5577,7 +5610,7 @@ "type": "furniture", "id": "f_sample_freezer", "name": "sample freezer", - "description": "When cold just isn't cold enough, you have this extreme deep freeze. This will store stuff at -80 degrees celsius. Don't lick the metal on the inside.", + "description": "When cold just isn't cold enough, you have this extreme deep freeze. This will store stuff at -80 degrees Celsius. Don't lick the metal on the inside.", "symbol": "[", "bgcolor": "white", "move_cost_mod": 2, @@ -6527,6 +6560,18 @@ "examine_action": "workbench", "workbench": { "multiplier": 1.2, "mass": 500000, "volume": "200L" } }, + { + "id": "f_hanging_meathook", + "type": "furniture", + "name": "hanging meathook", + "description": "A hefty hook suspended from a chain for stringing up corpses.", + "symbol": "g", + "required_str": -1, + "move_cost_mod": 2, + "color": "light_gray", + "deconstruct": { "items": [ { "item": "grip_hook", "count": 1 }, { "item": "chain", "count": 1 } ] }, + "flags": [ "TRANSPARENT", "BUTCHER_EQ" ] + }, { "type": "furniture", "id": "f_fake_bench_hands", @@ -6598,5 +6643,56 @@ "items": [ { "item": "steel_chunk", "count": [ 5, 10 ] } ] }, "flags": [ "TRANSPARENT", "MOUNTABLE", "SHORT" ] + }, + { + "type": "furniture", + "id": "f_speaker_cabinet", + "name": "speaker cabinet", + "description": "A cabinet loaded with 12-inch speakers, intended to help make various things loud. It can't serve its original purpose these days, but it could be disassembled for various electronic parts.", + "symbol": "7", + "color": "blue", + "move_cost_mod": -1, + "coverage": 50, + "max_volume": 15, + "required_str": 7, + "flags": [ "TRANSPARENT", "FLAMMABLE", "PLACE_ITEM" ], + "deconstruct": { + "items": [ + { "item": "scrap", "count": [ 4, 6 ] }, + { "item": "e_scrap", "count": [ 1, 2 ] }, + { "item": "plastic_chunk", "count": [ 0, 2 ] }, + { "item": "wood_panel", "count": 1 }, + { "item": "2x4", "count": 4 }, + { "item": "nail", "charges": [ 8, 10 ] }, + { "item": "cable", "charges": [ 3, 4 ] } + ] + }, + "bash": { + "str_min": 8, + "str_max": 20, + "sound": "smash!", + "sound_fail": "whump!", + "items": [ + { "item": "splinter", "count": [ 0, 6 ] }, + { "item": "scrap", "count": [ 0, 3 ] }, + { "item": "2x4", "count": [ 1, 2 ] }, + { "item": "nail", "charges": [ 2, 6 ] }, + { "item": "cable", "charges": [ 1, 3 ] }, + { "item": "e_scrap", "prob": 25 }, + { "item": "plastic_chunk", "count": [ 0, 1 ] } + ] + } + }, + { + "type": "furniture", + "id": "f_no_item", + "//": "This is used in a hack to clear furniture with the keg iexamine of all items execept the stored liquid before usage.", + "name": "seeing this is a bug", + "description": "Seeing this is a bug. If seen, please report and destroy.", + "symbol": "#", + "color": "black", + "move_cost_mod": 2, + "required_str": -1, + "flags": [ "NOITEM" ] } ] diff --git a/data/json/item_actions.json b/data/json/item_actions.json index 5f54c2c42de55..4c1e1dd8bf140 100644 --- a/data/json/item_actions.json +++ b/data/json/item_actions.json @@ -514,6 +514,11 @@ "id": "FLU_VACCINE", "name": "Inject" }, + { + "type": "item_action", + "id": "FOODPERSON", + "name": "Activate" + }, { "type": "item_action", "id": "FUNGICIDE", diff --git a/data/json/item_groups.json b/data/json/item_groups.json index 82bc878131fdb..3aea44ea419e8 100644 --- a/data/json/item_groups.json +++ b/data/json/item_groups.json @@ -180,6 +180,7 @@ [ "55gal_drum", 1 ], [ "flyer", 10 ], [ "one_year_old_newspaper", 2 ], + [ "foodperson_mask", 1 ], [ "months_old_newspaper", 3 ], [ "weeks_old_newspaper", 4 ], [ "newest_newspaper", 5 ], @@ -203,6 +204,7 @@ [ "colamdew", 35 ], [ "television", 30 ], [ "clock", 10 ], + [ "fp_loyalty_card", 5 ], [ "cola", 70 ], [ "choc_drink", 10 ], { "item": "cola", "prob": 20, "container-item": "bottle_plastic" }, @@ -523,6 +525,7 @@ [ "can_tomato", 40 ], [ "cooked_pumpkin", 20 ], [ "con_milk", 20 ], + [ "milk_evap", 20 ], [ "can_corn", 35 ], [ "can_spam", 30 ], [ "can_pineapple", 30 ], @@ -579,6 +582,7 @@ [ "jar_sauerkraut_pickled", 5 ], { "item": "meat_pickled", "prob": 4, "charges": 2, "container-item": "jar_glass_sealed" }, { "item": "fish_pickled", "prob": 6, "charges": 2, "container-item": "jar_glass_sealed" }, + [ "ghee", 5 ], [ "lutefisk", 1 ], [ "tongs", 25 ], [ "char_smoker", 25 ], @@ -651,8 +655,12 @@ { "item": "colamdew", "prob": 15, "container-item": "bottle_twoliter" }, { "item": "rootbeer", "prob": 15, "container-item": "bottle_twoliter" }, [ "milk", 50 ], + [ "milk_UHT", 5 ], + [ "milk_raw", 2 ], [ "almond_milk", 50 ], [ "soy_milk", 50 ], + { "item": "butter", "prob": 45, "charges-min": 1, "charges-max": 32, "container-item": "wrapper" }, + { "item": "ghee", "prob": 5, "charges-min": 1, "charges-max": 32, "container-item": "jar_glass" }, { "item": "egg_bird", "prob": 65, "count-min": 1, "count-max": 12 }, [ "yoghurt", 50 ], [ "pudding", 60 ], @@ -695,7 +703,7 @@ [ "carrot", 3 ], [ "irradiated_carrot", 1 ], [ "frozen_dinner", 50 ], - [ "frozen_burrito", 50 ], + [ "junk_burrito", 50 ], [ "chili", 10 ], [ "syrup", 10 ], [ "coffee_syrup", 10 ], @@ -889,6 +897,7 @@ [ "harmonica_holder", 10 ], [ "banjo", 5 ], [ "ukulele", 15 ], + [ "guitar_electric", 20 ], [ "gobag", 5 ], { "group": "ammo_pocket_batteries_full", "prob": 50 }, [ "bb", 8 ], @@ -1149,6 +1158,7 @@ [ "kimono", 2 ], [ "yukata", 6 ], [ "haori", 2 ], + [ "foodperson_mask", 1 ], [ "hakama", 4 ], [ "eclipse_glasses", 1 ], [ "thermos", 20 ] @@ -1330,7 +1340,7 @@ [ "sandwich_pbh", 30 ], [ "sandwich_pbm", 30 ], [ "frozen_dinner", 50 ], - [ "frozen_burrito", 60 ], + [ "junk_burrito", 60 ], [ "dried_salad", 6 ], [ "pizza_veggy", 8 ], [ "pizza_cheese", 8 ], @@ -1715,6 +1725,7 @@ [ "offal_canned", 1 ], [ "can_coconut", 1 ], [ "con_milk", 1 ], + [ "milk_evap", 1 ], [ "sauce_red", 1 ], [ "can_peach", 1 ], [ "apple_canned", 1 ], @@ -2543,6 +2554,8 @@ { "type": "item_group", "id": "trash", + "ammo": 20, + "magazine": 50, "items": [ [ "plastic_shopping_bag", 35 ], [ "iodine", 5 ], @@ -2551,6 +2564,7 @@ [ "meth", 2 ], [ "heroin", 1 ], [ "wrapper", 50 ], + [ "fp_loyalty_card", 5 ], [ "string_6", 2 ], [ "chain", 20 ], [ "glass_sheet", 5 ], @@ -2600,6 +2614,7 @@ [ "straw_doll", 1 ], [ "striped_shirt", 1 ], [ "striped_pants", 1 ], + [ "foodperson_mask", 1 ], [ "razor_blade", 10 ], [ "survnote", 5 ], [ "eclipse_glasses", 1 ], @@ -3537,6 +3552,8 @@ { "type": "item_group", "id": "office", + "ammo": 75, + "magazine": 100, "items": [ [ "cola", 70 ], [ "creamsoda", 60 ], @@ -3558,7 +3575,7 @@ [ "recipe_augs", 8 ], [ "choc_drink", 20 ], [ "aspirin", 85 ], - [ "frozen_burrito", 25 ], + [ "junk_burrito", 25 ], [ "cigar", 5 ], [ "ecig", 10 ], [ "advanced_ecig", 8 ], @@ -4021,6 +4038,7 @@ [ "rapier", 3 ], [ "cavalry_sabre", 3 ], [ "estoc", 3 ], + [ "estoc_inferior", 3 ], [ "cutlass", 3 ], [ "cutlass_inferior", 3 ], [ "scimitar", 20 ], @@ -4117,6 +4135,7 @@ [ "can_sealer", 5 ], [ "knuckle_brass", 15 ], [ "platinum_small", 10 ], + [ "foodperson_mask", 10 ], [ "gold_small", 10 ], [ "silver_small", 20 ], [ "cane", 10 ], @@ -4412,6 +4431,7 @@ [ "rapier", 1 ], [ "cavalry_sabre", 1 ], [ "estoc", 1 ], + [ "estoc_inferior", 3 ], [ "wakizashi", 1 ], [ "jian_inferior", 30 ], [ "scimitar_inferior", 25 ], @@ -4593,6 +4613,8 @@ [ "can_tomato", 40 ], [ "cooked_pumpkin", 20 ], [ "con_milk", 20 ], + [ "milk_evap", 15 ], + [ "milk_UHT", 10 ], [ "can_spam", 30 ], [ "can_tuna", 35 ], [ "can_salmon", 25 ], @@ -5732,6 +5754,8 @@ [ "1st_aid", 35 ], [ "saline", 15 ], [ "con_milk", 5 ], + [ "milk_UHT", 35 ], + [ "cereal", 35 ], [ "codeine", 15 ], [ "antibiotics", 25 ], [ "water_clean", 90 ], @@ -5783,6 +5807,8 @@ [ "1st_aid", 35 ], [ "saline", 10 ], [ "con_milk", 10 ], + [ "milk_UHT", 25 ], + [ "cereal", 20 ], [ "sports_drink", 40 ], [ "water_clean", 90 ] ] @@ -6381,6 +6407,7 @@ [ "file", 10 ], [ "child_book", 2 ], [ "lsd", 1 ], + [ "foodperson_mask", 1 ], [ "55gal_drum", 10 ], [ "30gal_drum", 15 ], [ "toolbox", 1 ], @@ -7074,6 +7101,8 @@ { "type": "item_group", "id": "science", + "ammo": 50, + "magazine": 100, "items": [ { "group": "tools_science", "prob": 50 }, [ "ether", 5 ], @@ -7221,7 +7250,8 @@ [ "vinegar", 10 ], { "item": "veggy_pickled", "prob": 30, "charges": 2, "container-item": "jar_glass_sealed" }, [ "jar_sauerkraut_pickled", 20 ], - [ "con_milk", 20 ], + [ "con_milk", 10 ], + [ "milk_evap", 10 ], { "item": "fish_pickled", "prob": 26, "charges": 2, "container-item": "jar_glass_sealed" }, [ "lutefisk", 1 ], [ "pemmican", 10 ], @@ -7816,7 +7846,8 @@ [ "football_armor", 18 ], [ "jacket_leather", 12 ], [ "jacket_jean", 8 ], - [ "jacket_flannel", 6 ] + [ "jacket_flannel", 6 ], + [ "cuirass_scrap", 12 ] ] }, { @@ -7830,6 +7861,7 @@ [ "winter_pants_army", 10 ], [ "bunker_pants", 14 ], [ "pants_leather", 18 ], + [ "legguard_scrap", 12 ], [ "skirt", 6 ], [ "kilt", 1 ] ] @@ -7854,6 +7886,7 @@ [ "vambrace_larmor", 6 ], [ "armguard_chitin", 1 ], [ "armguard_bone", 6 ], + [ "armguard_scrap", 12 ], [ "gloves_fur", 4 ], [ "gloves_leather", 22 ], [ "gloves_work", 22 ], @@ -7872,6 +7905,7 @@ [ "boots_fsurvivor", 2 ], [ "boots_h20survivor", 1 ], [ "boots", 20 ], + [ "boots_scrap", 12 ], [ "boots_steel", 28 ], [ "boots_hiking", 24 ], [ "knee_high_boots", 8 ], @@ -7907,6 +7941,7 @@ [ "firehelmet", 2 ], [ "helmet_barbute", 1 ], [ "helmet_plate", 1 ], + [ "helmet_scrap", 12 ], [ "bondage_mask", 1 ], [ "survivor_goggles", 10 ], [ "hood_rain", 14 ] @@ -8035,6 +8070,7 @@ [ "acorns", 2 ], [ "pinecone", 3 ], [ "flyer", 1 ], + [ "fp_loyalty_card", 1 ], [ "one_year_old_newspaper", 1 ], [ "months_old_newspaper", 2 ], [ "weeks_old_newspaper", 3 ], @@ -8061,6 +8097,7 @@ [ "string_6", 1 ], [ "cig_butt", 4 ], [ "string_36", 1 ], + [ "foodperson_mask", 1 ], [ "steel_lump", 1 ], [ "steel_chunk", 1 ], { "item": "scrap", "prob": 2, "count-min": 1, "count-max": 10 }, @@ -8081,6 +8118,8 @@ { "type": "item_group", "id": "arcade_prizes", + "ammo": 75, + "magazine": 100, "items": [ [ "bbgun", 30 ], [ "bb", 30 ], @@ -8228,6 +8267,8 @@ { "type": "item_group", "id": "antique", + "ammo": 75, + "magazine": 100, "items": [ [ "oxylamp", 50 ], [ "cow_bell", 15 ], @@ -8320,7 +8361,12 @@ [ "pistol_flintlock", 4 ], [ "carbine_flintlock", 4 ], [ "rifle_flintlock", 4 ], - [ "petrified_eye", 2 ] + [ "petrified_eye", 2 ], + [ "ji", 1 ], + [ "dao", 3 ], + [ "sword_xiphos", 4 ], + [ "khopesh", 4 ], + [ "spear_dory", 3 ] ] }, { @@ -8439,7 +8485,10 @@ [ "armguard_larmor", 40 ], [ "vambrace_larmor", 20 ], [ "gambeson", 50 ], - [ "legguard_metal", 10 ] + [ "legguard_metal", 10 ], + [ "helmet_corinthian", 45 ], + [ "armor_cuirass", 25 ], + [ "legguard_bronze", 20 ] ] }, { @@ -8473,6 +8522,7 @@ [ "cavalry_sabre", 4 ], [ "cavalry_sabre_fake", 8 ], [ "estoc", 3 ], + [ "estoc_inferior", 4 ], [ "estoc_fake", 5 ], [ "kris", 3 ], [ "kris_fake", 8 ], @@ -8503,7 +8553,12 @@ [ "warhammer", 2 ], [ "scythe_war", 2 ], [ "pike", 2 ], - [ "spear_steel", 2 ] + [ "spear_steel", 2 ], + [ "ji", 2 ], + [ "dao", 3 ], + [ "sword_xiphos", 4 ], + [ "khopesh", 4 ], + [ "spear_dory", 3 ] ] }, { @@ -8925,6 +8980,7 @@ [ "water_mineral", 15 ], [ "cola", 30 ], [ "choc_drink", 30 ], + [ "milk_UHT", 10 ], [ "rootbeer", 33 ], [ "creamsoda", 28 ], [ "juice", 31 ], @@ -9684,6 +9740,8 @@ { "type": "item_group", "id": "roof_trash", + "ammo": 20, + "magazine": 50, "items": [ [ "plastic_shopping_bag", 15 ], [ "bum_wine", 15 ], @@ -9695,6 +9753,7 @@ [ "ceramic_shard", 15 ], [ "stick", 95 ], [ "joint_roach", 5 ], + [ "fp_loyalty_card", 1 ], [ "pipe", 20 ], [ "bag_plastic", 10 ], [ "bottle_plastic", 10 ], @@ -9772,6 +9831,7 @@ [ "arm", 5 ], [ "leg", 5 ], [ "fetus", 5 ], + [ "foodperson_mask", 1 ], [ "human_brain_embalmed", 5 ], [ "many_years_old_newspaper", 2 ], [ "years_old_newspaper", 2 ], diff --git a/data/json/itemgroups/ammo.json b/data/json/itemgroups/ammo.json index d36cad5b4812d..d738a3e53660f 100644 --- a/data/json/itemgroups/ammo.json +++ b/data/json/itemgroups/ammo.json @@ -26,8 +26,10 @@ "id": "ammo_pistol_rare", "//": "Less common pistol ammo including that only used by police/paramilitary forces.", "items": [ - [ "10mm", 15 ], + [ "10mm_fmj", 15 ], + [ "45colt_jhp", 10 ], [ "38_super", 20 ], + [ "38super_fmj", 20 ], [ "44fmj", 15 ], [ "44magnum", 35 ], [ "45_super", 30 ], @@ -65,11 +67,11 @@ "id": "ammo_pistol_reloaded", "//": "Reloaded pistol ammo balanced according to rarity.", "items": [ - [ "reloaded_10mm", 10 ], + [ "reloaded_10mm_fmj", 10 ], [ "reloaded_32_acp", 50 ], [ "reloaded_38_fmj", 30 ], [ "reloaded_38_special", 80 ], - [ "reloaded_38_super", 40 ], + [ "reloaded_38super_fmj", 40 ], [ "reloaded_357mag_fmj", 30 ], [ "reloaded_357mag_jhp", 30 ], [ "reloaded_380_JHP", 10 ], @@ -86,6 +88,7 @@ [ "reloaded_45_super", 40 ], [ "reloaded_46mm", 20 ], [ "reloaded_454_Casull", 5 ], + [ "reloaded_45colt_jhp", 10 ], [ "reloaded_460_fmj", 5 ], [ "reloaded_460_rowland", 5 ], [ "reloaded_500_Magnum", 5 ], @@ -140,7 +143,7 @@ [ "22_fmj", 50 ], [ "22_lr", 100 ], [ "22_ratshot", 30 ], - [ "270", 25 ], + [ "270win_jsp", 25 ], [ "3006", 25 ], [ "308", 25 ], [ "762_54R", 10 ], @@ -199,7 +202,7 @@ [ "reloaded_223", 60 ], [ "reloaded_22_fmj", 20 ], [ "reloaded_22_lr", 70 ], - [ "reloaded_270", 15 ], + [ "reloaded_270win_jsp", 15 ], [ "reloaded_300_winmag", 15 ], [ "reloaded_3006", 70 ], [ "reloaded_3006fmj", 10 ], @@ -221,7 +224,7 @@ "type": "item_group", "id": "ammo_shotgun_common", "//": "Shotgun ammo commonly owned by citizens and found in many locations.", - "items": [ [ "shot_00", 100 ], [ "shot_bird", 70 ] ] + "items": [ [ "shot_00", 100 ], [ "shot_bird", 70 ], [ "shot_slug", 70 ], [ "410shot_000", 50 ] ] }, { "type": "item_group", @@ -232,7 +235,7 @@ [ "20x66_flare", 10 ], [ "20x66_shot", 40 ], [ "20x66_slug", 20 ], - [ "shot_slug", 100 ], + [ "shot_dragon", 10 ], [ "shot_beanbag", 20 ] ] }, @@ -255,6 +258,7 @@ "items": [ [ "reloaded_shot_00", 200 ], [ "reloaded_shot_bird", 30 ], + [ "reloaded_shot_dragon", 20 ], [ "reloaded_shot_flechette", 5 ], [ "reloaded_shot_slug", 30 ], [ "shot_scrap", 80 ] diff --git a/data/json/itemgroups/books.json b/data/json/itemgroups/books.json index 03894b512a32f..d86af7ade4118 100644 --- a/data/json/itemgroups/books.json +++ b/data/json/itemgroups/books.json @@ -53,7 +53,8 @@ [ "manual_pankration", 5 ], [ "manual_silat", 100 ], [ "manual_taekwondo", 100 ], - [ "manual_wingchun", 100 ] + [ "manual_wingchun", 100 ], + [ "manual_swordsmanship", 10 ] ] }, { @@ -571,6 +572,7 @@ [ "manual_sojutsu", 1 ], [ "manual_capoeira", 1 ], [ "manual_wingchun", 3 ], + [ "manual_swordsmanship", 3 ], { "group": "rare_martial_arts_books", "prob": 6 } ] }, diff --git a/data/json/itemgroups/clothing.json b/data/json/itemgroups/clothing.json index 39403a5378fe1..6a40e8cb2d817 100644 --- a/data/json/itemgroups/clothing.json +++ b/data/json/itemgroups/clothing.json @@ -166,7 +166,8 @@ { "item": "longshirt", "prob": 80 }, { "item": "polo_shirt", "prob": 50 }, { "item": "tshirt", "prob": 80 }, - { "item": "linuxtshirt", "prob": 10 } + { "item": "linuxtshirt", "prob": 10 }, + { "item": "tshirt_tour", "prob": 10 } ] }, { diff --git a/data/json/corpses.json b/data/json/itemgroups/corpses.json similarity index 100% rename from data/json/corpses.json rename to data/json/itemgroups/corpses.json diff --git a/data/json/itemgroups/drugs.json b/data/json/itemgroups/drugs.json index 7e9a0e4392d99..08d3a40ebc5f9 100644 --- a/data/json/itemgroups/drugs.json +++ b/data/json/itemgroups/drugs.json @@ -76,5 +76,12 @@ { "item": "smoxygen_tank", "prob": 20 }, { "item": "tramadol", "prob": 20 } ] + }, + { + "id": "jar_weed", + "type": "item_group", + "//": "For sale display appropriate packaging", + "subtype": "distribution", + "items": [ [ "jar_3l_glass", 100 ], { "item": "weed", "charges": [ 10, 420 ], "prob": 100, "container-item": "jar_3l_glass" } ] } ] diff --git a/data/json/itemgroups/food_service.json b/data/json/itemgroups/food_service.json index 4e4ec58b7fd6c..bdd6028b8b3bd 100644 --- a/data/json/itemgroups/food_service.json +++ b/data/json/itemgroups/food_service.json @@ -566,7 +566,7 @@ [ "sandwich_pb", 35 ], [ "fish_sandwich", 20 ], [ "sandwich_t", 50 ], - [ "frozen_burrito", 30 ], + [ "junk_burrito", 30 ], [ "taco", 40 ], [ "insta_salad", 60 ], [ "yoghurt", 50 ], @@ -599,6 +599,9 @@ [ "cornmeal", 50 ], [ "yeast", 40 ], [ "powder_eggs", 55 ], + [ "milk_UHT", 15 ], + [ "milk_evap", 25 ], + [ "con_milk", 25 ], [ "milk_powder", 45 ], [ "salt", 50 ], [ "soysauce", 25 ], @@ -673,7 +676,7 @@ [ "frozen_dinner", 80 ], [ "pizza_veggy", 50 ], [ "pizza_meat", 50 ], - [ "frozen_burrito", 50 ], + [ "junk_burrito", 50 ], [ "icecream_artificial", 30 ], [ "icecream_candy", 20 ] ] @@ -698,6 +701,10 @@ "entries": [ { "item": "egg_bird", "prob": 65, "count-min": 6, "count-max": 12 }, { "item": "milk", "prob": 80 }, + { "item": "milk_raw", "prob": 5 }, + { "item": "milk_raw", "prob": 5 }, + { "item": "butter", "prob": 35, "charges": 8, "container-item": "wrapper" }, + { "item": "buttermilk", "prob": 15 }, { "item": "cheese", "prob": 60 }, { "item": "yoghurt", "prob": 40 }, { "item": "pudding", "prob": 30 }, @@ -739,6 +746,8 @@ [ "water_clean", 10 ], [ "water_mineral", 10 ], [ "milk", 20 ], + { "item": "butter", "prob": 35, "charges-min": 8, "charges-max": 64, "container-item": "wrapper" }, + { "item": "ghee", "prob": 5, "charges-min": 1, "charges-max": 64, "container-item": "jar_glass" }, [ "yoghurt", 10 ], [ "pudding", 15 ], [ "apple", 10 ], @@ -795,6 +804,7 @@ [ "garlic", 10 ], [ "thyme", 10 ], [ "can_chicken", 10 ], + [ "ghee", 15 ], [ "pepper", 15 ], [ "salt", 20 ], [ "sugar", 5 ], diff --git a/data/json/itemgroups/gear.json b/data/json/itemgroups/gear.json index ff1dbad5647f8..cb27fb3fb00d8 100644 --- a/data/json/itemgroups/gear.json +++ b/data/json/itemgroups/gear.json @@ -2,6 +2,8 @@ { "type": "item_group", "id": "everyday_gear", + "ammo": 75, + "magazine": 100, "//": "Small common items carried in a person's pockets, purse, etc. Cash card at roughly 50%.", "items": [ { "item": "cash_card", "prob": 1600, "charges-min": 0, "charges-max": 50000 }, diff --git a/data/json/itemgroups/guns.json b/data/json/itemgroups/guns.json index ef8af4d741dbe..ebcbe636eaebf 100644 --- a/data/json/itemgroups/guns.json +++ b/data/json/itemgroups/guns.json @@ -16,6 +16,7 @@ { "item": "sw_610", "prob": 20, "charges-min": 0, "charges-max": 6 }, { "item": "sw_619", "prob": 25, "charges-min": 0, "charges-max": 7 }, { "item": "p226_357sig", "prob": 20, "charges-min": 0, "charges-max": 15 }, + { "item": "p320_357sig", "prob": 10, "charges-min": 0, "charges-max": 14 }, { "item": "kp32", "prob": 10, "charges-min": 0, "charges-max": 7 }, { "item": "kp3at", "prob": 35, "charges-min": 0, "charges-max": 6 }, { "item": "rugerlcp", "prob": 35, "charges-min": 0, "charges-max": 6 }, @@ -28,11 +29,14 @@ "//": "Less common pistols including those only used by police/paramilitary forces.", "items": [ { "item": "deagle_44", "prob": 35, "charges-min": 0, "charges-max": 8 }, + { "item": "m1911a1_38super", "prob": 25, "charges-min": 0, "charges-max": 10 }, { "item": "fn57", "prob": 80, "charges-min": 0, "charges-max": 20 }, { "item": "l_enforcer_45", "prob": 25, "charges-min": 0, "charges-max": 6 }, { "item": "l_lookout_9mm", "prob": 20, "charges-min": 0, "charges-max": 7 }, { "item": "l_sp_45", "prob": 35, "charges-min": 0, "charges-max": 12 }, { "item": "l_sp_9mm", "prob": 60, "charges-min": 0, "charges-max": 21 }, + { "item": "l_mp_45", "prob": 25, "charges-min": 0, "charges-max": 12 }, + { "item": "l_mp_9mm", "prob": 25, "charges-min": 0, "charges-max": 21 }, { "item": "ruger_lcr_22", "prob": 35, "charges-min": 0, "charges-max": 8 }, { "item": "ruger_redhawk", "prob": 25, "charges-min": 0, "charges-max": 6 }, { "item": "sig_40", "prob": 35, "charges-min": 0, "charges-max": 12 }, @@ -49,10 +53,8 @@ "id": "guns_pistol_milspec", "//": "Military specification pistols only ever found at military sites.", "items": [ - { "item": "glock_17", "prob": 100, "charges-min": 0, "charges-max": 17 }, + { "item": "m17", "prob": 100, "charges-min": 0, "charges-max": 17 }, { "item": "glock_18c", "prob": 70, "charges-min": 0, "charges-max": 17 }, - { "item": "l_mp_45", "prob": 70, "charges-min": 0, "charges-max": 12 }, - { "item": "l_mp_9mm", "prob": 100, "charges-min": 0, "charges-max": 21 }, { "item": "needlepistol", "prob": 45, "charges-min": 0, "charges-max": 50 }, { "item": "rm103a_pistol", "prob": 35, "charges-min": 0, "charges-max": 10 } ] @@ -155,6 +157,7 @@ { "item": "marlin_9a", "prob": 80, "charges-min": 0, "charges-max": 19 }, { "item": "mosin44", "prob": 15, "charges-min": 0, "charges-max": 5 }, { "item": "mosin91_30", "prob": 25, "charges-min": 0, "charges-max": 5 }, + { "item": "remington700_270", "prob": 50, "charges-min": 0, "charges-max": 4 }, { "item": "ruger_1022", "prob": 70, "charges-min": 0, "charges-max": 10 }, { "item": "ruger_mini", "prob": 60, "charges-min": 0, "charges-max": 5 }, { "item": "sks", "prob": 40, "charges-min": 0, "charges-max": 10 }, @@ -175,6 +178,8 @@ { "item": "l_base_223", "prob": 40, "charges-min": 0, "charges-max": 32 }, { "item": "l_car_223", "prob": 10, "charges-min": 0, "charges-max": 32 }, { "item": "l_dsr_223", "prob": 5, "charges-min": 0, "charges-max": 32 }, + { "item": "l_lmg_223", "prob": 5, "charges-min": 0, "charges-max": 32 }, + { "item": "l_mbr_223", "prob": 10, "charges-min": 0, "charges-max": 32 }, { "item": "l_long_45", "prob": 30, "charges-min": 0, "charges-max": 12 }, { "item": "m14ebr", "prob": 15, "charges-min": 0, "charges-max": 20 }, { "item": "M24", "prob": 15, "charges-min": 0, "charges-max": 20 }, @@ -196,8 +201,6 @@ "//": "Military specification rifles only ever found at military sites.", "items": [ { "item": "h&k416a5", "prob": 50, "charges-min": 0, "charges-max": 30 }, - { "item": "l_lmg_223", "prob": 30, "charges-min": 0, "charges-max": 32 }, - { "item": "l_mbr_223", "prob": 100, "charges-min": 0, "charges-max": 32 }, { "item": "m107a1", "prob": 30, "charges-min": 0, "charges-max": 10 }, { "item": "m134", "prob": 10, "charges-min": 0, "charges-max": 100 }, { "item": "m14ebr", "prob": 10, "charges-min": 0, "charges-max": 20 }, @@ -275,7 +278,9 @@ { "item": "m1014", "prob": 80, "charges-min": 0, "charges-max": 8 }, { "item": "rm120c", "prob": 30, "charges-min": 0, "charges-max": 5 }, { "item": "rm228", "prob": 30, "charges-min": 0, "charges-max": 10 }, - { "item": "saiga_12", "prob": 50, "charges-min": 0, "charges-max": 10 } + { "item": "l_def_12", "prob": 20, "charges-min": 0, "charges-max": 8 }, + { "item": "saiga_12", "prob": 50, "charges-min": 0, "charges-max": 10 }, + { "item": "saiga_410", "prob": 40, "charges-min": 0, "charges-max": 10 } ] }, { @@ -283,8 +288,8 @@ "id": "guns_shotgun_milspec", "//": "Military specification shotguns only ever found at military sites.", "items": [ - { "item": "l_def_12", "prob": 100, "charges-min": 0, "charges-max": 8 }, - { "item": "rm20", "prob": 20, "charges-min": 0, "charges-max": 20 } + { "item": "rm20", "prob": 20, "charges-min": 0, "charges-max": 20 }, + { "item": "m1014", "prob": 100, "charges-min": 0, "charges-max": 8 } ] }, { diff --git a/data/json/itemgroups/locations.json b/data/json/itemgroups/locations.json index 505b027816339..991f6b00cfe67 100644 --- a/data/json/itemgroups/locations.json +++ b/data/json/itemgroups/locations.json @@ -695,5 +695,36 @@ [ "candle", 20 ], [ "pillow", 20 ] ] + }, + { + "id": "library_elec", + "type": "item_group", + "items": [ + [ "superglue", 30 ], + [ "processor", 15 ], + [ "RAM", 22 ], + [ "power_supply", 16 ], + [ "amplifier", 8 ], + [ "transponder", 5 ], + [ "receiver", 10 ], + [ "antenna", 18 ], + [ "screwdriver", 40 ], + { "group": "ammo_pocket_batteries_full", "prob": 50 }, + [ "manual_electronics", 20 ], + [ "mobile_memory_card", 20 ], + [ "usb_drive", 5 ], + [ "software_useless", 10 ], + [ "survnote", 1 ] + ] + }, + { + "id": "laundromat_bleach", + "type": "item_group", + "items": [ [ "bleach", 50 ] ] + }, + { + "id": "laundromat_containers", + "type": "item_group", + "items": [ [ "duffelbag", 5 ], [ "backpack", 5 ], [ "bag_plastic", 30 ], [ "basket_laundry", 30 ] ] } ] diff --git a/data/json/itemgroups/magazines.json b/data/json/itemgroups/magazines.json index b37bf8521ca7a..248885bd2b6cf 100644 --- a/data/json/itemgroups/magazines.json +++ b/data/json/itemgroups/magazines.json @@ -19,10 +19,6 @@ [ "hk_g80mag", 40 ], [ "hk46mag", 15 ], [ "hk46bigmag", 5 ], - [ "lw12mag", 30 ], - [ "lw21mag", 60 ], - [ "lw223mag", 60 ], - [ "lw223bigmag", 20 ], [ "m107a1mag", 50 ], [ "m2010mag", 10 ], [ "scarhmag", 50 ], @@ -30,7 +26,8 @@ [ "stanag30", 20 ], [ "stanag50", 5 ], [ "hk417mag_20rd", 30 ], - [ "hk417mag_10rd", 20 ] + [ "hk417mag_10rd", 20 ], + [ "p320mag_17rd_9x19mm", 60 ] ] }, { @@ -108,7 +105,8 @@ [ "kp3atmag", 4 ], [ "rugerlcpmag", 10 ], [ "sw22mag", 10 ], - [ "p226mag_15rd_357sig", 25 ] + [ "p226mag_15rd_357sig", 25 ], + [ "p320mag_14rd_357sig", 10 ] ] }, { @@ -137,6 +135,7 @@ [ "glockbigmag", 60 ], [ "glock40bigmag", 30 ], [ "m1911bigmag", 40 ], + [ "m1911mag_10rd_38super", 10 ], [ "m9bigmag", 20 ], [ "sig40mag", 40 ], [ "sigp230mag", 40 ], @@ -144,7 +143,9 @@ [ "kp32mag", 5 ], [ "fn1910mag", 2 ], [ "taurus38mag", 30 ], - [ "ppkmag", 15 ] + [ "ppkmag", 15 ], + [ "lw12mag", 5 ], + [ "lw21mag", 5 ] ] }, { @@ -219,7 +220,9 @@ [ "g3mag", 80 ], [ "g3bigmag", 40 ], [ "m1918bigmag", 40 ], - [ "ruger1022bigmag", 70 ] + [ "ruger1022bigmag", 70 ], + [ "lw223mag", 20 ], + [ "lw223bigmag", 20 ] ] }, { @@ -237,8 +240,8 @@ { "type": "item_group", "id": "mags_shotgun_rare", - "//": "Aftermarket or otherwise uncommon pistol magazines excluding milspec.", - "items": [ [ "saiga10mag", 50 ], [ "saiga30mag", 10 ] ] + "//": "Aftermarket or otherwise uncommon shotgun magazines excluding milspec.", + "items": [ [ "saiga10mag", 50 ], [ "saiga30mag", 10 ], [ "saiga410mag_10rd", 30 ], [ "saiga410mag_30rd", 10 ] ] }, { "type": "item_group", diff --git a/data/json/itemgroups/mall_item_groups.json b/data/json/itemgroups/mall_item_groups.json index 4c26c86aec0b4..f664a8b62168b 100644 --- a/data/json/itemgroups/mall_item_groups.json +++ b/data/json/itemgroups/mall_item_groups.json @@ -68,6 +68,8 @@ { "id": "music_shop", "type": "item_group", + "ammo": 75, + "magazine": 100, "items": [ { "group": "ammo_any_batteries_full", "prob": 50 }, [ "radio", 30 ], [ "mp3", 30 ] ] }, { @@ -91,6 +93,8 @@ { "id": "toy_store", "type": "item_group", + "ammo": 75, + "magazine": 100, "items": [ [ "portable_game", 60 ], [ "bat", 60 ], @@ -210,6 +214,8 @@ { "id": "key_shop", "type": "item_group", + "ammo": 75, + "magazine": 100, "items": [ [ "screwdriver", 40 ], [ "hammer", 35 ], @@ -252,6 +258,8 @@ { "id": "cell_shop", "type": "item_group", + "ammo": 75, + "magazine": 100, "items": [ [ "portable_game", 20 ], [ "antenna", 25 ], @@ -269,6 +277,8 @@ { "id": "beauty", "type": "item_group", + "ammo": 75, + "magazine": 100, "items": [ [ "mag_glam", 40 ], [ "mag_beauty", 30 ], @@ -347,6 +357,7 @@ [ "naginata_fake", 5 ], [ "naginata_inferior", 3 ], [ "estoc", 2 ], + [ "estoc_inferior", 4 ], [ "estoc_fake", 6 ], [ "qiang", 3 ], [ "halberd", 2 ], diff --git a/data/json/itemgroups/mansion.json b/data/json/itemgroups/mansion.json index 64b65121c6384..de3f592a956a2 100644 --- a/data/json/itemgroups/mansion.json +++ b/data/json/itemgroups/mansion.json @@ -507,6 +507,8 @@ { "id": "toy_box", "type": "item_group", + "ammo": 75, + "magazine": 100, "subtype": "distribution", "items": [ [ "marble", 60 ], @@ -992,6 +994,8 @@ { "id": "table_livingroom", "type": "item_group", + "ammo": 75, + "magazine": 100, "subtype": "distribution", "items": [ { "group": "beer_selection", "prob": 30 }, diff --git a/data/json/itemgroups/oa_shared_item_groups.json b/data/json/itemgroups/oa_shared_item_groups.json index d43e93c211560..9b8a8ada2f8fb 100644 --- a/data/json/itemgroups/oa_shared_item_groups.json +++ b/data/json/itemgroups/oa_shared_item_groups.json @@ -16,6 +16,8 @@ { "type": "item_group", "id": "oa_custom_trash", + "ammo": 50, + "magazine": 100, "items": [ { "item": "lighter", "prob": 50, "charges-min": 0, "charges-max": 10 }, { "item": "matches", "prob": 50, "charges-min": 0, "charges-max": 20 }, diff --git a/data/json/itemgroups/supplies.json b/data/json/itemgroups/supplies.json index 2081f4a9e0005..14aed7d9ab4c5 100644 --- a/data/json/itemgroups/supplies.json +++ b/data/json/itemgroups/supplies.json @@ -76,7 +76,8 @@ { "item": "pipe", "prob": 40, "count": [ 5, 10 ] }, { "item": "wire", "prob": 40, "count": [ 5, 10 ] }, { "item": "spike", "prob": 40, "count": [ 5, 10 ] }, - { "item": "nail", "prob": 60, "count": [ 5, 20 ] } + { "item": "nail", "prob": 60, "count": [ 5, 20 ] }, + { "item": "hinge", "prob": 60, "count": [ 5, 10 ] } ] }, { diff --git a/data/json/items/ammo.json b/data/json/items/ammo.json index 08555e019e66c..870954e141548 100644 --- a/data/json/items/ammo.json +++ b/data/json/items/ammo.json @@ -8,7 +8,7 @@ "name_plural": "batteries", "symbol": "=", "color": "yellow", - "description": "Some free-floating battery charge. This can be reloaded into rechargable battery cells, but can never be unloaded.", + "description": "Some free-floating battery charge. This can be reloaded into rechargable battery cells, but can never be unloaded.", "flags": "TRADER_AVOID", "material": "iron", "effects": [ "COOKOFF" ], @@ -118,7 +118,7 @@ "category": "spare_parts", "name": "light plutonium fuel battery", "name_plural": "light plutonium fuel batteries", - "description": "This battery uses a thin plutonium-244 rod to stablize an exotic nanocompound. It is universally compatible with all kinds of personal electronic devices. Although it stores a huge amount of power, it cannot be recharged.", + "description": "This battery uses a thin plutonium-244 rod to stabilize an exotic nanocompound. It is universally compatible with all kinds of personal electronic devices. Although it stores a huge amount of power, it cannot be recharged.", "weight": 160, "volume": "115ml", "price": 50000, @@ -1372,5 +1372,22 @@ "count": 7, "effects": [ "NEVER_MISFIRES" ], "use_action": "RPGDIE" + }, + { + "id": "scrap_bronze", + "type": "AMMO", + "category": "spare_parts", + "name": "bronze", + "name_plural": "bronze", + "description": "Decent-sized chunks of bronze, for fashioning some old-school items.", + "weight": 218, + "volume": 1, + "price": 1200, + "to_hit": -2, + "bashing": 1, + "material": "bronze", + "symbol": ",", + "color": "yellow", + "ammo_type": "components" } ] diff --git a/data/json/items/ammo/10mm.json b/data/json/items/ammo/10mm.json new file mode 100644 index 0000000000000..ac2907ab00220 --- /dev/null +++ b/data/json/items/ammo/10mm.json @@ -0,0 +1,33 @@ +[ + { + "id": "10mm_fmj", + "type": "AMMO", + "name": "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, + "volume": 1, + "price": 2800, + "material": [ "brass", "powder" ], + "symbol": "=", + "color": "yellow", + "count": 40, + "stack_size": 40, + "ammo_type": "10mm", + "casing": "10mm_casing", + "range": 14, + "damage": 31, + "pierce": 4, + "dispersion": 50, + "recoil": 750, + "effects": [ "COOKOFF" ] + }, + { + "id": "reloaded_10mm_fmj", + "copy-from": "10mm_fmj", + "type": "AMMO", + "name": "reloaded 10mm Auto FMJ", + "proportional": { "price": 0.7, "damage": 0.9, "dispersion": 1.1 }, + "extend": { "effects": [ "RECYCLED" ] }, + "delete": { "effects": [ "NEVER_MISFIRES" ] } + } +] diff --git a/data/json/items/ammo/270win.json b/data/json/items/ammo/270win.json new file mode 100644 index 0000000000000..c4de323653bcb --- /dev/null +++ b/data/json/items/ammo/270win.json @@ -0,0 +1,33 @@ +[ + { + "id": "270win_jsp", + "type": "AMMO", + "name": ".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, + "volume": 1, + "price": 1700, + "material": [ "brass", "powder" ], + "symbol": "=", + "color": "yellow", + "count": 20, + "stack_size": 20, + "ammo_type": "270win", + "casing": "270win_casing", + "range": 65, + "damage": 64, + "pierce": 4, + "dispersion": 10, + "recoil": 3800, + "effects": [ "COOKOFF", "NEVER_MISFIRES" ] + }, + { + "id": "reloaded_270win_jsp", + "copy-from": "270win_jsp", + "type": "AMMO", + "name": "reloaded .270 Winchester JSP", + "proportional": { "price": 0.7, "damage": 0.9, "dispersion": 1.1 }, + "extend": { "effects": [ "RECYCLED" ] }, + "delete": { "effects": [ "NEVER_MISFIRES" ] } + } +] diff --git a/data/json/items/ammo/3006.json b/data/json/items/ammo/3006.json index db042783ea6a7..5be0fdaeecdeb 100644 --- a/data/json/items/ammo/3006.json +++ b/data/json/items/ammo/3006.json @@ -1,12 +1,12 @@ [ { - "id": "270", + "id": "3006", "type": "AMMO", - "name": ".270 Winchester", - "description": ".270 Winchester ammunition with 130gr soft point bullets. Similar to .30-06, the .270 round was a popular hunting cartridge until the mid 21st century when it was supplanted by new designs. It is a powerful round capable of taking down large targets with ease. While not advisable, it may be possible to use it in some firearms chambered for .30-06.", + "name": ".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, "volume": 1, - "price": 1700, + "price": 1200, "material": [ "brass", "powder" ], "symbol": "=", "color": "yellow", @@ -14,24 +14,13 @@ "stack_size": 20, "ammo_type": "3006", "casing": "3006_casing", - "range": 65, - "damage": 64, - "pierce": 4, - "dispersion": 10, + "range": 61, + "damage": 62, + "pierce": 10, + "dispersion": 20, "recoil": 3800, "effects": [ "COOKOFF" ] }, - { - "id": "3006", - "copy-from": "270", - "type": "AMMO", - "name": ".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.", - "price": 1200, - "count": 10, - "relative": { "range": -4, "damage": -2, "pierce": 6, "dispersion": 10 }, - "extend": { "effects": [ "NEVER_MISFIRES" ] } - }, { "id": "3006_incendiary", "copy-from": "3006", @@ -48,15 +37,6 @@ "description": "Armor piercing .30-06 M2 ammunition with 168gr FMJ bullets. It is an extremely powerful and accurate cartridge but pays for its armor penetration abilities with lowered damage.", "relative": { "damage": -4, "pierce": 8 } }, - { - "id": "reloaded_270", - "copy-from": "270", - "type": "AMMO", - "name": "reloaded .270 Winchester", - "proportional": { "price": 0.7, "damage": 0.9, "dispersion": 1.1 }, - "extend": { "effects": [ "RECYCLED" ] }, - "delete": { "effects": [ "NEVER_MISFIRES" ] } - }, { "id": "reloaded_3006", "copy-from": "3006", diff --git a/data/json/items/ammo/38.json b/data/json/items/ammo/38.json index 27c76159802c8..c7b4b74ac9209 100644 --- a/data/json/items/ammo/38.json +++ b/data/json/items/ammo/38.json @@ -71,7 +71,7 @@ "copy-from": "38_special", "type": "AMMO", "name": "blackpowder .38 Special", - "description": "This .38 Special cartridge is loaded with a 200gr cast lead hollowpoint and 23gr of blackpowder. While it's much slower than a regular .38, it has tremendous stopping power.", + "description": "This .38 Special cartridge is loaded with a 200gr cast lead hollowpoint and 23gr of blackpowder. While it's much slower than a regular .38, it has tremendous stopping power.", "proportional": { "price": 0.6, "damage": 1.15, "dispersion": 1.3 }, "extend": { "effects": [ "RECYCLED", "MUZZLE_SMOKE" ] }, "delete": { "effects": [ "NEVER_MISFIRES" ] } diff --git a/data/json/items/ammo/38super.json b/data/json/items/ammo/38super.json new file mode 100644 index 0000000000000..435c46ce8b83d --- /dev/null +++ b/data/json/items/ammo/38super.json @@ -0,0 +1,32 @@ +[ + { + "id": "38super_fmj", + "type": "AMMO", + "name": ".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, + "volume": 1, + "price": 2200, + "material": [ "brass", "powder" ], + "symbol": "=", + "color": "yellow", + "count": 40, + "stack_size": 40, + "ammo_type": "38super", + "casing": "38super_casing", + "range": 14, + "damage": 26, + "dispersion": 30, + "recoil": 250, + "effects": [ "COOKOFF" ] + }, + { + "id": "reloaded_38super_fmj", + "copy-from": "38super_fmj", + "type": "AMMO", + "name": "reloaded .38 Super FMJ", + "proportional": { "price": 0.7, "damage": 0.9, "dispersion": 1.1 }, + "extend": { "effects": [ "RECYCLED" ] }, + "delete": { "effects": [ "NEVER_MISFIRES" ] } + } +] diff --git a/data/json/items/ammo/40.json b/data/json/items/ammo/40.json index 0c85d813f5aed..24a6b43daafb0 100644 --- a/data/json/items/ammo/40.json +++ b/data/json/items/ammo/40.json @@ -1,14 +1,4 @@ [ - { - "id": "10mm", - "copy-from": "40sw", - "type": "AMMO", - "name": "10mm Auto", - "description": "10mm Auto ammunition with 180gr FMJ bullets. The 10mm Auto round is one of the most powerful pistol cartridges available, although its usefulness is limited by high recoil.", - "price": 2900, - "count": 20, - "relative": { "damage": 4, "pierce": 4, "dispersion": -10, "recoil": 20 } - }, { "id": "40fmj", "copy-from": "40sw", @@ -39,15 +29,6 @@ "recoil": 560, "effects": [ "COOKOFF" ] }, - { - "id": "reloaded_10mm", - "copy-from": "10mm", - "type": "AMMO", - "name": "reloaded 10mm Auto", - "proportional": { "price": 0.7, "damage": 0.9, "dispersion": 1.1 }, - "extend": { "effects": [ "RECYCLED" ] }, - "delete": { "effects": [ "NEVER_MISFIRES" ] } - }, { "id": "reloaded_40fmj", "copy-from": "40fmj", diff --git a/data/json/items/ammo/40mm.json b/data/json/items/ammo/40mm.json index 65729711a4eaf..0cc88375674fc 100644 --- a/data/json/items/ammo/40mm.json +++ b/data/json/items/ammo/40mm.json @@ -113,7 +113,7 @@ "copy-from": "40mm_grenade", "type": "AMMO", "name": "40mm slug", - "description": "A 40mm shell loaded with a massive bullet. Say goodbye to your shoulder, I guess.", + "description": "A 40mm shell loaded with a massive bullet. Say goodbye to your shoulder, I guess.", "damage": 130, "recoil": 875, "extend": { "effects": [ "LARGE_BEANBAG" ] } diff --git a/data/json/items/ammo/410shot.json b/data/json/items/ammo/410shot.json new file mode 100644 index 0000000000000..48db037f192c9 --- /dev/null +++ b/data/json/items/ammo/410shot.json @@ -0,0 +1,32 @@ +[ + { + "id": "410shot_000", + "type": "AMMO", + "name": ".410 000 shot", + "description": "A .410 shell with 5 000 pellets. Good for a hunting or combat load.", + "weight": 32, + "volume": 1, + "price": 3500, + "material": [ "plastic", "powder" ], + "symbol": "=", + "color": "red", + "count": 20, + "stack_size": 20, + "ammo_type": "410shot", + "casing": "410shot_hull", + "range": 12, + "damage": 50, + "recoil": 2500, + "loudness": 160, + "effects": [ "COOKOFF", "SHOT" ] + }, + { + "id": "reloaded_410shot_000", + "copy-from": "410shot_000", + "type": "AMMO", + "name": "reloaded .410 000 shot", + "proportional": { "price": 0.7, "damage": 0.9, "dispersion": 1.1 }, + "extend": { "effects": [ "RECYCLED" ] }, + "delete": { "effects": [ "NEVER_MISFIRES" ] } + } +] diff --git a/data/json/items/ammo/45colt.json b/data/json/items/ammo/45colt.json new file mode 100644 index 0000000000000..043099c233803 --- /dev/null +++ b/data/json/items/ammo/45colt.json @@ -0,0 +1,33 @@ +[ + { + "id": "45colt_jhp", + "type": "AMMO", + "name": ".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, + "volume": 1, + "price": 2200, + "material": [ "brass", "powder" ], + "symbol": "=", + "color": "yellow", + "count": 40, + "stack_size": 40, + "ammo_type": "45colt", + "casing": "45colt_casing", + "range": 16, + "damage": 25, + "pierce": 2, + "dispersion": 50, + "recoil": 600, + "effects": [ "COOKOFF" ] + }, + { + "id": "reloaded_45colt_jhp", + "copy-from": "45colt_jhp", + "type": "AMMO", + "name": "reloaded .45 Colt JHP", + "proportional": { "price": 0.7, "damage": 0.9, "dispersion": 1.1 }, + "extend": { "effects": [ "RECYCLED" ] }, + "delete": { "effects": [ "NEVER_MISFIRES" ] } + } +] diff --git a/data/json/items/ammo/shot.json b/data/json/items/ammo/shot.json index 7c5a43281e7ac..c0257831c9f28 100644 --- a/data/json/items/ammo/shot.json +++ b/data/json/items/ammo/shot.json @@ -8,6 +8,15 @@ "extend": { "effects": [ "RECYCLED" ] }, "delete": { "effects": [ "NEVER_MISFIRES" ] } }, + { + "id": "reloaded_shot_dragon", + "copy-from": "shot_dragon", + "type": "AMMO", + "name": "reloaded dragon's breath shell", + "proportional": { "price": 0.7, "damage": 0.9, "dispersion": 1.1 }, + "extend": { "effects": [ "RECYCLED" ] }, + "delete": { "effects": [ "NEVER_MISFIRES" ] } + }, { "id": "reloaded_shot_00", "copy-from": "shot_00", @@ -112,6 +121,16 @@ "proportional": { "damage": 0.3, "recoil": 0.6, "loudness": 0.8 }, "extend": { "effects": [ "NOGIB" ] } }, + { + "id": "shot_dragon", + "copy-from": "shot_00", + "type": "AMMO", + "name": "dragon's breath shell", + "description": "A shotgun shell filled with magnesium pellets or shards, used mostly as a distress flare or pyrotechnics tool. When the round is fired, high temperature sparks and flames shoot out of the barrel, igniting everything in their path.", + "price": 14000, + "proportional": { "damage": 0.2, "recoil": 0.6, "loudness": 0.8, "dispersion": 1.2, "range": 0.5 }, + "extend": { "effects": [ "INCENDIARY", "STREAM", "NOGIB" ] } + }, { "id": "shot_flechette", "copy-from": "shot_00", diff --git a/data/json/items/ammo_types.json b/data/json/items/ammo_types.json index e9913d9948be9..eff6a40f2eb1a 100644 --- a/data/json/items/ammo_types.json +++ b/data/json/items/ammo_types.json @@ -65,6 +65,12 @@ "name": "shot", "default": "shot_00" }, + { + "type": "ammunition_type", + "id": "410shot", + "name": ".410 shot", + "default": "410shot_000" + }, { "type": "ammunition_type", "id": "blunderbuss", @@ -113,12 +119,24 @@ "name": ".38", "default": "38_special" }, + { + "type": "ammunition_type", + "id": "38super", + "name": ".38 Super", + "default": "38super_fmj" + }, { "type": "ammunition_type", "id": "40", "name": ".40", "default": "40sw" }, + { + "type": "ammunition_type", + "id": "10mm", + "name": "10mm Auto", + "default": "10mm_fmj" + }, { "type": "ammunition_type", "id": "44", @@ -143,6 +161,12 @@ "name": ".454", "default": "454_Casull" }, + { + "type": "ammunition_type", + "id": "45colt", + "name": ".45 Colt", + "default": "45colt_jhp" + }, { "type": "ammunition_type", "id": "500", @@ -183,7 +207,13 @@ "type": "ammunition_type", "id": "3006", "name": ".30-06", - "default": "270" + "default": "3006" + }, + { + "type": "ammunition_type", + "id": "270win", + "name": ".270 Winchester", + "default": "270win_jsp" }, { "type": "ammunition_type", diff --git a/data/json/items/armor.json b/data/json/items/armor.json index c54f37e68bf53..e8ff67556caee 100644 --- a/data/json/items/armor.json +++ b/data/json/items/armor.json @@ -291,7 +291,7 @@ "encumbrance": 20, "warmth": 20, "material_thickness": 4, - "flags": [ "VARSIZE", "OUTER", "STURDY", "BLOCK_WHILE_WORN" ] + "flags": [ "VARSIZE", "BELTED", "STURDY", "BLOCK_WHILE_WORN" ] }, { "id": "armguard_metal", @@ -336,6 +336,29 @@ "material_thickness": 3, "flags": [ "BELTED", "BLOCK_WHILE_WORN" ] }, + { + "id": "armguard_scrap", + "type": "ARMOR", + "category": "armor", + "name": "pair of scrap arm guards", + "name_plural": "pairs of scrap arm guards", + "description": "A pair of arm guards made from scraps of metal secured by simple strings; the loose collection of plates provides decent but not the most convenient protection.", + "weight": 3064, + "volume": 19, + "price": 20000, + "to_hit": 1, + "bashing": 1, + "cutting": 1, + "material": [ "steel", "iron" ], + "symbol": "[", + "color": "light_gray", + "covers": [ "ARMS" ], + "coverage": 80, + "encumbrance": 18, + "warmth": 20, + "material_thickness": 2, + "flags": [ "BELTED", "BLOCK_WHILE_WORN" ] + }, { "id": "armguard_soft", "type": "ARMOR", @@ -698,7 +721,7 @@ "description": "A suit of armor made from scraps of metal secured by simple strings; the loose collection of plates provides decent but not the most convenient protection.", "weight": 9534, "volume": 62, - "price": 70000, + "price": 60000, "to_hit": -5, "bashing": 6, "cutting": 8, @@ -706,7 +729,7 @@ "symbol": "[", "color": "light_gray", "covers": [ "TORSO", "LEGS", "ARMS" ], - "coverage": 90, + "coverage": 80, "encumbrance": 18, "warmth": 20, "material_thickness": 2, @@ -868,6 +891,15 @@ "weight": 10, "description": "A plastic name tag marking the wearer as a real doctor of the medical kind." }, + { + "id": "badge_foodkid", + "copy-from": "badge_abstract", + "type": "ARMOR", + "name": "Foodkid badge", + "material": [ "plastic" ], + "weight": 10, + "description": "A star shaped badge, on it you can read \"Foodkid\" in bold letters. This is Foodperson's trusty sidekick's badge." + }, { "id": "balclava", "type": "ARMOR", @@ -1610,6 +1642,25 @@ "material_thickness": 1, "flags": [ "VARSIZE", "SKINTIGHT" ] }, + { + "id": "cape_fp", + "type": "ARMOR", + "name": "Foodperson's cape", + "description": "A brightly-colored cape emblazoned with the \"Fp\" symbol.", + "weight": 900, + "volume": 12, + "price": 5000, + "to_hit": -1, + "material": [ "cotton" ], + "symbol": "]", + "color": "pink", + "covers": [ "TORSO" ], + "coverage": 50, + "encumbrance": 4, + "warmth": 10, + "material_thickness": 1, + "flags": [ "OVERSIZE", "BELTED" ] + }, { "id": "cassock", "type": "ARMOR", @@ -1768,6 +1819,27 @@ "material_thickness": 3, "flags": [ "OUTER" ] }, + { + "id": "chestguard_hard", + "type": "ARMOR", + "category": "armor", + "name": "hard chest guard", + "description": "A plastron of interlocking plastic plate protecting your torso.", + "weight": 1000, + "volume": 28, + "price": 60000, + "to_hit": -2, + "material": [ "plastic", "neoprene" ], + "symbol": "H", + "color": "dark_gray", + "covers": [ "TORSO" ], + "coverage": 90, + "encumbrance": 20, + "warmth": 20, + "material_thickness": 3, + "environmental_protection": 1, + "flags": [ "WATER_FRIENDLY", "STURDY", "OUTER" ] + }, { "id": "chestwrap", "type": "ARMOR", @@ -2270,6 +2342,29 @@ "material_thickness": 4, "flags": [ "VARSIZE", "OUTER", "STURDY" ] }, + { + "id": "cuirass_scrap", + "type": "ARMOR", + "category": "armor", + "name": "scrap cuirass", + "name_plural": "scrap cuirasses", + "description": "A cuirass made from scraps of metal secured by simple strings; the loose collection of plates provides decent but not the most convenient protection.", + "weight": 3366, + "volume": 23, + "price": 20000, + "to_hit": -1, + "bashing": 2, + "cutting": 3, + "material": [ "steel", "iron" ], + "symbol": "[", + "color": "light_gray", + "covers": [ "TORSO" ], + "coverage": 80, + "encumbrance": 18, + "warmth": 20, + "material_thickness": 2, + "flags": [ "OUTER" ] + }, { "id": "depowered_armor", "type": "ARMOR", @@ -3756,6 +3851,28 @@ "environmental_protection": 5, "flags": [ "WATERPROOF", "STURDY" ] }, + { + "id": "gloves_cut_resistant", + "type": "ARMOR", + "name": "pair of cut resistant gloves", + "name_plural": "pairs of cut resistant gloves", + "description": "A pair of cut resistant gloves, useful when rapidly breaking down carcasses.", + "weight": 240, + "volume": 1, + "price": 9000, + "to_hit": 2, + "material": [ "steel", "cotton" ], + "symbol": "[", + "color": "light_gray", + "looks_like": "gloves_work", + "covers": [ "HANDS" ], + "coverage": 95, + "encumbrance": 40, + "warmth": 10, + "material_thickness": 4, + "environmental_protection": 1, + "flags": [ "STURDY" ] + }, { "id": "gloves_wraps", "type": "ARMOR", @@ -4807,6 +4924,28 @@ "environmental_protection": 7, "flags": [ "VARSIZE", "STURDY", "WATERPROOF", "SUN_GLASSES" ] }, + { + "id": "helmet_scrap", + "type": "ARMOR", + "category": "armor", + "name": "scrap helmet", + "description": "A helmet made from scraps of metal secured by simple strings; the loose collection of plates provides decent but not the most convenient protection.", + "weight": 1692, + "volume": 11, + "price": 35000, + "to_hit": -1, + "bashing": 1, + "cutting": 2, + "material": [ "steel", "iron" ], + "symbol": "[", + "color": "light_gray", + "covers": [ "HEAD", "EYES", "MOUTH" ], + "coverage": 80, + "encumbrance": 35, + "warmth": 20, + "material_thickness": 2, + "flags": [ "OUTER" ] + }, { "id": "helmet_skid", "type": "ARMOR", @@ -5319,6 +5458,12 @@ "storage": 3, "warmth": 30, "material_thickness": 3, + "snippet_category": [ + { + "id": "patched", + "text": "A jacket made from denim. Provides decent protection from cuts. This one is haphazardly covered with patches featuring metal band logos." + } + ], "flags": [ "VARSIZE", "POCKETS", "OUTER" ] }, { @@ -5865,7 +6010,7 @@ "id": "yukata", "type": "ARMOR", "name": "yukata", - "description": "An easy to wear, breezy robe secured with a sash. Essentially Japanese pajamas. Great for summer nights.", + "description": "An easy to wear, breezy robe secured with a sash. Essentially Japanese pajamas. Great for summer nights.", "weight": 900, "volume": 12, "price": 5000, @@ -5885,7 +6030,7 @@ "id": "haori", "type": "ARMOR", "name": "haori", - "description": "A loose coat with wide sleeves that is worn unfastened over a kimono. It is jet black with sparse, tasteful golden embroidery.", + "description": "A loose coat with wide sleeves that is worn unfastened over a kimono. It is jet black with sparse, tasteful golden embroidery.", "weight": 800, "volume": 8, "price": 30000, @@ -6211,7 +6356,7 @@ "encumbrance": 20, "warmth": 20, "material_thickness": 4, - "flags": [ "VARSIZE", "OUTER", "STURDY" ] + "flags": [ "VARSIZE", "BELTED", "STURDY" ] }, { "id": "legguard_metal", @@ -6254,6 +6399,29 @@ "material_thickness": 3, "flags": [ "BELTED" ] }, + { + "id": "legguard_scrap", + "type": "ARMOR", + "category": "armor", + "name": "pair of scrap leg guards", + "name_plural": "pairs of scrap leg guards", + "description": "A pair of leg guards made from scraps of metal secured by simple strings; the loose collection of plates provides decent but not the most convenient protection.", + "weight": 3104, + "volume": 20, + "price": 20000, + "to_hit": -1, + "bashing": 1, + "cutting": 1, + "material": [ "steel", "iron" ], + "symbol": "[", + "color": "light_gray", + "covers": [ "LEGS" ], + "coverage": 80, + "encumbrance": 18, + "warmth": 20, + "material_thickness": 2, + "flags": [ "BELTED" ] + }, { "id": "legrig", "type": "ARMOR", @@ -9498,6 +9666,50 @@ ], "flags": [ "VARSIZE" ] }, + { + "id": "tshirt_tour", + "type": "ARMOR", + "copy-from": "tshirt", + "name": "tour t-shirt", + "description": "A short-sleeved cotton shirt.", + "price": 1000, + "price_postapoc": 1200, + "color": "dark_gray", + "snippet_category": [ + { + "id": "death", + "text": "A short-sleeved cotton shirt with a death metal band's spidery, indecipherable logo printed on the front." + }, + { + "id": "power", + "text": "A short-sleeved cotton shirt with a muscle-bound, long-haired man printed on the front. He is riding a red dragon and wielding a flaming sword with malicious glee." + }, + { + "id": "thrash", + "text": "A short-sleeved cotton shirt with a gore-spattered, guitar-playing zombie printed on the front. It's rather tasteless in light of current events." + }, + { + "id": "prog", + "text": "A short-sleeved cotton shirt with a pattern of complex geometric shapes and transcendental imagery printed on the front." + }, + { + "id": "mohawk", + "text": "A short-sleeved cotton shirt with an image of a woman's face in portrait printed on the front. She is wearing a large blue mohawk, her face is set in a snarl." + }, + { + "id": "nuwave", + "text": "A short-sleeved black cotton shirt with a stylised representation of a radio wave printed on the front." + }, + { + "id": "an_punk", + "text": "A short-sleeved cotton shirt, it's front showing an image of an upside-down American flag covered in anarchist graffiti, its edges frayed and burned." + }, + { + "id": "mil_punk", + "text": "A short-sleeved cotton shirt with an AK-47 on the front. It is held up by a clenched fist around its forestock, the fingers covered in crude looking tattoos." + } + ] + }, { "id": "tunic", "type": "ARMOR", @@ -10304,6 +10516,70 @@ "techniques": [ "WBLOCK_1" ], "flags": [ "OVERSIZE" ] }, + { + "id": "helmet_corinthian", + "type": "ARMOR", + "category": "armor", + "name": "Corinthian helm", + "description": "An ancient Greek bronze helmet that provides excellent protection for the head, with slits for the eyes and mouth.", + "weight": 1310, + "volume": 10, + "price": 30000, + "bashing": 10, + "material": [ "bronze" ], + "symbol": "[", + "color": "yellow", + "covers": [ "HEAD", "EYES", "MOUTH" ], + "coverage": 90, + "encumbrance": 30, + "warmth": 10, + "material_thickness": 3, + "techniques": [ "WBLOCK_1" ], + "flags": [ "VARSIZE", "STURDY" ] + }, + { + "id": "armor_cuirass", + "type": "ARMOR", + "name": "bell cuirass", + "category": "armor", + "name_plural": "bell cuirasses", + "description": "An ancient Greek breastplate, made of bronze.", + "weight": 5896, + "volume": 24, + "price": 50000, + "to_hit": -5, + "bashing": 6, + "material": [ "bronze" ], + "symbol": "[", + "color": "yellow", + "covers": [ "TORSO" ], + "coverage": 90, + "encumbrance": 15, + "warmth": 15, + "material_thickness": 3, + "flags": [ "VARSIZE", "OUTER", "STURDY" ] + }, + { + "id": "legguard_bronze", + "type": "ARMOR", + "category": "armor", + "name": "pair of bronze greaves", + "name_plural": "pairs of bronze greaves", + "description": "A pair of bronze leg guards with a simple leather lining.", + "weight": 2520, + "volume": 22, + "price": 40000, + "to_hit": 1, + "material": [ "bronze", "leather" ], + "symbol": "[", + "color": "yellow", + "covers": [ "LEGS" ], + "coverage": 70, + "encumbrance": 10, + "warmth": 15, + "material_thickness": 4, + "flags": [ "BELTED", "STURDY" ] + }, { "id": "tarp", "type": "ARMOR", diff --git a/data/json/items/armor/boots.json b/data/json/items/armor/boots.json index 352581bf84d41..4706e71f17108 100644 --- a/data/json/items/armor/boots.json +++ b/data/json/items/armor/boots.json @@ -345,6 +345,28 @@ "environmental_protection": 12, "flags": [ "WATERPROOF" ] }, + { + "id": "boots_scrap", + "type": "ARMOR", + "category": "armor", + "name": "pair of scrap boots", + "name_plural": "pairs of scrap boots", + "description": "Boots made of random scraps.", + "weight": 1845, + "volume": 12, + "price": 12000, + "to_hit": -1, + "bashing": 4, + "material": [ "steel", "iron" ], + "symbol": "[", + "color": "light_gray", + "covers": [ "FEET" ], + "coverage": 80, + "encumbrance": 20, + "warmth": 20, + "material_thickness": 2, + "flags": [ "VARSIZE", "WATERPROOF" ] + }, { "id": "boots_steel", "type": "ARMOR", diff --git a/data/json/items/armor/holster.json b/data/json/items/armor/holster.json index c1a62dbab6489..0d78289c66f3d 100644 --- a/data/json/items/armor/holster.json +++ b/data/json/items/armor/holster.json @@ -86,7 +86,7 @@ "copy-from": "holster", "type": "ARMOR", "name": "deep concealment holster", - "description": "An elastic band with numerous provisions for concealing a very small pistol close to the body. It is awkward to use without practice. Activate to holster/draw a gun.", + "description": "An elastic band with numerous provisions for concealing a very small pistol close to the body. It is awkward to use without practice. Activate to holster/draw a gun.", "weight": 120, "volume": 1, "price": 3000, diff --git a/data/json/items/armor/pets_horse_armor.json b/data/json/items/armor/pets_horse_armor.json index 78906f7ae7548..4f85938b8ff06 100644 --- a/data/json/items/armor/pets_horse_armor.json +++ b/data/json/items/armor/pets_horse_armor.json @@ -1,26 +1,147 @@ -{ - "id": "saddlebag", - "type": "ARMOR", - "name": "saddle bags", - "description": "A pair of covered pouches laid across the back of a horse behind the saddle.", - "weight": 1000, - "volume": 30, - "price": 15000, - "material": [ - "leather" - ], - "symbol": "[", - "color": "green", - "covers": [ - "HANDS" - ], - "coverage": 50, - "encumbrance": 30, - "storage": 120, - "warmth": 10, - "material_thickness": 2, - "flags": [ - "BELTED", - "WATER_FRIENDLY" - ] -} +[ + { + "type": "PET_ARMOR", + "id": "kevlar_armor_horse", + "symbol": "[", + "color": "yellow", + "name": "Kevlar-lined horse peto", + "description": "A heavy mattress-like armor of cloth, leather and thick linings of Kevlar, originally used as protection in bullfighting. You could put this on a friendly horse.", + "price": 50000, + "price_postapoc": 5000, + "material": [ "kevlar" ], + "weight": 30000, + "volume": 600, + "bashing": 10, + "to_hit": -3, + "flags": [ "IS_PET_ARMOR", "NO_SALVAGE" ], + "material_thickness": 2, + "max_pet_vol": "1000000 ml", + "min_pet_vol": "380000 ml", + "pet_bodytype": "horse" + }, + { + "type": "PET_ARMOR", + "id": "acidchitin_armor_horse", + "copy-from": "kevlar_armor_horse", + "color": "green", + "name": "biosilicified chitin horse body armor", + "description": "A makeshift assembly of criniere, peytral and croupiere made from biosilicified chitin fitted to a thin mesh. You could put this on a friendly horse.", + "proportional": { "price": 1.67, "price_postapoc": 1.67, "weight": 1.15 }, + "relative": { "environmental_protection": 7 }, + "material": [ "acidchitin" ] + }, + { + "type": "PET_ARMOR", + "id": "chitin_armor_horse", + "copy-from": "acidchitin_armor_horse", + "name": "chitin horse body armor", + "description": "A makeshift assembly of criniere, peytral and croupiere made from chitin fitted to a thin mesh. You could put this on a friendly horse.", + "relative": { "price": -15000, "price_postapoc": -1500, "environmental_protection": -3 }, + "material": [ "chitin" ] + }, + { + "type": "PET_ARMOR", + "id": "chainmail_armor_horse", + "copy-from": "kevlar_armor_horse", + "color": "light_red", + "name": "chainmail horse coat", + "description": "A heavy covering of chainmail, suitably made for horses as protection. You could put this on a friendly horse.", + "proportional": { "price": 0.83, "price_postapoc": 0.83, "weight": 1.3 }, + "relative": { "material_thickness": -2 }, + "material": [ "iron", "budget_steel" ] + }, + { + "type": "PET_ARMOR", + "id": "leather_armor_horse", + "copy-from": "kevlar_armor_horse", + "color": "brown", + "name": "boiled leather horse barding with caparison", + "description": "A full barding for horses consisting of boiled leather and cloth undercovering. This caparison is depicting a battle between a monstrous dragon and regal griffin. You could put this on a friendly horse.", + "proportional": { "price": 0.58, "price_postapoc": 0.58, "weight": 0.5 }, + "material": [ "cotton", "leather" ], + "snippet_category": [ + { + "id": "battle", + "text": "A full barding for horses consisting of boiled leather and cloth undercovering. This caparison is depicting a battle between a monstrous dragon and regal griffin. You could put this on a friendly horse." + }, + { + "id": "ancientdragon", + "text": "A full barding for horses consisting of boiled leather and cloth undercovering. This caparison is depicting a red dragon breathing fire on cities. You could put this on a friendly horse." + }, + { + "id": "criticalbear", + "text": "A full barding for horses consisting of boiled leather and cloth undercovering. This caparison is depicting a bear on its hind legs and forelegs outstretched in a menacing manner. You could put this on a friendly horse." + }, + { + "id": "orange", + "text": "A full barding for horses consisting of boiled leather and cloth undercovering. This caparison is depicting an assortment of fruits and vegetables with a very large orange featured in the foreground. You could put this on a friendly horse." + }, + { + "id": "vulture", + "text": "A full barding for horses consisting of boiled leather and cloth undercovering. This caparison is depicting a massive vulture perched on a mountain. You could put this on a friendly horse." + }, + { + "id": "direboar", + "text": "A full barding for horses consisting of boiled leather and cloth undercovering. This caparison is depicting the mythical Erymanthian boar in various artistic forms. You could put this on a friendly horse." + }, + { + "id": "rycon", + "text": "A full barding for horses consisting of boiled leather and cloth undercovering. This caparison seems to be sponsored by Rycon Construction, with a tag line of \"From down under to your home, we play all the roles from start to finish!\". You could put this on a friendly horse." + }, + { + "id": "coregentech", + "text": "A full barding for horses consisting of boiled leather and cloth undercovering. This caparison seems to be sponsored by Core Generator Tech, with a tag line of \"Providing power solutions from culinary to graphic design, we have the magic touch for your problems!\". You could put this on a friendly horse." + } + ] + }, + { + "type": "PET_ARMOR", + "id": "leatherbone_armor_horse", + "copy-from": "leather_armor_horse", + "name": "boiled leather horse barding with bones", + "description": "Decorative bones affixed to leather horse barding to invoke fear in bandits and raiders and traders all! You could put this on a friendly horse.", + "relative": { "price": 1500, "price_postapoc": 150, "weight": 500 }, + "material": [ "bone", "leather" ] + }, + { + "type": "PET_ARMOR", + "id": "rubber_armor_horse", + "copy-from": "kevlar_armor_horse", + "color": "dark_gray", + "name": "horse rain sheet", + "description": "A thin plastic covering adapted for horses to protect from acid rain and other caustic sources. You could put this on a friendly horse.", + "proportional": { "price": 0.34, "price_postapoc": 0.34, "min_pet_vol": 0.6, "weight": 0.45 }, + "relative": { "environmental_protection": 10, "material_thickness": -2 }, + "material": [ "neoprene", "plastic" ] + }, + { + "type": "PET_ARMOR", + "id": "superalloy_armor_horse", + "copy-from": "kevlar_armor_horse", + "color": "light_cyan", + "name": "superalloy crafted horse barding", + "description": "The latest fashion statement and protection for polo equestrians and ahistorical reenactor steeds alike, designed and manufactured by Land Dwarf Industries. You could put this on a friendly horse.", + "proportional": { "price": 100, "price_postapoc": 100, "min_pet_vol": 0.72, "weight": 0.72 }, + "relative": { "environmental_protection": 10, "storage": 32 }, + "material": [ "superalloy" ] + }, + { + "id": "saddlebag", + "type": "ARMOR", + "name": "saddle bags", + "description": "A pair of covered pouches laid across the back of a horse behind the saddle.", + "weight": 1000, + "volume": 30, + "price": 15000, + "material": [ "leather" ], + "symbol": "[", + "color": "green", + "covers": [ "HANDS" ], + "coverage": 50, + "encumbrance": 30, + "storage": 120, + "warmth": 10, + "material_thickness": 2, + "flags": [ "BELTED", "WATER_FRIENDLY" ] + } +] diff --git a/data/json/items/bionics.json b/data/json/items/bionics.json index 7ac94fc3ee069..816c69c3c56ce 100644 --- a/data/json/items/bionics.json +++ b/data/json/items/bionics.json @@ -142,7 +142,7 @@ "copy-from": "bionic_general", "type": "BIONIC_ITEM", "name": "Shotgun Arm CBM", - "description": "Concealed in your left arm is a surgically integrated one-shot sawn-off shotgun barrel, that pops-up upon activation. Perfect in a pinch.", + "description": "Concealed in your left arm is a surgically integrated one-shot sawn-off shotgun barrel, that pops-up upon activation. Perfect in a pinch.", "price": 220000, "difficulty": 3 }, diff --git a/data/json/items/book/electronics.json b/data/json/items/book/electronics.json index bc6eee5ed79de..9b016210e7b99 100644 --- a/data/json/items/book/electronics.json +++ b/data/json/items/book/electronics.json @@ -231,7 +231,7 @@ "type": "BOOK", "name": "nurse bot schematics", "name_plural": "nurse bot schematics", - "description": "Bearing the logo of Uncanny, those are assembly plans, design specs, and technical drawings for the nurse bot. Most of this is useless to you, but you could use the assembly plans to re-assemble the robot from salvaged parts.", + "description": "Bearing the logo of Uncanny, those are assembly plans, design specs, and technical drawings for the nurse bot. Most of this is useless to you, but you could use the assembly plans to re-assemble the robot from salvaged parts.", "copy-from": "schematics_generic" }, { @@ -239,7 +239,7 @@ "type": "BOOK", "name": "police bot schematics", "name_plural": "police bot schematics", - "description": "Assembly plans, design specs, and technical drawings for the police bot. Most of this is useless to you, but you could use the assembly plans to re-assemble the robot from salvaged parts.", + "description": "Assembly plans, design specs, and technical drawings for the police bot. Most of this is useless to you, but you could use the assembly plans to re-assemble the robot from salvaged parts.", "copy-from": "schematics_generic" }, { @@ -247,7 +247,7 @@ "type": "BOOK", "name": "eyebot schematics", "name_plural": "eyebot schematics", - "description": "Assembly plans, design specs, and technical drawings for the eyebot. Most of this is useless to you, but you could use the assembly plans to re-assemble the robot from salvaged parts.", + "description": "Assembly plans, design specs, and technical drawings for the eyebot. Most of this is useless to you, but you could use the assembly plans to re-assemble the robot from salvaged parts.", "copy-from": "schematics_generic" }, { @@ -255,7 +255,7 @@ "type": "BOOK", "name": "security bot schematics", "name_plural": "security bot schematics", - "description": "Assembly plans, design specs, and technical drawings for the security bot. Most of this is useless to you, but you could use the assembly plans to re-assemble the robot from salvaged parts.", + "description": "Assembly plans, design specs, and technical drawings for the security bot. Most of this is useless to you, but you could use the assembly plans to re-assemble the robot from salvaged parts.", "copy-from": "schematics_generic" }, { @@ -263,7 +263,7 @@ "type": "BOOK", "name": "skitterbot schematics", "name_plural": "skitterbot schematics", - "description": "Assembly plans, design specs, and technical drawings for the skitterbot. Most of this is useless to you, but you could use the assembly plans to re-assemble the robot from salvaged parts.", + "description": "Assembly plans, design specs, and technical drawings for the skitterbot. Most of this is useless to you, but you could use the assembly plans to re-assemble the robot from salvaged parts.", "copy-from": "schematics_generic" }, { @@ -271,7 +271,7 @@ "type": "BOOK", "name": "chicken walker schematics", "name_plural": "chicken walker schematics", - "description": "Bearing the logo of Northrop, those are assembly plans, design specs, and technical drawings for the chicken walker. Most of this is useless to you, but you could use the assembly plans to re-assemble the robot from salvaged parts.", + "description": "Bearing the logo of Northrop, those are assembly plans, design specs, and technical drawings for the chicken walker. Most of this is useless to you, but you could use the assembly plans to re-assemble the robot from salvaged parts.", "copy-from": "schematics_generic" }, { @@ -279,7 +279,7 @@ "type": "BOOK", "name": "cleaner bot schematics", "name_plural": "cleaner bot schematics", - "description": "Assembly plans, design specs, and technical drawings for the cleaner bot. Most of this is useless to you, but you could use the assembly plans to re-assemble the robot from salvaged parts.", + "description": "Assembly plans, design specs, and technical drawings for the cleaner bot. Most of this is useless to you, but you could use the assembly plans to re-assemble the robot from salvaged parts.", "copy-from": "schematics_generic" }, { @@ -287,7 +287,7 @@ "type": "BOOK", "name": "miner bot schematics", "name_plural": "miner bot schematics", - "description": "Assembly plans, design specs, and technical drawings for the miner bot. Most of this is useless to you, but you could use the assembly plans to re-assemble the robot from salvaged parts.", + "description": "Assembly plans, design specs, and technical drawings for the miner bot. Most of this is useless to you, but you could use the assembly plans to re-assemble the robot from salvaged parts.", "copy-from": "schematics_generic" }, { @@ -295,7 +295,7 @@ "type": "BOOK", "name": "riot control bot schematics", "name_plural": "riot control bot schematics", - "description": "Assembly plans, design specs, and technical drawings for the riot control bot. Most of this is useless to you, but you could use the assembly plans to re-assemble the robot from salvaged parts.", + "description": "Assembly plans, design specs, and technical drawings for the riot control bot. Most of this is useless to you, but you could use the assembly plans to re-assemble the robot from salvaged parts.", "copy-from": "schematics_generic" }, { @@ -303,7 +303,7 @@ "type": "BOOK", "name": "lab defense bot schematics", "name_plural": "lab defense bot schematics", - "description": "Assembly plans, design specs, and technical drawings for the lab defense bot. Most of this is useless to you, but you could use the assembly plans to re-assemble the robot from salvaged parts.", + "description": "Assembly plans, design specs, and technical drawings for the lab defense bot. Most of this is useless to you, but you could use the assembly plans to re-assemble the robot from salvaged parts.", "copy-from": "schematics_generic" }, { @@ -311,7 +311,7 @@ "type": "BOOK", "name": "tank drone schematics", "name_plural": "tank drone schematics", - "description": "Bearing the logo of Northrop, those are assembly plans, design specs, and technical drawings for the tank drone. Most of this is useless to you, but you could use the assembly plans to re-assemble the robot from salvaged parts.", + "description": "Bearing the logo of Northrop, those are assembly plans, design specs, and technical drawings for the tank drone. Most of this is useless to you, but you could use the assembly plans to re-assemble the robot from salvaged parts.", "copy-from": "schematics_generic" }, { @@ -319,7 +319,7 @@ "type": "BOOK", "name": "tripod schematics", "name_plural": "tripod schematics", - "description": "Bearing the logo of Honda, those are assembly plans, design specs, and technical drawings for the tripod. Most of this is useless to you, but you could use the assembly plans to re-assemble the robot from salvaged parts.", + "description": "Bearing the logo of Honda, those are assembly plans, design specs, and technical drawings for the tripod. Most of this is useless to you, but you could use the assembly plans to re-assemble the robot from salvaged parts.", "copy-from": "schematics_generic" }, { @@ -327,7 +327,7 @@ "type": "BOOK", "name": "dispatch schematics", "name_plural": "dispatch schematics", - "description": "Bearing the logo of Northrop, those are assembly plans, design specs, and technical drawings for the dispatch. Most of this is useless to you, but you could use the assembly plans to re-assemble the robot from salvaged parts.", + "description": "Bearing the logo of Northrop, those are assembly plans, design specs, and technical drawings for the dispatch. Most of this is useless to you, but you could use the assembly plans to re-assemble the robot from salvaged parts.", "copy-from": "schematics_generic" }, { @@ -335,7 +335,7 @@ "type": "BOOK", "name": "military dispatch schematics", "name_plural": "military dispatch schematics", - "description": "Bearing the logo of Northrop, those are assembly plans, design specs, and technical drawings for the military dispatch. Most of this is useless to you, but you could use the assembly plans to re-assemble the robot from salvaged parts.", + "description": "Bearing the logo of Northrop, those are assembly plans, design specs, and technical drawings for the military dispatch. Most of this is useless to you, but you could use the assembly plans to re-assemble the robot from salvaged parts.", "copy-from": "schematics_generic" }, { @@ -343,7 +343,7 @@ "type": "BOOK", "name": "anti-materiel turret schematics", "name_plural": "anti-materiel turret schematics", - "description": "Assembly plans, design specs, and technical drawings for the anti-materiel turret. Most of this is useless to you, but you could use the assembly plans to re-assemble the robot from salvaged parts.", + "description": "Assembly plans, design specs, and technical drawings for the anti-materiel turret. Most of this is useless to you, but you could use the assembly plans to re-assemble the robot from salvaged parts.", "copy-from": "schematics_generic" }, { @@ -351,7 +351,7 @@ "type": "BOOK", "name": "milspec searchlight schematics", "name_plural": "milspec searchlight schematics", - "description": "Assembly plans, design specs, and technical drawings for the milspec searchlight. Most of this is useless to you, but you could use the assembly plans to re-assemble the robot from salvaged parts.", + "description": "Assembly plans, design specs, and technical drawings for the milspec searchlight. Most of this is useless to you, but you could use the assembly plans to re-assemble the robot from salvaged parts.", "copy-from": "schematics_generic" } ] diff --git a/data/json/items/book/martial.json b/data/json/items/book/martial.json index ed84db4194f0c..4cc60f5ae14e7 100644 --- a/data/json/items/book/martial.json +++ b/data/json/items/book/martial.json @@ -5,7 +5,8 @@ "type": "GENERIC", "name": "The Spirit of Aikido", "name_plural": "The Spirit of Aikido", - "description": "A complete guide to Aikido." + "description": "A complete guide to Aikido.", + "book_data": { "martial_art": "style_aikido" } }, { "id": "manual_boxing", @@ -13,7 +14,8 @@ "type": "GENERIC", "name": "Practical Pugilism", "name_plural": "Practical Pugilism", - "description": "A complete guide to boxing. Let's get ready to rough-up some ruffians!" + "description": "A complete guide to boxing. Let's get ready to rough-up some ruffians!", + "book_data": { "martial_art": "style_boxing" } }, { "id": "manual_capoeira", @@ -21,7 +23,8 @@ "type": "GENERIC", "name": "Capoeira 100", "name_plural": "Capoeira 100", - "description": "A complete guide to Capoeira." + "description": "A complete guide to Capoeira.", + "book_data": { "martial_art": "style_capoeira" } }, { "id": "manual_centipede", @@ -29,7 +32,8 @@ "type": "GENERIC", "name": "The Centipede Lu Feng", "name_plural": "The Centipede Lu Feng", - "description": "A complete guide to Centipede Kung Fu." + "description": "A complete guide to Centipede Kung Fu.", + "book_data": { "martial_art": "style_centipede" } }, { "id": "manual_crane", @@ -37,7 +41,8 @@ "type": "GENERIC", "name": "The Red Crane", "name_plural": "The Red Crane", - "description": "A complete guide to Crane Kung Fu." + "description": "A complete guide to Crane Kung Fu.", + "book_data": { "martial_art": "style_crane" } }, { "id": "manual_dragon", @@ -45,7 +50,8 @@ "type": "GENERIC", "name": "The Jade Dragon", "name_plural": "The Jade Dragon", - "description": "A complete guide to Dragon Kung Fu." + "description": "A complete guide to Dragon Kung Fu.", + "book_data": { "martial_art": "style_dragon" } }, { "id": "manual_eskrima", @@ -53,7 +59,8 @@ "type": "GENERIC", "name": "Practical Eskrima", "name_plural": "Practical Eskrima", - "description": "A complete guide to Eskrima." + "description": "A complete guide to Eskrima.", + "book_data": { "martial_art": "style_eskrima" } }, { "id": "manual_fencing", @@ -61,7 +68,8 @@ "type": "GENERIC", "name": "The Modern Swordsman", "name_plural": "The Modern Swordsman", - "description": "A complete guide to Fencing." + "description": "A complete guide to Fencing.", + "book_data": { "martial_art": "style_fencing" } }, { "id": "manual_judo", @@ -69,7 +77,8 @@ "type": "GENERIC", "name": "Kodokan Judo", "name_plural": "Kodokan Judo", - "description": "A complete guide to Judo." + "description": "A complete guide to Judo.", + "book_data": { "martial_art": "style_judo" } }, { "id": "manual_karate", @@ -77,7 +86,8 @@ "type": "GENERIC", "name": "The Shotokan Karate Handbook", "name_plural": "The Shotokan Karate Handbook", - "description": "A complete guide to Shotokan Karate." + "description": "A complete guide to Shotokan Karate.", + "book_data": { "martial_art": "style_karate" } }, { "id": "manual_krav_maga", @@ -85,7 +95,8 @@ "type": "GENERIC", "name": "Complete Krav Maga", "name_plural": "Complete Krav Maga", - "description": "A complete guide to Krav Maga." + "description": "A complete guide to Krav Maga.", + "book_data": { "martial_art": "style_krav_maga" } }, { "id": "manual_leopard", @@ -93,7 +104,8 @@ "type": "GENERIC", "name": "The Deaf Leopard", "name_plural": "The Deaf Leopard", - "description": "A complete guide to Leopard Kung Fu." + "description": "A complete guide to Leopard Kung Fu.", + "book_data": { "martial_art": "style_leopard" } }, { "id": "manual_lizard", @@ -101,7 +113,8 @@ "type": "GENERIC", "name": "The Lizard Kuo Chui", "name_plural": "The Lizard Kuo Chui", - "description": "A complete guide to Lizard Kung Fu." + "description": "A complete guide to Lizard Kung Fu.", + "book_data": { "martial_art": "style_lizard" } }, { "id": "manual_muay_thai", @@ -109,7 +122,8 @@ "type": "GENERIC", "name": "Ultimate Muay Thai", "name_plural": "Ultimate Muay Thai", - "description": "A complete guide to Muay Thai." + "description": "A complete guide to Muay Thai.", + "book_data": { "martial_art": "style_muay_thai" } }, { "id": "manual_ninjutsu", @@ -117,7 +131,8 @@ "type": "GENERIC", "name": "Essence of Ninjutsu", "name_plural": "Essence of Ninjutsu", - "description": "A complete guide to Ninjutsu." + "description": "A complete guide to Ninjutsu.", + "book_data": { "martial_art": "style_ninjutsu" } }, { "id": "manual_niten", @@ -125,7 +140,8 @@ "type": "GENERIC", "name": "The Book of Five Rings", "name_plural": "The Book of Five Rings", - "description": "A primer on Miyamoto Musashi's style of combat and philosophy, Niten Ichi-Ryu." + "description": "A primer on Miyamoto Musashi's style of combat and philosophy, Niten Ichi-Ryu.", + "book_data": { "martial_art": "style_niten" } }, { "id": "manual_pankration", @@ -133,7 +149,8 @@ "type": "GENERIC", "name": "The Modern Pankratiast", "name_plural": "The Modern Pankratiast", - "description": "A complete guide to Pankration." + "description": "A complete guide to Pankration.", + "book_data": { "martial_art": "style_pankration" } }, { "id": "manual_scorpion", @@ -141,7 +158,8 @@ "type": "GENERIC", "name": "The Scorpion Sun Chien", "name_plural": "The Scorpion Sun Chien", - "description": "A complete guide to Scorpion Kung Fu." + "description": "A complete guide to Scorpion Kung Fu.", + "book_data": { "martial_art": "style_scorpion" } }, { "id": "manual_silat", @@ -149,7 +167,8 @@ "type": "GENERIC", "name": "The Indonesian Warrior", "name_plural": "The Indonesian Warrior", - "description": "A complete guide to Pentjak Silat." + "description": "A complete guide to Pentjak Silat.", + "book_data": { "martial_art": "style_silat" } }, { "id": "manual_snake", @@ -157,7 +176,8 @@ "type": "GENERIC", "name": "The Black Snake", "name_plural": "The Black Snake", - "description": "A complete guide to Snake Kung Fu." + "description": "A complete guide to Snake Kung Fu.", + "book_data": { "martial_art": "style_snake" } }, { "id": "manual_taekwondo", @@ -165,7 +185,8 @@ "type": "GENERIC", "name": "Official Taekwondo Training Manual", "name_plural": "Official Taekwondo Training Manual", - "description": "A complete guide to Taekwondo." + "description": "A complete guide to Taekwondo.", + "book_data": { "martial_art": "style_taekwondo" } }, { "id": "manual_tai_chi", @@ -173,7 +194,8 @@ "type": "GENERIC", "name": "Becoming One with the Tao", "name_plural": "Becoming One with the Tao", - "description": "A complete guide to T'ai Chi Ch'uan." + "description": "A complete guide to T'ai Chi Ch'uan.", + "book_data": { "martial_art": "style_tai_chi" } }, { "id": "manual_tiger", @@ -181,7 +203,8 @@ "type": "GENERIC", "name": "The White Tiger", "name_plural": "The White Tiger", - "description": "A complete guide to Tiger Kung Fu." + "description": "A complete guide to Tiger Kung Fu.", + "book_data": { "martial_art": "style_tiger" } }, { "id": "manual_toad", @@ -189,7 +212,8 @@ "type": "GENERIC", "name": "The Toad Lo Mang", "name_plural": "The Toad Lo Mang", - "description": "A complete guide to Toad Kung Fu." + "description": "A complete guide to Toad Kung Fu.", + "book_data": { "martial_art": "style_toad" } }, { "id": "manual_venom_snake", @@ -197,7 +221,8 @@ "type": "GENERIC", "name": "The Viper Wei Pai", "name_plural": "The Viper Wei Pai", - "description": "A complete guide to Viper Kung Fu." + "description": "A complete guide to Viper Kung Fu.", + "book_data": { "martial_art": "style_venom_snake" } }, { "id": "manual_zui_quan", @@ -205,7 +230,8 @@ "type": "GENERIC", "name": "Zui Quan and You", "name_plural": "Zui Quan and You", - "description": "A complete guide to Zui Quan." + "description": "A complete guide to Zui Quan.", + "book_data": { "martial_art": "style_zui_quan" } }, { "id": "manual_sojutsu", @@ -213,7 +239,8 @@ "type": "GENERIC", "name": "The Way of the Spear", "name_plural": "The Way of the Spear", - "description": "A complete guide to Sōjutsu." + "description": "A complete guide to Sōjutsu.", + "book_data": { "martial_art": "style_sojutsu" } }, { "id": "manual_wingchun", @@ -221,6 +248,16 @@ "type": "GENERIC", "name": "Beautiful Springtime", "name_plural": "Beautiful Springtime", - "description": "A complete guide to Wing Chun Kung-fu. Includes a section on butterfly swords and the use of long poles at the end." + "description": "A complete guide to Wing Chun Kung-fu. Includes a section on butterfly swords and the use of long poles at the end.", + "book_data": { "martial_art": "style_wingchun" } + }, + { + "id": "manual_swordsmanship", + "copy-from": "book_martial", + "type": "GENERIC", + "name": "Historic European Swordfighting", + "name_plural": "Historic European Swordfighting", + "description": "A complete guide to medieval swordsmanship. Compares the German and Italian traditions for longsword and side sword, in and out of armor, with and without shield.", + "book_data": { "martial_art": "style_swordsmanship" } } ] diff --git a/data/json/items/chemicals_and_resources.json b/data/json/items/chemicals_and_resources.json index 2d99e0702c550..c2654317ad370 100644 --- a/data/json/items/chemicals_and_resources.json +++ b/data/json/items/chemicals_and_resources.json @@ -1192,7 +1192,7 @@ "type": "GENERIC", "category": "other", "name": "sandbag", - "description": "This is a canvas sack filled with sand. It can be used to construct simple barricades.", + "description": "This is a canvas sack filled with sand. It can be used to construct simple barricades.", "weight": 24415, "volume": "16L", "price": 0, @@ -1207,7 +1207,7 @@ "type": "GENERIC", "category": "other", "name": "earthbag", - "description": "This is a canvas sack filled with soil. It can be used to construct simple barricades.", + "description": "This is a canvas sack filled with soil. It can be used to construct simple barricades.", "weight": 19500, "volume": "16L", "price": 0, diff --git a/data/json/items/classes/gun.json b/data/json/items/classes/gun.json index 9cbd22f962528..6a47d8956de1f 100644 --- a/data/json/items/classes/gun.json +++ b/data/json/items/classes/gun.json @@ -28,7 +28,7 @@ "name": "base launcher", "skill": "launcher", "modes": [ [ "DEFAULT", "single", 1, "NPC_AVOID" ] ], - "valid_mod_locations": [ [ "accessories", 2 ], [ "barrel", 1 ], [ "sights", 1 ] ], + "valid_mod_locations": [ [ "accessories", 2 ], [ "barrel", 1 ], [ "sights", 1 ], [ "sling", 1 ] ], "flags": [ "RELOAD_ONE", "RELOAD_EJECT", "NEVER_JAMS" ] }, { @@ -58,7 +58,19 @@ "type": "GUN", "name": "backup pistol", "//": "diminuitive backup pistols that lack underbarrel rails, sight dovetails and decent places to affix stocks.", - "valid_mod_locations": [ [ "accessories", 2 ], [ "barrel", 1 ], [ "bore", 1 ], [ "grip", 1 ], [ "mechanism", 2 ] ] + "valid_mod_locations": [ + [ "accessories", 2 ], + [ "barrel", 1 ], + [ "bore", 1 ], + [ "brass catcher", 1 ], + [ "grip", 1 ], + [ "mechanism", 2 ], + [ "muzzle", 1 ], + [ "rail mount", 1 ], + [ "sights mount", 1 ], + [ "stock mount", 1 ], + [ "underbarrel mount", 1 ] + ] }, { "abstract": "pistol_revolver", @@ -75,7 +87,9 @@ [ "grip", 1 ], [ "mechanism", 4 ], [ "sights", 1 ], - [ "stock", 1 ] + [ "stock", 1 ], + [ "rail mount", 1 ], + [ "underbarrel mount", 1 ] ] }, { diff --git a/data/json/items/comestibles/dairy.json b/data/json/items/comestibles/dairy.json index 11670357ddfdc..a08d07036603f 100644 --- a/data/json/items/comestibles/dairy.json +++ b/data/json/items/comestibles/dairy.json @@ -1,4 +1,73 @@ [ + { + "type": "COMESTIBLE", + "id": "milk_raw", + "name": "raw milk", + "name_plural": "raw milk", + "copy-from": "milk", + "spoils_in": "12 hours", + "price": 19, + "calories": 150, + "parasites": 11, + "description": "This is raw, unhomogenized and unpasteurized milk from a cow. It couldn't be any fresher unless you drank it straight from the cow, which might upset it. Depending on your dietary sensibilities, you might want to pasteurize or even boil this before drinking." + }, + { + "type": "COMESTIBLE", + "id": "milk_UHT", + "name": "shelf stable milk", + "name_plural": "shelf stable milk", + "spoils_in": "2 d", + "copy-from": "milk", + "container": "carton_sealed", + "description": "This is milk that has been pasteurized at much higher temperatures than normal. It tastes slightly different, but, unopened, will last far longer than regular milk.", + "price": 50 + }, + { + "type": "COMESTIBLE", + "id": "milk_evap", + "name": "evaporated milk", + "name_plural": "evaporated milk", + "weight": 20, + "color": "white", + "spoils_in": "1 day", + "container": "can_food", + "comestible_type": "DRINK", + "symbol": "~", + "quench": 25, + "healthy": 1, + "calories": 132, + "description": "Milk that's had about 60% of its water removed prior to canning.", + "price": 38, + "material": [ "milk" ], + "volume": 1, + "phase": "liquid", + "flags": [ "EATEN_COLD" ], + "vitamins": [ [ "vitA", 10 ], [ "vitC", 4 ], [ "calcium", 25 ] ], + "fun": 1 + }, + { + "type": "COMESTIBLE", + "id": "buttermilk", + "name": "buttermilk", + "name_plural": "buttermilk", + "weight": 258, + "color": "white", + "spoils_in": "2 d", + "container": "bottle_plastic", + "comestible_type": "DRINK", + "symbol": "~", + "quench": 20, + "healthy": 2, + "calories": 1, + "description": "This is cultured milk defatted either due to churning or curdling. Spoils quickly.", + "price": 1, + "material": [ "milk" ], + "volume": 1, + "phase": "liquid", + "flags": [ "EATEN_COLD" ], + "fun": "0", + "vitamins": [ [ "vitA", 1 ], [ "vitC", 1 ], [ "calcium", 1 ] ] + }, { "type": "COMESTIBLE", "id": "yoghurt", @@ -19,6 +88,41 @@ "fun": 15, "vitamins": [ [ "vitA", 2 ], [ "vitC", 3 ], [ "calcium", 33 ], [ "iron", 1 ] ] }, + { + "type": "COMESTIBLE", + "id": "butter", + "name": "butter", + "name_plural": "butter", + "weight": 14.18, + "color": "yellow", + "spoils_in": "14 days", + "comestible_type": "FOOD", + "symbol": "%", + "quench": -1, + "calories": 101, + "container": "wrapper", + "description": "A yellow stick of milkfat and milk solids, usually made from cow's milk.", + "price": 300, + "material": [ "milk" ], + "volume": 2, + "charges": 32, + "vitamins": [ [ "vitA", 7 ] ], + "fun": -1 + }, + { + "type": "COMESTIBLE", + "id": "ghee", + "name": "ghee", + "name_plural": "ghee", + "copy-from": "butter", + "weight": 13.5, + "spoils_in": "90 days", + "container": "jar_glass_sealed", + "calories": 112, + "description": "Clarified butter, free from milk solids and water. Will last a very long time.", + "price": 420, + "phase": "liquid" + }, { "type": "COMESTIBLE", "id": "pudding", @@ -145,5 +249,28 @@ "charges": 10, "vitamins": [ [ "vitA", 3 ], [ "vitC", 1 ], [ "calcium", 7 ] ], "fun": -5 + }, + { + "type": "COMESTIBLE", + "id": "con_milk", + "name": "condensed milk", + "name_plural": "condensed milk", + "weight": 32, + "color": "white", + "spoils_in": "1 day", + "container": "can_food", + "comestible_type": "DRINK", + "symbol": "~", + "quench": 12, + "calories": 103, + "description": "Cow's milk that has been partly dehydrated to vastly increase its shelf life, and also sweetened.", + "price": 70, + "material": [ "milk", "junk" ], + "primary_material": "milk", + "volume": 1, + "phase": "liquid", + "charges": 10, + "vitamins": [ [ "vitA", 2 ], [ "vitC", 1 ], [ "calcium", 7 ] ], + "fun": 3 } ] diff --git a/data/json/items/comestibles/drink.json b/data/json/items/comestibles/drink.json index 3ee266e39c33c..a57d632bca928 100644 --- a/data/json/items/comestibles/drink.json +++ b/data/json/items/comestibles/drink.json @@ -166,7 +166,6 @@ "name": "chocolate drink", "weight": 236, "color": "brown", - "stim": 2, "container": "can_drink", "comestible_type": "DRINK", "symbol": "~", @@ -212,7 +211,6 @@ "name_plural": "coffee substitute", "weight": 250, "color": "brown", - "stim": 4, "container": "bottle_plastic", "comestible_type": "DRINK", "symbol": "~", @@ -355,7 +353,6 @@ "name_plural": "crispy cranberries", "weight": 250, "color": "pink", - "stim": 1, "container": "can_drink", "comestible_type": "DRINK", "symbol": "~", @@ -378,9 +375,6 @@ "name_plural": "dandelion tea", "weight": 252, "color": "yellow", - "addiction_type": "caffeine", - "use_action": "CAFF", - "stim": 1, "comestible_type": "DRINK", "symbol": "~", "quench": 48, @@ -465,9 +459,6 @@ "name_plural": "herbal tea", "weight": 250, "color": "green", - "addiction_type": "caffeine", - "use_action": "CAFF", - "stim": 1, "container": "bottle_plastic", "comestible_type": "DRINK", "symbol": "~", @@ -583,7 +574,6 @@ "name": "lemon-lime soda", "weight": 258, "color": "yellow", - "stim": 2, "container": "can_drink", "comestible_type": "DRINK", "symbol": "~", @@ -735,7 +725,6 @@ "name": "orange soda", "weight": 248, "color": "yellow", - "stim": 2, "container": "can_drink", "comestible_type": "DRINK", "symbol": "~", @@ -801,7 +790,6 @@ "name_plural": "root beer", "weight": 260, "color": "brown", - "stim": 1, "container": "can_drink", "comestible_type": "DRINK", "symbol": "~", @@ -868,7 +856,6 @@ "name_plural": "sweet water", "weight": 260, "color": "light_cyan", - "stim": 1, "container": "bottle_plastic", "comestible_type": "DRINK", "symbol": "~", diff --git a/data/json/items/comestibles/egg.json b/data/json/items/comestibles/egg.json index fd381d2892b29..e9787f0295a5f 100644 --- a/data/json/items/comestibles/egg.json +++ b/data/json/items/comestibles/egg.json @@ -3,7 +3,7 @@ "type": "COMESTIBLE", "id": "egg_bird", "name": "bird egg", - "weight": 50, + "weight": 57, "color": "brown", "spoils_in": "7 days", "comestible_type": "FOOD", @@ -12,10 +12,10 @@ "healthy": 1, "calories": 80, "description": "Nutritious egg laid by a bird.", - "price": 250, + "price": 44, "material": "egg", - "volume": "62 ml", - "stack_size": 4, + "volume": "50 ml", + "stack_size": 1, "fun": -8, "flags": [ "FREEZERBURN" ], "rot_spawn": "GROUP_EGG_BIRD_WILD", diff --git a/data/json/items/comestibles/junkfood.json b/data/json/items/comestibles/junkfood.json index 67b190f43f7ae..ec47f6145511e 100644 --- a/data/json/items/comestibles/junkfood.json +++ b/data/json/items/comestibles/junkfood.json @@ -14,7 +14,7 @@ "description": "Dry toaster pastries usually coated with solid frosting and what luck! These are strawberry flavored!", "price": 400, "material": [ "wheat", "junk" ], - "volume": 5, + "volume": "1 L", "charges": 8, "flags": [ "EATEN_HOT" ], "vitamins": [ [ "vitA", 3 ], [ "iron", 10 ] ], @@ -823,38 +823,19 @@ }, { "type": "COMESTIBLE", - "id": "frozen_burrito", - "name": "uncooked burrito", + "id": "junk_burrito", + "name": "microwave burrito", "weight": 142, "color": "brown", - "spoils_in": "11 days 16 hours", + "spoils_in": "2 days 12 hours", "container": "bag_plastic", "comestible_type": "FOOD", "symbol": "%", "quench": -12, "healthy": -2, - "calories": 130, - "description": "A small, microwaveable steak & cheese burrito, like those found at gas stations. Not as appetizing or nutritious as it would be if heated up.", - "price": 200, - "material": [ "flesh", "junk", "milk" ], - "primary_material": "processed_food", - "volume": 1, - "fun": -3 - }, - { - "type": "COMESTIBLE", - "id": "cooked_burrito", - "name": "cooked burrito", - "weight": 142, - "color": "brown", - "spoils_in": "2 days 12 hours", - "comestible_type": "FOOD", - "symbol": "%", - "quench": -12, - "healthy": -1, "calories": 434, - "description": "A small, microwaveable steak & cheese burrito, like those found at gas stations. It's tastier and more filling, but will also spoil quickly.", - "price": 90, + "description": "A small, microwaveable steak & cheese burrito, like those found at gas stations.", + "price": 200, "material": [ "flesh", "junk", "milk" ], "primary_material": "processed_food", "volume": 1, diff --git a/data/json/items/comestibles/meat_dishes.json b/data/json/items/comestibles/meat_dishes.json index c1470202cd298..2bfbdd5833280 100644 --- a/data/json/items/comestibles/meat_dishes.json +++ b/data/json/items/comestibles/meat_dishes.json @@ -465,7 +465,7 @@ "name": "hamburger helper", "weight": 170, "color": "red", - "spoils_in": "10 hours", + "spoils_in": "1 day", "container": "box_small", "comestible_type": "FOOD", "symbol": "%", @@ -1097,5 +1097,25 @@ "flags": [ "EATEN_HOT" ], "fun": 6, "vitamins": [ [ "vitC", 3 ], [ "calcium", 2 ], [ "iron", 15 ] ] + }, + { + "type": "COMESTIBLE", + "id": "homemade_burrito", + "name": "homemade burrito", + "weight": 142, + "color": "brown", + "spoils_in": "1 days 4 hours", + "comestible_type": "FOOD", + "symbol": "%", + "quench": -8, + "calories": 292, + "description": "A traditional Mexican dish of meat and vegetable stuffing put on a corn tortilla and rolled into a tube shape, like those you find in gas stations but homemade and delicious!", + "price": 700, + "material": [ "flesh", "veggy" ], + "volume": 1, + "charges": 3, + "flags": [ "EATEN_HOT" ], + "fun": 7, + "vitamins": [ [ "vitC", 3 ], [ "calcium", 19 ], [ "iron", 12 ] ] } ] diff --git a/data/json/items/comestibles/nuts.json b/data/json/items/comestibles/nuts.json index 92f1afff1a12f..0b04c75ffe764 100644 --- a/data/json/items/comestibles/nuts.json +++ b/data/json/items/comestibles/nuts.json @@ -34,7 +34,7 @@ "quench": -2, "healthy": 1, "calories": 22, - "description": "Junipers, for making gin and earthy flavors. Spicy, tastes similar to rosemary.", + "description": "Junipers, for making gin and earthy flavors. Spicy, tastes similar to rosemary.", "price": 400, "material": "fruit", "volume": 1, @@ -283,7 +283,7 @@ { "type": "COMESTIBLE", "id": "hazelnut_unshelled", - "name": "handful of hazelnuts", + "name": "handful of shelled hazelnuts", "name_plural": "handfuls of shelled hazelnuts", "weight": 30, "color": "brown", diff --git a/data/json/items/comestibles/offal_dishes.json b/data/json/items/comestibles/offal_dishes.json index ffc73671e82cc..5f1d7257e15fb 100644 --- a/data/json/items/comestibles/offal_dishes.json +++ b/data/json/items/comestibles/offal_dishes.json @@ -95,7 +95,7 @@ "quench": 2, "healthy": 1, "fun": 3, - "description": "Stomach lining, cut up and stewed for an hour in broth. Better than it sounds.", + "description": "Stomach lining, cut up and stewed for an hour in broth. Better than it sounds.", "material": [ "flesh" ], "primary_material": "flesh", "color": "brown", diff --git a/data/json/items/comestibles/other.json b/data/json/items/comestibles/other.json index deaa49e80e2d7..f787d6393c4d6 100644 --- a/data/json/items/comestibles/other.json +++ b/data/json/items/comestibles/other.json @@ -410,7 +410,7 @@ "quench": -10, "healthy": 1, "calories": 230, - "description": "A humble but nutrient-rich legume. Should be cooked prior to consumption.", + "description": "A humble but nutrient-rich legume. Should be cooked prior to consumption.", "price": 20, "material": "veggy", "volume": 1, @@ -429,7 +429,7 @@ "color": "light_gray", "spoils_in": "5 days", "quench": 1, - "description": "Some delicious cooked lentils. Humble but nutrient-rich.", + "description": "Some delicious cooked lentils. Humble but nutrient-rich.", "price": 0, "volume": 1, "fun": 1, diff --git a/data/json/items/comestibles/seed.json b/data/json/items/comestibles/seed.json index 4547dfad092de..3112696349551 100644 --- a/data/json/items/comestibles/seed.json +++ b/data/json/items/comestibles/seed.json @@ -431,8 +431,8 @@ "type": "COMESTIBLE", "id": "seed_beans", "copy-from": "seed", - "name": "raw beans", - "name_plural": "raw beans", + "name": "bean seeds", + "name_plural": "bean seeds", "weight": 194, "symbol": "%", "description": "Raw, uncooked beans, ready for planting.", diff --git a/data/json/items/comestibles/soup.json b/data/json/items/comestibles/soup.json index a69990aa23ddf..2ad5ff26126d6 100644 --- a/data/json/items/comestibles/soup.json +++ b/data/json/items/comestibles/soup.json @@ -10,7 +10,7 @@ "comestible_type": "DRINK", "symbol": "~", "quench": 30, - "calories": 90, + "calories": 13, "description": "Vegetable stock. Tasty and fairly nutritious.", "price": 350, "material": "veggy", diff --git a/data/json/items/containers.json b/data/json/items/containers.json index f38e568501545..782e5584f45b2 100644 --- a/data/json/items/containers.json +++ b/data/json/items/containers.json @@ -384,6 +384,38 @@ "unseals_into": "null", "qualities": [ [ "CONTAIN", 1 ], [ "BOIL", 2 ] ] }, + { + "id": "carton_sealed", + "type": "CONTAINER", + "category": "other", + "name": "paper carton", + "description": "A half gallon carton constructed of a paper, aluminum and plastic laminate. It has a threaded cap for easy resealing.", + "weight": 28, + "volume": 8, + "price": 0, + "to_hit": 1, + "material": [ "plastic", "aluminum", "paper" ], + "symbol": ")", + "color": "light_cyan", + "contains": 8, + "watertight": true, + "preserves": true, + "unseals_into": "carton_unsealed" + }, + { + "id": "carton_unsealed", + "copy-from": "carton_sealed", + "type": "CONTAINER", + "name": "opened paper carton", + "description": "A half gallon carton constructed of a paper, aluminum and plastic laminate. This one is open and its contents will spoil.", + "symbol": ")", + "color": "light_blue", + "preserves": false, + "seals": true, + "watertight": true, + "unseals_into": "null", + "qualities": [ [ "CONTAIN", 1 ] ] + }, { "id": "plastic_bag_vac", "type": "CONTAINER", @@ -594,7 +626,7 @@ "type": "CONTAINER", "category": "other", "name": "beaker", - "description": "A 250ml laboratory beaker. Basically a cup with delusions of grandeur.", + "description": "A 250ml laboratory beaker. Basically a cup with delusions of grandeur.", "weight": 150, "volume": "250ml", "price": 500, @@ -612,7 +644,7 @@ "type": "CONTAINER", "category": "other", "name": "graduated cylinder", - "description": "A tall, narrow glass cylinder with precise markings for measuring fluid quantities. An important science tool, it is also useful for anal retentive chefs.", + "description": "A tall, narrow glass cylinder with precise markings for measuring fluid quantities. An important science tool, it is also useful for anal retentive chefs.", "weight": 150, "volume": "100ml", "price": 500, @@ -630,7 +662,7 @@ "type": "CONTAINER", "category": "other", "name": "microcentrifuge tube", - "description": "These plastic tubes, with little built in snap-caps, are a great way to store a tiny amount of liquid. Great for jello shooters if 1mL is enough for a shot for you. Cool people call these \"eppies\".", + "description": "These plastic tubes, with little built in snap-caps, are a great way to store a tiny amount of liquid. Great for jello shooters if 1mL is enough for a shot for you. Cool people call these \"eppies\".", "weight": 1, "volume": "1ml", "price": 10, @@ -1050,7 +1082,7 @@ "type": "CONTAINER", "category": "other", "name": "condom", - "description": "A gentleman's balloon. A single use life preventer. A thumbless latex mitten. This could be used as a makeshift water container, but otherwise it's anyone's guess what it's for.", + "description": "A gentleman's balloon. A single use life preventer. A thumbless latex mitten. This could be used as a makeshift water container, but otherwise it's anyone's guess what it's for.", "weight": 5, "volume": 0, "price": 0, diff --git a/data/json/items/crossbows.json b/data/json/items/crossbows.json index b2544408bd056..25fcb894b389f 100644 --- a/data/json/items/crossbows.json +++ b/data/json/items/crossbows.json @@ -297,7 +297,17 @@ "durability": 6, "clip_size": 1, "reload": 500, - "valid_mod_locations": [ [ "accessories", 4 ], [ "grip", 1 ], [ "mechanism", 4 ], [ "sling", 1 ], [ "stock", 1 ], [ "dampening", 1 ] ] + "valid_mod_locations": [ + [ "accessories", 4 ], + [ "grip", 1 ], + [ "mechanism", 4 ], + [ "sling", 1 ], + [ "stock", 1 ], + [ "dampening", 1 ], + [ "rail mount", 1 ], + [ "sights mount", 1 ], + [ "underbarrel mount", 1 ] + ] }, { "id": "compositecrossbow", diff --git a/data/json/items/generic.json b/data/json/items/generic.json index 6870fe89313cd..a70df49525c38 100644 --- a/data/json/items/generic.json +++ b/data/json/items/generic.json @@ -109,6 +109,20 @@ "volume": 1, "flags": [ "TRADER_AVOID" ] }, + { + "type": "GENERIC", + "id": "fp_loyalty_card", + "category": "other", + "symbol": "-", + "color": "pink", + "name": "foodplace loyalty card", + "description": "A bright pink loyalty card, all the points are stamped. This would definitely prove your fidelity to Foodplace, if it still meant anything...", + "price": 0, + "material": "paper", + "flags": "TRADER_AVOID", + "weight": 3, + "volume": 0 + }, { "type": "GENERIC", "id": "withered", @@ -1683,7 +1697,7 @@ "to_hit": -2 }, { - "type": "GENERIC", + "type": "TOOL", "id": "glass_shard", "symbol": ",", "color": "light_cyan", @@ -1699,7 +1713,7 @@ "trap": "tr_glass", "moves": 150, "practice": 2, - "done_message": "You carefuly place the shards on the ground, ready to be cracked by something passing by." + "done_message": "You carefully place the shards on the ground, ready to be cracked by something passing by." }, "flags": [ "HURT_WHEN_WIELDED", "HURT_WHEN_PULLED", "TRADER_AVOID" ], "to_hit": -1 @@ -3129,5 +3143,18 @@ "weight": 4500, "volume": 12, "bashing": 8 + }, + { + "type": "GENERIC", + "id": "amplifier_head", + "symbol": ";", + "color": "blue", + "name": "amplifier head", + "description": "An amplifier head. Typically paired with a speaker cabinet for amplifying musical instruments. Basically only good for spare parts now.", + "price": 25000, + "price_postapoc": 2000, + "material": [ "steel", "plastic", "wood" ], + "weight": 11339, + "volume": 12 } ] diff --git a/data/json/items/generic/casing.json b/data/json/items/generic/casing.json index dc875824bded6..2a83c33605db0 100644 --- a/data/json/items/generic/casing.json +++ b/data/json/items/generic/casing.json @@ -37,6 +37,15 @@ "weight": 7, "volume": "10ml" }, + { + "id": "270win_casing", + "copy-from": "casing", + "type": "GENERIC", + "name": ".270 Winchester casing", + "description": "An empty casing from a .270 Winchester round.", + "weight": 7, + "volume": "10ml" + }, { "id": "300_casing", "copy-from": "casing", @@ -82,6 +91,15 @@ "weight": 3, "volume": "4ml" }, + { + "id": "38super_casing", + "copy-from": "casing", + "type": "GENERIC", + "name": ".38 Super casing", + "description": "An empty casing from a .38 Super round.", + "weight": 3, + "volume": "4ml" + }, { "id": "40_casing", "copy-from": "casing", @@ -91,6 +109,15 @@ "weight": 3, "volume": "5ml" }, + { + "id": "10mm_casing", + "copy-from": "casing", + "type": "GENERIC", + "name": "10mm Auto casing", + "description": "An empty casing from a 10mm Auto round.", + "weight": 3, + "volume": "5ml" + }, { "id": "40mm_casing", "type": "GENERIC", @@ -130,6 +157,15 @@ "weight": 4, "volume": "6ml" }, + { + "id": "45colt_casing", + "copy-from": "casing", + "type": "GENERIC", + "name": ".45 Colt casing", + "description": "An empty casing from a .45 Colt round.", + "weight": 4, + "volume": "6ml" + }, { "id": "4570_casing", "copy-from": "casing", @@ -298,5 +334,19 @@ "symbol": "=", "color": "red", "damage_states": [ 0, 0 ] + }, + { + "id": "410shot_hull", + "type": "GENERIC", + "category": "spare_parts", + "name": ".410 hull", + "description": "An empty hull from a .410 shotgun shell.", + "weight": 8, + "volume": "12ml", + "stackable": true, + "material": "plastic", + "symbol": "=", + "color": "red", + "damage_states": [ 0, 0 ] } ] diff --git a/data/json/items/generic/currency.json b/data/json/items/generic/currency.json index 1bf3c687246c9..7ed668128122c 100644 --- a/data/json/items/generic/currency.json +++ b/data/json/items/generic/currency.json @@ -5,7 +5,7 @@ "name": "Merch", "description": "The Free Merchant Certified Note, also known by names such as a 'c-note' or 'merch', is a currency based on old American bills. Fifty dollar bills and larger are printed with a promissory note signed by the treasurer of the Free Merchants, along with a complex design. The note explains that this can be exchanged for food, water, and other services through the Free Merchants in the Refugee Center.", "price": 5000, - "price_postapoc": 1500, + "price_postapoc": 320, "//": "$50 bills have substantial pre-Cataclysm value, but are worth 1 meat jerky", "weight": 1, "to_hit": -3, @@ -34,7 +34,7 @@ "name": "FlatCoin", "description": "This is a coin that has been flattened in a novelty coin flattening machine. The machine has been somewhat crudely altered so that the design - which appears to once have been Mickey Mouse - is overlayed with a handwritten emblem of a book. There is some text that faintly reads 'Campus Exchange Token'.", "price": 5, - "price_postapoc": 1500, + "price_postapoc": 320, "weight": 18, "to_hit": -3, "color": "brown", diff --git a/data/json/items/generic/string.json b/data/json/items/generic/string.json index 056287b015767..011bd7b2c1aa6 100644 --- a/data/json/items/generic/string.json +++ b/data/json/items/generic/string.json @@ -44,7 +44,7 @@ "copy-from": "rope_30", "type": "GENERIC", "name": "vine", - "description": "A sturdy 30-foot long vine. Could easily be used as a rope, but can't be disassembled. Strong enough to suspend a large corpse for butchering.", + "description": "A sturdy 30-foot long vine. Could easily be used as a rope, but can't be disassembled. Strong enough to suspend a large corpse for butchering.", "material": "veggy", "color": "light_green" }, diff --git a/data/json/items/grenades.json b/data/json/items/grenades.json index 6a1d93495b497..fe8e639231500 100644 --- a/data/json/items/grenades.json +++ b/data/json/items/grenades.json @@ -80,8 +80,9 @@ "use_action": { "type": "explosion", "no_deactivate_msg": "You've already pulled the %s's pin; try throwing it instead.", - "explosion": { "power": 165, "distance_factor": 0.8, "shrapnel": { "count": 100, "mass": 1.25 } } - } + "explosion": { "power": 155, "distance_factor": 0.8, "shrapnel": { "casing_mass": 160, "fragment_mass": 1 } } + }, + "flags": [ "BOMB", "TRADER_AVOID" ] }, { "id": "grenade_inc", diff --git a/data/json/items/gun/22.json b/data/json/items/gun/22.json index 195c117b3cc02..2f8950bf3b9a6 100644 --- a/data/json/items/gun/22.json +++ b/data/json/items/gun/22.json @@ -77,7 +77,7 @@ }, { "id": "moss_brownie", - "copy-from": "pistol_backup", + "copy-from": "pistol_base", "type": "GUN", "name": "Mossberg Brownie", "name_plural": "Mossberg Brownie", @@ -94,6 +94,17 @@ "dispersion": 520, "durability": 6, "clip_size": 4, + "valid_mod_locations": [ + [ "accessories", 2 ], + [ "barrel", 1 ], + [ "bore", 1 ], + [ "grip", 1 ], + [ "mechanism", 2 ], + [ "rail mount", 1 ], + [ "sights mount", 1 ], + [ "stock mount", 1 ], + [ "underbarrel mount", 1 ] + ], "flags": [ "RELOAD_ONE", "NEVER_JAMS", "RELOAD_EJECT" ] }, { @@ -120,7 +131,16 @@ "clip_size": 1, "reload": 200, "barrel_length": 2, - "valid_mod_locations": [ [ "accessories", 2 ], [ "muzzle", 1 ], [ "sling", 1 ], [ "stock", 1 ] ], + "valid_mod_locations": [ + [ "accessories", 2 ], + [ "muzzle", 1 ], + [ "sling", 1 ], + [ "stock", 1 ], + [ "grip mount", 1 ], + [ "rail mount", 1 ], + [ "sights mount", 1 ], + [ "underbarrel mount", 1 ] + ], "flags": [ "RELOAD_EJECT" ] }, { diff --git a/data/json/items/gun/223.json b/data/json/items/gun/223.json index 30054193912e1..cdcb2502c8585 100644 --- a/data/json/items/gun/223.json +++ b/data/json/items/gun/223.json @@ -129,7 +129,7 @@ "dispersion": 140, "durability": 3, "modes": [ [ "DEFAULT", "semi-auto", 1 ], [ "AUTO", "auto", 3 ] ], - "valid_mod_locations": [ [ "accessories", 2 ], [ "brass catcher", 1 ], [ "sling", 1 ] ], + "valid_mod_locations": [ [ "accessories", 2 ], [ "brass catcher", 1 ], [ "muzzle", 1 ], [ "sling", 1 ] ], "magazines": [ [ "223", [ "lw223mag", "lw223bigmag" ] ] ], "flags": [ "DISABLE_SIGHTS" ] }, @@ -147,6 +147,7 @@ "valid_mod_locations": [ [ "accessories", 2 ], [ "brass catcher", 1 ], + [ "muzzle", 1 ], [ "sights", 1 ], [ "sling", 1 ], [ "barrel", 1 ], @@ -170,6 +171,7 @@ "valid_mod_locations": [ [ "accessories", 2 ], [ "brass catcher", 1 ], + [ "muzzle", 1 ], [ "sights", 1 ], [ "sling", 1 ], [ "barrel", 1 ], @@ -192,6 +194,7 @@ "valid_mod_locations": [ [ "accessories", 2 ], [ "brass catcher", 1 ], + [ "muzzle", 1 ], [ "sights", 1 ], [ "sling", 1 ], [ "barrel", 1 ], @@ -209,7 +212,15 @@ "durability": 9, "relative": { "weight": 1200, "volume": 2 }, "built_in_mods": [ "lead_acog_scope", "lead_red_dot_sight", "lead_grip", "lead_glm", "lead_stabilizer" ], - "valid_mod_locations": [ [ "accessories", 2 ], [ "brass catcher", 1 ], [ "sights", 2 ], [ "sling", 1 ], [ "underbarrel", 2 ], [ "rail", 1 ] ] + "valid_mod_locations": [ + [ "accessories", 2 ], + [ "brass catcher", 1 ], + [ "muzzle", 1 ], + [ "sights", 2 ], + [ "sling", 1 ], + [ "underbarrel", 2 ], + [ "rail", 1 ] + ] }, { "id": "m249", @@ -302,7 +313,16 @@ "clip_size": 1, "reload": 200, "barrel_length": 4, - "valid_mod_locations": [ [ "accessories", 2 ], [ "muzzle", 1 ], [ "sling", 1 ], [ "stock", 1 ] ], + "valid_mod_locations": [ + [ "accessories", 2 ], + [ "muzzle", 1 ], + [ "sling", 1 ], + [ "stock", 1 ], + [ "grip mount", 1 ], + [ "rail mount", 1 ], + [ "sights mount", 1 ], + [ "underbarrel mount", 1 ] + ], "flags": [ "RELOAD_EJECT" ] }, { @@ -332,7 +352,11 @@ [ "mechanism", 4 ], [ "muzzle", 1 ], [ "sights", 1 ], - [ "sling", 1 ] + [ "sling", 1 ], + [ "grip mount", 1 ], + [ "rail mount", 1 ], + [ "stock mount", 1 ], + [ "underbarrel mount", 1 ] ], "magazines": [ [ "223", [ "ruger5", "stanag10", "ruger30" ] ] ] }, @@ -439,7 +463,10 @@ [ "muzzle", 1 ], [ "sling", 1 ], [ "stock", 1 ], - [ "underbarrel", 1 ] + [ "underbarrel", 1 ], + [ "grip mount", 1 ], + [ "rail mount", 1 ], + [ "sights mount", 1 ] ], "magazines": [ [ "223", [ "survivor223mag", "stanag30", "stanag50" ] ] ] } diff --git a/data/json/items/gun/270win.json b/data/json/items/gun/270win.json new file mode 100644 index 0000000000000..100f3d5ea4d62 --- /dev/null +++ b/data/json/items/gun/270win.json @@ -0,0 +1,22 @@ +[ + { + "id": "remington700_270", + "copy-from": "rifle_manual", + "type": "GUN", + "name": "Remington 700", + "description": "A classic bolt action rifle chambered for .270 Winchester, very polular among hunters. This is a CDL SF model with a forged, fluted, 416 stainless steel barrel threaded into the receiver and a recessed bolt face. It has checkered walnut furniture and a recoil pad to reduce perceived recoil.", + "weight": 4080, + "volume": 12, + "price": 112600, + "to_hit": -1, + "bashing": 12, + "material": [ "steel", "wood" ], + "color": "brown", + "ammo": "270win", + "dispersion": 70, + "durability": 8, + "clip_size": 4, + "barrel_length": 3, + "flags": [ "RELOAD_ONE", "NEVER_JAMS" ] + } +] diff --git a/data/json/items/gun/3006.json b/data/json/items/gun/3006.json index 8399cba3ff1f0..3938ea7497996 100644 --- a/data/json/items/gun/3006.json +++ b/data/json/items/gun/3006.json @@ -98,7 +98,11 @@ [ "mechanism", 4 ], [ "muzzle", 1 ], [ "sights", 1 ], - [ "sling", 1 ] + [ "sling", 1 ], + [ "grip mount", 1 ], + [ "rail mount", 1 ], + [ "stock mount", 1 ], + [ "underbarrel mount", 1 ] ], "magazines": [ [ "3006", [ "3006_clip" ] ] ], "flags": [ "RELOAD_ONE" ] @@ -167,7 +171,7 @@ "name": "pipe rifle: .30-06", "name_plural": "pipe rifles: .30-06", "//": "It's the same size as the others, but it's still a scrap weapon.", - "description": "A homemade rifle. It is simply a pipe attached to a stock, with a hammer to strike the single round it holds. This one is made to support more gun attachments.", + "description": "A homemade rifle. It is simply a pipe attached to a stock, with a hammer to strike the single round it holds.", "weight": 4080, "volume": 12, "price": 110000, @@ -185,7 +189,16 @@ "clip_size": 1, "reload": 200, "barrel_length": 4, - "valid_mod_locations": [ [ "accessories", 2 ], [ "muzzle", 1 ], [ "sling", 1 ], [ "stock", 1 ] ], + "valid_mod_locations": [ + [ "accessories", 2 ], + [ "muzzle", 1 ], + [ "sling", 1 ], + [ "stock", 1 ], + [ "grip mount", 1 ], + [ "rail mount", 1 ], + [ "sights mount", 1 ], + [ "underbarrel mount", 1 ] + ], "flags": [ "RELOAD_EJECT" ] }, { @@ -204,7 +217,10 @@ [ "mechanism", 4 ], [ "muzzle", 1 ], [ "sights", 1 ], - [ "sling", 1 ] + [ "sling", 1 ], + [ "rail mount", 1 ], + [ "stock mount", 1 ], + [ "underbarrel mount", 1 ] ], "relative": { "durability": -3 }, "proportional": { "reload": 4 } diff --git a/data/json/items/gun/308.json b/data/json/items/gun/308.json index 05b4ebe7fe1fb..1ffc9600239c9 100644 --- a/data/json/items/gun/308.json +++ b/data/json/items/gun/308.json @@ -124,7 +124,11 @@ [ "mechanism", 4 ], [ "muzzle", 1 ], [ "sights", 1 ], - [ "sling", 1 ] + [ "sling", 1 ], + [ "grip mount", 1 ], + [ "rail mount", 1 ], + [ "stock mount", 1 ], + [ "underbarrel mount", 1 ] ], "magazines": [ [ "308", [ "m14mag", "m14smallmag" ] ] ] }, @@ -231,7 +235,10 @@ [ "stock", 1 ], [ "mechanism", 4 ], [ "sights", 1 ], - [ "sling", 1 ] + [ "sling", 1 ], + [ "grip mount", 1 ], + [ "rail mount", 1 ], + [ "underbarrel mount", 1 ] ], "flags": [ "RELOAD_ONE" ] }, @@ -299,7 +306,10 @@ [ "sling", 1 ], [ "stock", 1 ], [ "mechanism", 4 ], - [ "sights", 1 ] + [ "sights", 1 ], + [ "grip mount", 1 ], + [ "rail mount", 1 ], + [ "underbarrel mount", 1 ] ], "flags": [ "NEVER_JAMS" ] }, diff --git a/data/json/items/gun/357sig.json b/data/json/items/gun/357sig.json index 143021b849cc6..a08b8ba16cc9b 100644 --- a/data/json/items/gun/357sig.json +++ b/data/json/items/gun/357sig.json @@ -27,5 +27,24 @@ "description": "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.", "ammo": [ "357sig" ], "magazines": [ [ "357sig", [ "glock40mag", "glock40bigmag" ] ] ] + }, + { + "id": "p320_357sig", + "copy-from": "pistol_base", + "type": "GUN", + "name": "SIG P320", + "description": "The P320 is a semi automatic, short recoil operated pistol. This one is chambered for .357 SIG.", + "weight": 800, + "volume": 2, + "price": 69000, + "to_hit": -2, + "bashing": 8, + "material": [ "plastic", "steel" ], + "color": "dark_gray", + "ammo": "357sig", + "dispersion": 480, + "durability": 6, + "magazine_well": 1, + "magazines": [ [ "357sig", [ "p320mag_14rd_357sig" ] ] ] } ] diff --git a/data/json/items/gun/38.json b/data/json/items/gun/38.json index a1d9025062c6a..2cdf695594238 100644 --- a/data/json/items/gun/38.json +++ b/data/json/items/gun/38.json @@ -21,12 +21,19 @@ "durability": 3, "clip_size": 2, "reload": 200, - "valid_mod_locations": [ [ "accessories", 4 ], [ "grip", 1 ], [ "sights", 1 ], [ "underbarrel", 1 ] ], + "valid_mod_locations": [ + [ "accessories", 4 ], + [ "grip", 1 ], + [ "sights", 1 ], + [ "underbarrel", 1 ], + [ "rail mount", 1 ], + [ "stock mount", 1 ] + ], "flags": [ "RELOAD_ONE", "RELOAD_EJECT" ] }, { "id": "cop_38", - "copy-from": "pistol_backup", + "copy-from": "pistol_base", "type": "GUN", "name": "COP .38", "name_plural": "COP .38", @@ -42,6 +49,17 @@ "dispersion": 520, "durability": 6, "clip_size": 4, + "valid_mod_locations": [ + [ "accessories", 2 ], + [ "barrel", 1 ], + [ "bore", 1 ], + [ "grip", 1 ], + [ "mechanism", 2 ], + [ "rail mount", 1 ], + [ "sights mount", 1 ], + [ "stock mount", 1 ], + [ "underbarrel mount", 1 ] + ], "flags": [ "RELOAD_ONE", "NEVER_JAMS", "RELOAD_EJECT" ] }, { @@ -67,7 +85,16 @@ "clip_size": 1, "reload": 200, "barrel_length": 3, - "valid_mod_locations": [ [ "accessories", 2 ], [ "muzzle", 1 ], [ "sling", 1 ], [ "stock", 1 ] ], + "valid_mod_locations": [ + [ "accessories", 2 ], + [ "muzzle", 1 ], + [ "sling", 1 ], + [ "stock", 1 ], + [ "grip mount", 1 ], + [ "rail mount", 1 ], + [ "sights mount", 1 ], + [ "underbarrel mount", 1 ] + ], "flags": [ "RELOAD_EJECT" ] }, { diff --git a/data/json/items/gun/38super.json b/data/json/items/gun/38super.json new file mode 100644 index 0000000000000..f925602368668 --- /dev/null +++ b/data/json/items/gun/38super.json @@ -0,0 +1,22 @@ +[ + { + "id": "m1911a1_38super", + "copy-from": "pistol_base", + "type": "GUN", + "name": "M1911A1", + "description": "The M1911A1 is an extremely popular pistol known for its reliability. This one is chambered for .38 Super.", + "weight": 1035, + "volume": 2, + "price": 78400, + "to_hit": -2, + "bashing": 12, + "material": [ "steel", "plastic" ], + "symbol": "(", + "color": "light_gray", + "ammo": "38super", + "dispersion": 480, + "durability": 7, + "magazine_well": 1, + "magazines": [ [ "38super", [ "m1911mag_10rd_38super" ] ] ] + } +] diff --git a/data/json/items/gun/40.json b/data/json/items/gun/40.json index c3746ac6d3011..a865b62b0a898 100644 --- a/data/json/items/gun/40.json +++ b/data/json/items/gun/40.json @@ -58,7 +58,16 @@ "clip_size": 1, "reload": 200, "barrel_length": 3, - "valid_mod_locations": [ [ "accessories", 2 ], [ "muzzle", 1 ], [ "sling", 1 ], [ "stock", 1 ] ], + "valid_mod_locations": [ + [ "accessories", 2 ], + [ "muzzle", 1 ], + [ "sling", 1 ], + [ "stock", 1 ], + [ "grip mount", 1 ], + [ "rail mount", 1 ], + [ "sights mount", 1 ], + [ "underbarrel mount", 1 ] + ], "flags": [ "RELOAD_EJECT" ] }, { @@ -162,7 +171,8 @@ [ "grip", 1 ], [ "sights", 1 ], [ "stock", 1 ], - [ "underbarrel", 1 ] + [ "underbarrel", 1 ], + [ "rail mount", 1 ] ], "flags": [ "RELOAD_ONE", "NEVER_JAMS", "RELOAD_EJECT" ] }, @@ -181,7 +191,7 @@ "material": [ "steel", "wood" ], "symbol": "(", "color": "dark_gray", - "ammo": "40", + "ammo": [ "10mm", "40" ], "ranged_damage": 1, "dispersion": 320, "durability": 8, diff --git a/data/json/items/gun/40mm.json b/data/json/items/gun/40mm.json index eb65edf0bb497..ecaa74b57123a 100644 --- a/data/json/items/gun/40mm.json +++ b/data/json/items/gun/40mm.json @@ -15,7 +15,17 @@ "dispersion": 550, "durability": 6, "clip_size": 1, - "reload": 350 + "reload": 350, + "valid_mod_locations": [ + [ "accessories", 2 ], + [ "barrel", 1 ], + [ "sights", 1 ], + [ "sling", 1 ], + [ "grip mount", 1 ], + [ "rail mount", 1 ], + [ "stock mount", 1 ], + [ "underbarrel mount", 1 ] + ] }, { "id": "m320", @@ -53,7 +63,17 @@ "dispersion": 150, "durability": 8, "clip_size": 1, - "reload": 250 + "reload": 250, + "valid_mod_locations": [ + [ "accessories", 2 ], + [ "barrel", 1 ], + [ "sights", 1 ], + [ "sling", 1 ], + [ "grip mount", 1 ], + [ "rail mount", 1 ], + [ "stock mount", 1 ], + [ "underbarrel mount", 1 ] + ] }, { "id": "mark19", @@ -95,7 +115,17 @@ "dispersion": 270, "durability": 8, "clip_size": 6, - "reload": 300 + "reload": 300, + "valid_mod_locations": [ + [ "accessories", 2 ], + [ "barrel", 1 ], + [ "sights", 1 ], + [ "sling", 1 ], + [ "grip mount", 1 ], + [ "rail mount", 1 ], + [ "stock mount", 1 ], + [ "underbarrel mount", 1 ] + ] }, { "id": "rm802", diff --git a/data/json/items/gun/410shot.json b/data/json/items/gun/410shot.json new file mode 100644 index 0000000000000..73ed52535234d --- /dev/null +++ b/data/json/items/gun/410shot.json @@ -0,0 +1,22 @@ +[ + { + "id": "saiga_410", + "copy-from": "shotgun_base", + "type": "GUN", + "name": "Saiga-410", + "description": "The Saiga-410 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.", + "weight": 3550, + "volume": 11, + "price": 189000, + "to_hit": -1, + "bashing": 12, + "material": [ "steel", "plastic" ], + "dispersion": 395, + "durability": 7, + "barrel_length": 3, + "magazine_well": 1, + "ammo": "410shot", + "magazines": [ [ "410shot", [ "saiga410mag_10rd", "saiga410mag_30rd" ] ] ], + "flags": [ "NEVER_JAMS" ] + } +] diff --git a/data/json/items/gun/44.json b/data/json/items/gun/44.json index 3157a34fb46e6..8b71f2975d269 100644 --- a/data/json/items/gun/44.json +++ b/data/json/items/gun/44.json @@ -63,7 +63,9 @@ [ "mechanism", 4 ], [ "sights", 1 ], [ "sling", 1 ], - [ "stock", 1 ] + [ "stock", 1 ], + [ "rail mount", 1 ], + [ "underbarrel mount", 1 ] ] }, { @@ -121,7 +123,16 @@ "clip_size": 1, "reload": 200, "barrel_length": 3, - "valid_mod_locations": [ [ "accessories", 2 ], [ "muzzle", 1 ], [ "sling", 1 ], [ "stock", 1 ] ], + "valid_mod_locations": [ + [ "accessories", 2 ], + [ "muzzle", 1 ], + [ "sling", 1 ], + [ "stock", 1 ], + [ "grip mount", 1 ], + [ "rail mount", 1 ], + [ "sights mount", 1 ], + [ "underbarrel mount", 1 ] + ], "flags": [ "RELOAD_EJECT" ] }, { diff --git a/data/json/items/gun/45.json b/data/json/items/gun/45.json index 21bdeff9016e0..ecb0eb3ab4467 100644 --- a/data/json/items/gun/45.json +++ b/data/json/items/gun/45.json @@ -153,7 +153,16 @@ "clip_size": 1, "reload": 200, "barrel_length": 3, - "valid_mod_locations": [ [ "accessories", 2 ], [ "muzzle", 1 ], [ "sling", 1 ], [ "stock", 1 ] ], + "valid_mod_locations": [ + [ "accessories", 2 ], + [ "muzzle", 1 ], + [ "sling", 1 ], + [ "stock", 1 ], + [ "grip mount", 1 ], + [ "rail mount", 1 ], + [ "sights mount", 1 ], + [ "underbarrel mount", 1 ] + ], "flags": [ "RELOAD_EJECT" ] }, { diff --git a/data/json/items/gun/454.json b/data/json/items/gun/454.json index 0ae49def132de..164deef16dcb9 100644 --- a/data/json/items/gun/454.json +++ b/data/json/items/gun/454.json @@ -14,11 +14,19 @@ "material": [ "steel", "plastic" ], "symbol": "(", "color": "light_gray", - "ammo": "454", + "ammo": [ "454", "45colt" ], "dispersion": 280, "durability": 8, "clip_size": 5, "magazines": [ [ "454", [ "454_speedloader5" ] ] ], - "valid_mod_locations": [ [ "accessories", 2 ], [ "grip", 1 ], [ "mechanism", 4 ], [ "rail", 1 ], [ "sights", 1 ] ] + "valid_mod_locations": [ + [ "accessories", 2 ], + [ "grip", 1 ], + [ "mechanism", 4 ], + [ "rail", 1 ], + [ "sights", 1 ], + [ "stock mount", 1 ], + [ "underbarrel mount", 1 ] + ] } ] diff --git a/data/json/items/gun/460.json b/data/json/items/gun/460.json index 2a67cd8b9d26b..3d4a6fbe09264 100644 --- a/data/json/items/gun/460.json +++ b/data/json/items/gun/460.json @@ -8,8 +8,7 @@ "price": 90000, "ammo": "460", "relative": { "durability": -1 }, - "built_in_mods": [ "lead_holo_sight", "muzzle_brake", "lead_laser_sight" ], - "valid_mod_locations": [ [ "accessories", 2 ], [ "brass catcher", 1 ], [ "muzzle", 1 ], [ "sights", 1 ], [ "underbarrel", 1 ] ] + "built_in_mods": [ "lead_holo_sight", "muzzle_brake", "lead_laser_sight" ] }, { "id": "l_mp_45", @@ -19,8 +18,7 @@ "description": "After the success of their 9x19mm machine pistol, Leadworks LLC developed the L39B-45 from their .460 Rowland semi-autos, intending them to be used with .45ACP. Because it shares most of its parts with the L39-460, this variant retains the ability to fire fearsome .460 Rowland, though users are strongly advised not to do so during automatic fire. Comes with built in red dot, recoil compensator and laser sights. Similar to other Leadworks products it doesn't accept third-party modifications.", "ammo": "460", "relative": { "durability": -1 }, - "built_in_mods": [ "lead_holo_sight", "muzzle_brake", "lead_laser_sight" ], - "valid_mod_locations": [ [ "accessories", 2 ], [ "brass catcher", 1 ], [ "muzzle", 1 ], [ "sights", 1 ], [ "underbarrel", 1 ] ] + "built_in_mods": [ "lead_holo_sight", "muzzle_brake", "lead_laser_sight" ] }, { "id": "l_enforcer_45", @@ -45,7 +43,14 @@ "clip_size": 6, "magazines": [ [ "460", [ "460_speedloader6" ] ] ], "built_in_mods": [ "lead_holo_sight", "lead_laser_sight" ], - "valid_mod_locations": [ [ "accessories", 2 ], [ "sights", 1 ], [ "underbarrel", 1 ] ] + "valid_mod_locations": [ + [ "accessories", 2 ], + [ "sights", 1 ], + [ "underbarrel", 1 ], + [ "grip mount", 1 ], + [ "rail mount", 1 ], + [ "stock mount", 1 ] + ] }, { "id": "l_long_45", @@ -72,7 +77,17 @@ "clip_size": 12, "barrel_length": 2, "built_in_mods": [ "lead_holo_sight", "lead_laser_sight" ], - "valid_mod_locations": [ [ "accessories", 2 ], [ "brass catcher", 1 ], [ "sights", 1 ], [ "sling", 1 ], [ "underbarrel", 1 ] ], + "valid_mod_locations": [ + [ "accessories", 2 ], + [ "brass catcher", 1 ], + [ "sights", 1 ], + [ "sling", 1 ], + [ "underbarrel", 1 ], + [ "muzzle", 1 ], + [ "grip mount", 1 ], + [ "rail mount", 1 ], + [ "stock mount", 1 ] + ], "flags": [ "RELOAD_ONE" ] } ] diff --git a/data/json/items/gun/50.json b/data/json/items/gun/50.json index 92c7e96a1e40b..893a3d280bbc3 100644 --- a/data/json/items/gun/50.json +++ b/data/json/items/gun/50.json @@ -76,7 +76,9 @@ [ "muzzle", 1 ], [ "sling", 1 ], [ "stock", 1 ], - [ "grip", 1 ] + [ "grip", 1 ], + [ "rail mount", 1 ], + [ "underbarrel mount", 1 ] ], "magazines": [ ], "relative": { "weight": -21500, "volume": -6, "price": -1210000, "ranged_damage": -4, "dispersion": 60, "barrel_length": -1 }, diff --git a/data/json/items/gun/500.json b/data/json/items/gun/500.json index e9fcac8e51a86..db91e828956d5 100644 --- a/data/json/items/gun/500.json +++ b/data/json/items/gun/500.json @@ -27,7 +27,9 @@ [ "mechanism", 4 ], [ "sights", 1 ], [ "sling", 1 ], - [ "stock", 1 ] + [ "stock", 1 ], + [ "rail mount", 1 ], + [ "underbarrel mount", 1 ] ] }, { @@ -50,6 +52,14 @@ "durability": 8, "clip_size": 5, "magazines": [ [ "500", [ "500_speedloader5" ] ] ], - "valid_mod_locations": [ [ "accessories", 2 ], [ "grip", 1 ], [ "mechanism", 4 ], [ "rail", 1 ], [ "sights", 1 ] ] + "valid_mod_locations": [ + [ "accessories", 2 ], + [ "grip", 1 ], + [ "mechanism", 4 ], + [ "rail", 1 ], + [ "sights", 1 ], + [ "stock mount", 1 ], + [ "underbarrel mount", 1 ] + ] } ] diff --git a/data/json/items/gun/762x25.json b/data/json/items/gun/762x25.json index e09bf2ad236de..c85ca979a82b3 100644 --- a/data/json/items/gun/762x25.json +++ b/data/json/items/gun/762x25.json @@ -31,7 +31,8 @@ [ "sights", 1 ], [ "sling", 1 ], [ "stock", 1 ], - [ "underbarrel", 1 ] + [ "underbarrel", 1 ], + [ "rail mount", 1 ] ], "magazines": [ [ "762x25", [ "ppshmag", "ppshdrum" ] ] ] }, diff --git a/data/json/items/gun/8x40mm.json b/data/json/items/gun/8x40mm.json index bf24c8787bc46..bc2b0aaa85440 100644 --- a/data/json/items/gun/8x40mm.json +++ b/data/json/items/gun/8x40mm.json @@ -64,7 +64,6 @@ [ "rail", 1 ], [ "sights", 1 ], [ "sling", 1 ], - [ "stock", 1 ], [ "underbarrel", 1 ] ], "magazines": [ [ "8x40mm", [ "8x40_10_mag", "8x40_25_mag" ] ] ], diff --git a/data/json/items/gun/9mm.json b/data/json/items/gun/9mm.json index 44f1f811394d2..a59f249d00c84 100644 --- a/data/json/items/gun/9mm.json +++ b/data/json/items/gun/9mm.json @@ -21,6 +21,7 @@ "armor_data": { "covers": [ "ARM_EITHER", "HAND_EITHER" ], "coverage": 10, "encumbrance": 30, "material_thickness": 1 }, "faults": [ "fault_gun_blackpowder", "fault_gun_clogged" ], "magazines": [ [ "9mm", [ "stenmag", "survivor9mm_mag" ] ] ], + "valid_mod_locations": [ [ "rail mount", 1 ] ], "flags": [ "OVERSIZE", "BELTED", "FANCY", "RESTRICT_HANDS" ] }, { @@ -270,7 +271,16 @@ "dispersion": 340, "durability": 9, "built_in_mods": [ "lead_red_dot_sight", "lead_laser_sight" ], - "valid_mod_locations": [ [ "accessories", 2 ], [ "brass catcher", 1 ], [ "sights", 1 ], [ "underbarrel", 1 ] ], + "valid_mod_locations": [ + [ "accessories", 2 ], + [ "brass catcher", 1 ], + [ "sights", 1 ], + [ "underbarrel", 1 ], + [ "muzzle", 1 ], + [ "grip mount", 1 ], + [ "rail mount", 1 ], + [ "stock mount", 1 ] + ], "magazine_well": 1, "magazines": [ [ "9mm", [ "lw21mag" ] ], [ "460", [ "lw12mag" ] ] ], "flags": [ "DURABLE_MELEE" ] @@ -322,7 +332,16 @@ "clip_size": 1, "reload": 200, "barrel_length": 3, - "valid_mod_locations": [ [ "accessories", 2 ], [ "muzzle", 1 ], [ "sling", 1 ], [ "stock", 1 ] ], + "valid_mod_locations": [ + [ "accessories", 2 ], + [ "muzzle", 1 ], + [ "sling", 1 ], + [ "stock", 1 ], + [ "grip mount", 1 ], + [ "rail mount", 1 ], + [ "sights mount", 1 ], + [ "underbarrel mount", 1 ] + ], "faults": [ "fault_gun_blackpowder", "fault_gun_clogged" ], "flags": [ "RELOAD_EJECT" ] }, @@ -386,7 +405,16 @@ "blackpowder_tolerance": 24, "min_cycle_recoil": 450, "modes": [ [ "DEFAULT", "auto", 10 ] ], - "valid_mod_locations": [ [ "accessories", 2 ], [ "muzzle", 1 ], [ "sling", 1 ], [ "stock", 1 ] ], + "valid_mod_locations": [ + [ "accessories", 2 ], + [ "muzzle", 1 ], + [ "sling", 1 ], + [ "stock", 1 ], + [ "grip mount", 1 ], + [ "rail mount", 1 ], + [ "sights mount", 1 ], + [ "underbarrel mount", 1 ] + ], "faults": [ "fault_gun_blackpowder", "fault_gun_clogged" ], "magazines": [ [ "9mm", [ "stenmag", "survivor9mm_mag" ] ] ] }, @@ -536,5 +564,24 @@ "bashing": 2, "ammo": "9mm", "magazines": [ [ "9mm", [ "kpf9mag" ] ] ] + }, + { + "id": "m17", + "copy-from": "pistol_base", + "type": "GUN", + "name": "M17", + "description": "The M17 is a semi automatic, short recoil operated pistol derived from the SIG Sauer P320.", + "weight": 800, + "volume": 2, + "price": 69000, + "to_hit": -2, + "bashing": 8, + "material": [ "plastic", "steel" ], + "color": "dark_gray", + "ammo": "9mm", + "dispersion": 480, + "durability": 6, + "magazine_well": 1, + "magazines": [ [ "9mm", [ "p320mag_17rd_9x19mm" ] ] ] } ] diff --git a/data/json/items/gun/blunderbuss.json b/data/json/items/gun/blunderbuss.json index fe7566e16280f..ed669f9ceb461 100644 --- a/data/json/items/gun/blunderbuss.json +++ b/data/json/items/gun/blunderbuss.json @@ -21,6 +21,13 @@ "loudness": 200, "clip_size": 1, "reload": 300, - "valid_mod_locations": [ [ "sling", 1 ], [ "stock", 1 ] ] + "valid_mod_locations": [ + [ "sling", 1 ], + [ "stock", 1 ], + [ "grip mount", 1 ], + [ "rail mount", 1 ], + [ "sights mount", 1 ], + [ "underbarrel mount", 1 ] + ] } ] diff --git a/data/json/items/gun/flammable.json b/data/json/items/gun/flammable.json index 63b3c611091e4..178ea295d3d86 100644 --- a/data/json/items/gun/flammable.json +++ b/data/json/items/gun/flammable.json @@ -15,7 +15,15 @@ "dispersion": 300, "durability": 8, "burst": 4, - "valid_mod_locations": [ [ "accessories", 1 ], [ "grip", 1 ], [ "sling", 1 ] ], + "valid_mod_locations": [ + [ "accessories", 1 ], + [ "grip", 1 ], + [ "sling", 1 ], + [ "rail mount", 1 ], + [ "stock mount", 1 ], + [ "sights mount", 1 ], + [ "underbarrel mount", 1 ] + ], "magazines": [ [ "flammable", [ "pressurized_tank" ] ] ] }, { @@ -32,7 +40,7 @@ "dispersion": 300, "durability": 8, "clip_size": 100, - "valid_mod_locations": [ [ "grip", 1 ], [ "sling", 1 ], [ "stock", 1 ] ], + "valid_mod_locations": [ [ "sling", 1 ], [ "stock", 1 ], [ "rail mount", 1 ] ], "relative": { "reload": 4 } }, { diff --git a/data/json/items/gun/flintlock.json b/data/json/items/gun/flintlock.json index 763417387a223..2b0ea91ddb3bf 100644 --- a/data/json/items/gun/flintlock.json +++ b/data/json/items/gun/flintlock.json @@ -5,7 +5,15 @@ "type": "GUN", "name": "flintlock carbine", "description": "This short rifle design once dominated the battlefields of ancient Europe, and may yet re-earn its feared status due to its ease of handling and ability to use easily-crafted ammunition.", - "valid_mod_locations": [ [ "accessories", 1 ], [ "sling", 1 ] ], + "valid_mod_locations": [ + [ "accessories", 1 ], + [ "sling", 1 ], + [ "grip mount", 1 ], + [ "rail mount", 1 ], + [ "sights mount", 1 ], + [ "stock mount", 1 ], + [ "underbarrel mount", 1 ] + ], "relative": { "weight": -500, "volume": -4, "range": -2, "ranged_damage": -4 }, "proportional": { "bashing": 0.6, "dispersion": 1.35, "reload": 0.6 } }, @@ -42,7 +50,14 @@ "durability": 6, "clip_size": 1, "reload": 600, - "valid_mod_locations": [ [ "accessories", 1 ] ], + "valid_mod_locations": [ + [ "accessories", 1 ], + [ "grip mount", 1 ], + [ "rail mount", 1 ], + [ "sights mount", 1 ], + [ "stock mount", 1 ], + [ "underbarrel mount", 1 ] + ], "flags": [ "NEVER_JAMS" ] }, { @@ -67,7 +82,15 @@ "durability": 6, "clip_size": 1, "reload": 1200, - "valid_mod_locations": [ [ "accessories", 1 ], [ "sling", 1 ], [ "underbarrel", 1 ] ], + "valid_mod_locations": [ + [ "accessories", 1 ], + [ "sling", 1 ], + [ "underbarrel", 1 ], + [ "grip mount", 1 ], + [ "rail mount", 1 ], + [ "sights mount", 1 ], + [ "stock mount", 1 ] + ], "flags": [ "NEVER_JAMS", "DURABLE_MELEE" ] } ] diff --git a/data/json/items/gun/metal_rail.json b/data/json/items/gun/metal_rail.json index a5de980544c52..86c6e8e9a2091 100644 --- a/data/json/items/gun/metal_rail.json +++ b/data/json/items/gun/metal_rail.json @@ -55,7 +55,7 @@ "clip_size": 1, "ups_charges": 40, "reload": 200, - "valid_mod_locations": [ [ "grip", 1 ], [ "sling", 1 ], [ "stock", 1 ], [ "sights", 1 ] ], + "valid_mod_locations": [ [ "grip", 1 ], [ "sling", 1 ], [ "stock", 1 ], [ "sights", 1 ], [ "rail mount", 1 ], [ "underbarrel mount", 1 ] ], "ammo_effects": [ "INCENDIARY", "TRAIL" ] } ] diff --git a/data/json/items/gun/nail.json b/data/json/items/gun/nail.json index 4eb69087af1af..40358228eae6d 100644 --- a/data/json/items/gun/nail.json +++ b/data/json/items/gun/nail.json @@ -20,7 +20,15 @@ "dispersion": 180, "durability": 5, "ups_charges": 5, - "valid_mod_locations": [ [ "accessories", 4 ], [ "grip", 1 ], [ "sights", 1 ], [ "sling", 1 ], [ "stock", 1 ] ], + "valid_mod_locations": [ + [ "accessories", 4 ], + [ "grip", 1 ], + [ "sights", 1 ], + [ "sling", 1 ], + [ "stock", 1 ], + [ "rail mount", 1 ], + [ "underbarrel mount", 1 ] + ], "magazines": [ [ "nail", [ "nailmag" ] ] ] }, { @@ -43,7 +51,8 @@ "durability": 8, "loudness": 5, "clip_size": 20, - "reload": 50 + "reload": 50, + "valid_mod_locations": [ [ "grip mount", 1 ], [ "rail mount", 1 ], [ "sights mount", 1 ], [ "stock mount", 1 ], [ "underbarrel mount", 1 ] ] }, { "id": "nailrifle", @@ -56,7 +65,16 @@ "skill": "rifle", "burst": 10, "clip_size": 0, - "valid_mod_locations": [ [ "accessories", 4 ], [ "barrel", 1 ], [ "grip", 1 ], [ "sights", 1 ], [ "sling", 1 ], [ "stock", 1 ] ], + "valid_mod_locations": [ + [ "accessories", 4 ], + [ "barrel", 1 ], + [ "grip", 1 ], + [ "sights", 1 ], + [ "sling", 1 ], + [ "stock", 1 ], + [ "rail mount", 1 ], + [ "underbarrel mount", 1 ] + ], "magazines": [ [ "nail", [ "nailmag" ] ] ], "relative": { "weight": 1000, "volume": 6, "range": 3, "ranged_damage": 4 }, "proportional": { "price": 3, "dispersion": 0.5 } diff --git a/data/json/items/gun/paintball.json b/data/json/items/gun/paintball.json index 8442e45d6795f..af27f4da5c571 100644 --- a/data/json/items/gun/paintball.json +++ b/data/json/items/gun/paintball.json @@ -22,6 +22,13 @@ "durability": 7, "clip_size": 50, "reload": 50, - "valid_mod_locations": [ [ "sling", 1 ] ] + "valid_mod_locations": [ + [ "sling", 1 ], + [ "grip mount", 1 ], + [ "rail mount", 1 ], + [ "sights mount", 1 ], + [ "stock mount", 1 ], + [ "underbarrel mount", 1 ] + ] } ] diff --git a/data/json/items/gun/shot.json b/data/json/items/gun/shot.json index f5b1f25cc3fdf..dba218e02bdcb 100644 --- a/data/json/items/gun/shot.json +++ b/data/json/items/gun/shot.json @@ -42,7 +42,15 @@ "durability": 6, "clip_size": 1, "reload": 80, - "valid_mod_locations": [ [ "accessories", 1 ], [ "grip", 1 ], [ "stock", 1 ], [ "mechanism", 4 ], [ "sights", 1 ] ], + "valid_mod_locations": [ + [ "accessories", 1 ], + [ "grip", 1 ], + [ "stock", 1 ], + [ "mechanism", 4 ], + [ "sights", 1 ], + [ "rail mount", 1 ], + [ "underbarrel mount", 1 ] + ], "flags": [ "NEVER_JAMS", "RELOAD_EJECT" ] }, { @@ -63,7 +71,15 @@ "burst": 6, "clip_size": 6, "reload": 110, - "valid_mod_locations": [ [ "accessories", 4 ], [ "grip", 1 ], [ "sights", 1 ], [ "sling", 1 ], [ "stock", 1 ] ], + "valid_mod_locations": [ + [ "accessories", 4 ], + [ "grip", 1 ], + [ "sights", 1 ], + [ "sling", 1 ], + [ "stock", 1 ], + [ "rail mount", 1 ], + [ "underbarrel mount", 1 ] + ], "flags": [ "RELOAD_ONE", "RELOAD_EJECT" ] }, { @@ -116,7 +132,17 @@ "durability": 8, "clip_size": 8, "built_in_mods": [ "lead_red_dot_sight", "lead_laser_sight" ], - "valid_mod_locations": [ [ "accessories", 2 ], [ "brass catcher", 1 ], [ "sights", 1 ], [ "sling", 1 ], [ "underbarrel", 1 ] ] + "valid_mod_locations": [ + [ "accessories", 2 ], + [ "brass catcher", 1 ], + [ "sights", 1 ], + [ "sling", 1 ], + [ "underbarrel", 1 ], + [ "muzzle", 1 ], + [ "grip mount", 1 ], + [ "rail mount", 1 ], + [ "stock mount", 1 ] + ] }, { "id": "m1014", @@ -164,6 +190,16 @@ "clip_size": 2, "modes": [ [ "DEFAULT", "single", 1 ], [ "DOUBLE", "double", 2 ] ], "relative": { "weight": 500, "volume": 1, "price": 5000 }, + "valid_mod_locations": [ + [ "accessories", 2 ], + [ "sling", 1 ], + [ "stock", 1 ], + [ "barrel", 1 ], + [ "grip mount", 1 ], + [ "rail mount", 1 ], + [ "sights mount", 1 ], + [ "underbarrel mount", 1 ] + ], "extend": { "flags": [ "RELOAD_ONE" ] } }, { @@ -184,7 +220,17 @@ "clip_size": 1, "reload": 200, "barrel_length": 4, - "valid_mod_locations": [ [ "accessories", 2 ], [ "sling", 1 ], [ "stock", 1 ], [ "barrel", 1 ] ], + "valid_mod_locations": [ + [ "accessories", 2 ], + [ "sling", 1 ], + [ "stock", 1 ], + [ "barrel", 1 ], + [ "muzzle", 1 ], + [ "grip mount", 1 ], + [ "rail mount", 1 ], + [ "sights mount", 1 ], + [ "underbarrel mount", 1 ] + ], "flags": [ "NEVER_JAMS", "RELOAD_EJECT" ] }, { @@ -222,7 +268,16 @@ "clip_size": 6, "reload": 200, "barrel_length": 4, - "valid_mod_locations": [ [ "accessories", 2 ], [ "sling", 1 ], [ "stock", 1 ], [ "barrel", 1 ] ], + "valid_mod_locations": [ + [ "accessories", 2 ], + [ "sling", 1 ], + [ "stock", 1 ], + [ "barrel", 1 ], + [ "grip mount", 1 ], + [ "rail mount", 1 ], + [ "sights mount", 1 ], + [ "underbarrel mount", 1 ] + ], "flags": [ "RELOAD_ONE", "NEVER_JAMS", "RELOAD_EJECT" ] }, { @@ -253,6 +308,17 @@ "clip_size": 2, "modes": [ [ "DEFAULT", "single", 1 ], [ "DOUBLE", "double", 2 ] ], "relative": { "weight": 500, "volume": 1, "price": 5000 }, + "valid_mod_locations": [ + [ "accessories", 4 ], + [ "barrel", 1 ], + [ "bore", 1 ], + [ "sights", 1 ], + [ "sling", 1 ], + [ "stock", 1 ], + [ "grip mount", 1 ], + [ "rail mount", 1 ], + [ "underbarrel mount", 1 ] + ], "extend": { "flags": [ "RELOAD_ONE" ] } }, { @@ -278,7 +344,10 @@ [ "muzzle", 1 ], [ "sights", 1 ], [ "sling", 1 ], - [ "stock", 1 ] + [ "stock", 1 ], + [ "grip mount", 1 ], + [ "rail mount", 1 ], + [ "underbarrel mount", 1 ] ], "flags": [ "NEVER_JAMS", "RELOAD_EJECT" ] }, @@ -300,7 +369,18 @@ "clip_size": 8, "reload": 200, "barrel_length": 4, - "valid_mod_locations": [ [ "accessories", 2 ], [ "brass catcher", 1 ], [ "sling", 1 ], [ "stock", 1 ], [ "barrel", 1 ] ], + "valid_mod_locations": [ + [ "accessories", 2 ], + [ "brass catcher", 1 ], + [ "sling", 1 ], + [ "stock", 1 ], + [ "barrel", 1 ], + [ "muzzle", 1 ], + [ "grip mount", 1 ], + [ "rail mount", 1 ], + [ "sights mount", 1 ], + [ "underbarrel mount", 1 ] + ], "flags": [ "RELOAD_ONE" ] } ] diff --git a/data/json/items/gun/signal_flare.json b/data/json/items/gun/signal_flare.json index 5aa9be4643700..d4312e4d3ab9f 100644 --- a/data/json/items/gun/signal_flare.json +++ b/data/json/items/gun/signal_flare.json @@ -17,7 +17,14 @@ "durability": 7, "loudness": 40, "clip_size": 1, - "valid_mod_locations": [ [ "accessories", 4 ], [ "grip", 1 ], [ "stock", 1 ] ], + "valid_mod_locations": [ + [ "accessories", 4 ], + [ "grip", 1 ], + [ "stock", 1 ], + [ "rail mount", 1 ], + [ "sights mount", 1 ], + [ "underbarrel mount", 1 ] + ], "flags": [ "WATERPROOF_GUN", "NEVER_JAMS", "RELOAD_EJECT" ] } ] diff --git a/data/json/items/gun/ups.json b/data/json/items/gun/ups.json index 2e150b7515e9d..f0982f7d7a614 100644 --- a/data/json/items/gun/ups.json +++ b/data/json/items/gun/ups.json @@ -58,7 +58,14 @@ "loudness": 8, "ups_charges": 25, "reload": 200, - "valid_mod_locations": [ [ "sling", 1 ] ], + "valid_mod_locations": [ + [ "sling", 1 ], + [ "grip mount", 1 ], + [ "rail mount", 1 ], + [ "sights mount", 1 ], + [ "stock mount", 1 ], + [ "underbarrel mount", 1 ] + ], "ammo_effects": [ "LASER", "INCENDIARY" ], "flags": [ "NO_UNLOAD" ] }, diff --git a/data/json/items/gunmod/grip.json b/data/json/items/gunmod/grip.json index 69703b435a96a..ffdb5e500ff8b 100644 --- a/data/json/items/gunmod/grip.json +++ b/data/json/items/gunmod/grip.json @@ -31,7 +31,7 @@ "symbol": ":", "color": "dark_gray", "location": "grip", - "mod_targets": [ "smg", "rifle", "pistol", "shotgun", "crossbow", "launcher" ], + "mod_targets": [ "smg", "rifle", "pistol", "shotgun", "crossbow", "launcher", "bow" ], "handling_modifier": 2, "min_skills": [ [ "weapon", 2 ] ] } diff --git a/data/json/items/gunmod/mount.json b/data/json/items/gunmod/mount.json new file mode 100644 index 0000000000000..0f3cf6a6c46e4 --- /dev/null +++ b/data/json/items/gunmod/mount.json @@ -0,0 +1,130 @@ +[ + { + "id": "grip_mount", + "type": "GUNMOD", + "name": "replaceable furniture kit", + "description": "This is a kit consisting of various steel and plastic parts; when installed, it would permanently modify and partially replace some of the weapon's furniture so that it could be easily changed if needed. This allows installing any kind of more advanced grips or other furniture.", + "weight": 80, + "volume": "50ml", + "integral_volume": 0, + "price": 6000, + "material": [ "steel", "plastic" ], + "symbol": ":", + "color": "light_gray", + "location": "grip mount", + "mod_targets": [ "smg", "rifle", "pistol", "shotgun", "crossbow", "launcher" ], + "install_time": 60000, + "min_skills": [ [ "gun", 5 ] ], + "add_mod": [ [ "grip", 1 ] ], + "flags": [ "INSTALL_DIFFICULT", "IRREMOVABLE" ] + }, + { + "id": "rail_mount", + "type": "GUNMOD", + "name": "side mount", + "description": "This is a plastic mount for attaching a rail accessory, designed to be permanently installed onto almost any weapon, along with some fasteners. Ideal for bringing out your inner tacticool on older guns.", + "weight": 10, + "volume": "8ml", + "price": 6000, + "material": [ "steel", "plastic" ], + "symbol": ":", + "color": "light_gray", + "location": "rail mount", + "mod_targets": [ "smg", "rifle", "pistol", "shotgun", "crossbow", "launcher" ], + "install_time": 15000, + "min_skills": [ [ "gun", 3 ] ], + "add_mod": [ [ "rail", 1 ] ], + "flags": [ "INSTALL_DIFFICULT", "IRREMOVABLE" ] + }, + { + "id": "sights_mount", + "type": "GUNMOD", + "name": "sights mount", + "description": "This is a plastic mount for attaching a sight, designed to be permanently installed onto almost any weapon other than launchers and pistols, along with some fasteners. Ideal for bringing out your inner tacticool on older guns.", + "weight": 10, + "volume": "8ml", + "price": 6000, + "material": [ "steel", "plastic" ], + "symbol": ":", + "color": "light_gray", + "location": "sights mount", + "mod_targets": [ "smg", "rifle", "shotgun", "crossbow" ], + "install_time": 15000, + "min_skills": [ [ "gun", 3 ] ], + "add_mod": [ [ "sights", 1 ] ], + "flags": [ "INSTALL_DIFFICULT", "IRREMOVABLE" ] + }, + { + "id": "sights_mount_launcher", + "type": "GUNMOD", + "name": "launcher sights mount", + "description": "This is a plastic mount for attaching a sight, designed to be permanently installed onto almost any launcher, along with some fasteners. Ideal for bringing out your inner tacticool on rocket launchers.", + "weight": 60, + "volume": "80ml", + "price": 6000, + "material": [ "steel", "plastic" ], + "symbol": ":", + "color": "light_gray", + "location": "sights mount", + "mod_targets": [ "launcher" ], + "install_time": 15000, + "min_skills": [ [ "gun", 3 ] ], + "add_mod": [ [ "sights", 1 ] ], + "flags": [ "INSTALL_DIFFICULT", "IRREMOVABLE" ] + }, + { + "id": "sights_mount_pistol", + "type": "GUNMOD", + "name": "pistol sights mount", + "description": "This is a plastic mount for attaching a sight, designed to be permanently installed onto almost any pistol, along with some fasteners. Ideal for bringing out your inner tacticool on pocket pistols.", + "weight": 60, + "volume": "80ml", + "price": 6000, + "material": [ "steel", "plastic" ], + "symbol": ":", + "color": "light_gray", + "location": "sights mount", + "mod_targets": [ "pistol" ], + "install_time": 15000, + "min_skills": [ [ "gun", 3 ] ], + "add_mod": [ [ "sights", 1 ] ], + "flags": [ "INSTALL_DIFFICULT", "IRREMOVABLE" ] + }, + { + "id": "stock_mount", + "type": "GUNMOD", + "name": "replaceable stock kit", + "description": "This is a kit consisting of various steel parts; when installed, it would remove the weapon's original fixed stock, install a new stock mount on its place, modify original stock to fit it and then reattach it to the gun, or simply attach a stock mount if gun had no stock to start with. This allows easy installation of any kind of more advanced stocks.", + "weight": 80, + "volume": "50ml", + "integral_volume": 0, + "price": 6000, + "material": [ "steel" ], + "symbol": ":", + "color": "light_gray", + "location": "stock mount", + "mod_targets": [ "smg", "rifle", "pistol", "shotgun", "crossbow", "launcher" ], + "install_time": 60000, + "min_skills": [ [ "gun", 5 ] ], + "add_mod": [ [ "stock", 1 ] ], + "flags": [ "INSTALL_DIFFICULT", "IRREMOVABLE" ] + }, + { + "id": "underbarrel_mount", + "type": "GUNMOD", + "name": "bottom mount", + "description": "This is a plastic mount for attaching an underbarrel accessory, designed to be permanently installed onto almost any weapon, along with some fasteners. Ideal for bringing out your inner tacticool on older guns.", + "weight": 10, + "volume": "8ml", + "price": 6000, + "material": [ "steel", "plastic" ], + "symbol": ":", + "color": "light_gray", + "location": "underbarrel mount", + "mod_targets": [ "smg", "rifle", "pistol", "shotgun", "crossbow", "launcher", "bow" ], + "install_time": 15000, + "min_skills": [ [ "gun", 3 ] ], + "add_mod": [ [ "underbarrel", 1 ] ], + "flags": [ "INSTALL_DIFFICULT", "IRREMOVABLE" ] + } +] diff --git a/data/json/items/magazine/357sig.json b/data/json/items/magazine/357sig.json index 28655705f4903..af391cdd2c634 100644 --- a/data/json/items/magazine/357sig.json +++ b/data/json/items/magazine/357sig.json @@ -14,5 +14,22 @@ "capacity": 15, "reliability": 9, "flags": [ "MAG_COMPACT" ] + }, + { + "id": "p320mag_14rd_357sig", + "type": "MAGAZINE", + "name": "P320 magazine .357 SIG", + "description": "A 14 round double stack box magazine for the SIG Sauer P320.", + "weight": 105, + "volume": 1, + "price": 2900, + "material": "plastic", + "symbol": "#", + "color": "light_gray", + "ammo_type": "357sig", + "capacity": 14, + "reliability": 7, + "reload_time": 140, + "flags": [ "MAG_COMPACT" ] } ] diff --git a/data/json/items/magazine/38super.json b/data/json/items/magazine/38super.json new file mode 100644 index 0000000000000..72a357f639ebb --- /dev/null +++ b/data/json/items/magazine/38super.json @@ -0,0 +1,18 @@ +[ + { + "id": "m1911mag_10rd_38super", + "type": "MAGAZINE", + "name": "M1911 .38 Super magazine", + "description": "A compact single stack box magazine for the M1911.", + "weight": 80, + "volume": 1, + "price": 3400, + "material": "steel", + "symbol": "#", + "color": "light_gray", + "ammo_type": "38super", + "capacity": 10, + "reliability": 8, + "flags": [ "MAG_COMPACT" ] + } +] diff --git a/data/json/items/magazine/410shot.json b/data/json/items/magazine/410shot.json new file mode 100644 index 0000000000000..9df762d74f73d --- /dev/null +++ b/data/json/items/magazine/410shot.json @@ -0,0 +1,35 @@ +[ + { + "id": "saiga410mag_10rd", + "type": "MAGAZINE", + "name": "Saiga-410 box magazine", + "description": "A removable plastic box magazine for the Saiga-410 shotgun. Holds 10 shells.", + "weight": 210, + "volume": 2, + "price": 4500, + "material": "plastic", + "symbol": "#", + "color": "dark_gray", + "ammo_type": "410shot", + "capacity": 10, + "reliability": 9, + "flags": [ "MAG_COMPACT" ] + }, + { + "id": "saiga410mag_30rd", + "type": "MAGAZINE", + "name": "Saiga-410 drum magazine", + "description": "A removable plastic drum magazine for the Saiga-410 shotgun. Holds 30 shells.", + "weight": 460, + "volume": 4, + "price": 11000, + "material": "plastic", + "symbol": "#", + "color": "dark_gray", + "ammo_type": "410shot", + "capacity": 30, + "reliability": 8, + "reload_time": 130, + "flags": [ "MAG_BULKY" ] + } +] diff --git a/data/json/items/magazine/9mm.json b/data/json/items/magazine/9mm.json index a884c4526d9d3..d2a54476fdb59 100644 --- a/data/json/items/magazine/9mm.json +++ b/data/json/items/magazine/9mm.json @@ -307,5 +307,22 @@ "capacity": 7, "reliability": 9, "flags": [ "MAG_COMPACT" ] + }, + { + "id": "p320mag_17rd_9x19mm", + "type": "MAGAZINE", + "name": "P320 magazine 9x19mm", + "description": "A 17 round double stack box magazine for the SIG Sauer P320.", + "weight": 105, + "volume": 1, + "price": 2900, + "material": "plastic", + "symbol": "#", + "color": "light_gray", + "ammo_type": "9mm", + "capacity": 17, + "reliability": 7, + "reload_time": 140, + "flags": [ "MAG_COMPACT" ] } ] diff --git a/data/json/items/melee.json b/data/json/items/melee.json index b10cfad176540..eb564d0434cbb 100644 --- a/data/json/items/melee.json +++ b/data/json/items/melee.json @@ -19,7 +19,7 @@ "type": "GENERIC", "id": "scythe_war", "name": "war scythe", - "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.", + "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, "volume": 13, "price": 16000, @@ -831,7 +831,7 @@ "id": "naginata_fake", "name": "naginata", "name_plural": "naginata", - "description": "This is a dull, slightly floppy replica of a Japanese polearm with a curved blade. With a little difficulty, you could use it administer a solid slap from a distance.", + "description": "This is a dull, slightly floppy replica of a Japanese polearm with a curved blade. With a little difficulty, you could use it administer a solid slap from a distance.", "weight": 1400, "color": "light_gray", "symbol": "/", @@ -1949,7 +1949,7 @@ "symbol": "/", "color": "light_gray", "name": "estoc", - "description": "This is a thin sword resembling a longsword, a sort of predecessor to the rapier. It requires a larger baldric or scabbard, compared to smaller swords.", + "description": "This is a thin thrusting sword, a sort of predecessor to the rapier. It requires a larger baldric or scabbard, compared to smaller swords.", "price": 135000, "material": "steel", "techniques": [ "WBLOCK_2", "PRECISE" ], @@ -1962,13 +1962,32 @@ "category": "weapons", "qualities": [ [ "CUT", 1 ], [ "BUTCHER", 8 ] ] }, + { + "id": "estoc_inferior", + "type": "GENERIC", + "symbol": "/", + "color": "light_gray", + "name": "estoc", + "description": "This is a thin thrusting sword, a sort of predecessor to the rapier. It requires a larger baldric or scabbard, compared to smaller swords. It seems a bit too bendy.", + "price": 13500, + "price_postapoc": 0, + "material": "budget_steel", + "techniques": [ "WBLOCK_2", "PRECISE" ], + "flags": "SHEATH_SWORD", + "weight": 1814, + "volume": 11, + "bashing": 4, + "cutting": 30, + "to_hit": 2, + "category": "weapons" + }, { "id": "estoc_fake", "type": "GENERIC", "symbol": "/", "color": "light_gray", "name": "estoc", - "description": "This is a dull, cheaply-made replica of a thin sword resembling a longsword. It requires a larger baldric or scabbard, compared to smaller swords.", + "description": "This is a dull, cheaply-made replica of a thin thrusting sword predating the rapier. It requires a larger baldric or scabbard, compared to smaller swords.", "price": 13500, "price_postapoc": 0, "material": "aluminum", @@ -2284,6 +2303,57 @@ "qualities": [ [ "CUT", 1 ], [ "CUT_FINE", 1 ], [ "BUTCHER", 7 ] ], "flags": [ "STAB", "SHEATH_KNIFE" ] }, + { + "type": "TOOL", + "category": "weapons", + "id": "grip_hook", + "name": "grip hook", + "description": "A simple steel meathook with a circular steel handle. Makes a passable melee weapon.", + "weight": 900, + "to_hit": 1, + "color": "light_gray", + "symbol": "?", + "material": [ "steel" ], + "techniques": [ "DEF_DISARM", "SWEEP" ], + "flags": [ "DURABLE_MELEE", "BELT_CLIP", "STAB" ], + "volume": 3, + "bashing": 2, + "cutting": 6, + "price": 2000, + "qualities": [ [ "HAMMER", 1 ], [ "BUTCHER", -5 ] ] + }, + { + "id": "2h_flail_steel", + "type": "GENERIC", + "category": "weapons", + "name": "war flail", + "description": "This is a stout pole with a large steel flanged mace head on a short chain attached to it, based on the peasant flail agricultural tool except now with a metal head and made to thresh people in metal armor rather than grain.", + "weight": 4550, + "volume": 15, + "price": 25000, + "bashing": 40, + "material": [ "wood", "steel" ], + "symbol": "\\", + "color": "dark_gray", + "techniques": [ "WBLOCK_1", "BRUTAL" ], + "flags": [ "DURABLE_MELEE", "REACH_ATTACK", "NONCONDUCTIVE" ] + }, + { + "id": "2h_flail_wood", + "type": "GENERIC", + "category": "weapons", + "name": "peasant flail", + "description": "This is a stout pole with a wooden club on a leather cord attached to it, this is a tool used to thresh wheat and occasionally people when the peasants got angry at their feudal lords.", + "weight": 1700, + "volume": 15, + "price": 4000, + "bashing": 19, + "material": [ "wood" ], + "symbol": "\\", + "color": "brown", + "techniques": [ "WBLOCK_1" ], + "flags": [ "REACH_ATTACK", "NONCONDUCTIVE" ] + }, { "id": "butterfly_swords", "type": "TOOL", @@ -2324,5 +2394,43 @@ "price": 4000, "price_postapoc": 8000, "qualities": [ [ "HAMMER", 1 ] ] + }, + { + "id": "ji", + "type": "GENERIC", + "name": "ji", + "name_plural": "ji", + "//": "Couldn't find a good way to pluralize the transliteration.", + "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, + "volume": 15, + "price": 50000, + "to_hit": 2, + "bashing": 16, + "cutting": 20, + "material": [ "wood", "bronze" ], + "symbol": "/", + "color": "yellow", + "techniques": [ "WBLOCK_1", "DEF_DISARM" ], + "flags": [ "DURABLE_MELEE", "REACH_ATTACK" ] + }, + { + "id": "spear_dory", + "type": "GENERIC", + "name": "dory", + "name_plural": "dories", + "description": "A well-made spear with a bronze head, Greek in origin.", + "weight": 1598, + "volume": 14, + "price": 10000, + "to_hit": 2, + "bashing": 5, + "cutting": 27, + "material": [ "bronze", "wood" ], + "symbol": "/", + "color": "yellow", + "techniques": [ "WBLOCK_1", "IMPALE" ], + "qualities": [ [ "COOK", 1 ] ], + "flags": [ "SPEAR", "REACH_ATTACK", "DURABLE_MELEE" ] } ] diff --git a/data/json/items/migration.json b/data/json/items/migration.json index 0e952f408c11a..734c1637087e3 100644 --- a/data/json/items/migration.json +++ b/data/json/items/migration.json @@ -571,5 +571,30 @@ "id": "hd_battery", "type": "MIGRATION", "replace": "heavy_plus_battery_cell" + }, + { + "id": "frozen_burrito", + "type": "MIGRATION", + "replace": "junk_burrito" + }, + { + "id": "cooked_burrito", + "type": "MIGRATION", + "replace": "junk_burrito" + }, + { + "id": "10mm", + "type": "MIGRATION", + "replace": "10mm_fmj" + }, + { + "id": "270", + "type": "MIGRATION", + "replace": "270win_jsp" + }, + { + "id": "reloaded_270", + "type": "MIGRATION", + "replace": "reloaded_270win_jsp" } ] diff --git a/data/json/items/ranged.json b/data/json/items/ranged.json index 10e780eede30f..8de9a8dd5bd95 100644 --- a/data/json/items/ranged.json +++ b/data/json/items/ranged.json @@ -23,7 +23,15 @@ "durability": 7, "clip_size": 150, "reload": 50, - "valid_mod_locations": [ [ "accessories", 4 ], [ "sights", 1 ], [ "sling", 1 ], [ "stock", 1 ] ] + "valid_mod_locations": [ + [ "accessories", 4 ], + [ "sights", 1 ], + [ "sling", 1 ], + [ "stock", 1 ], + [ "grip mount", 1 ], + [ "rail mount", 1 ], + [ "underbarrel mount", 1 ] + ] }, { "id": "sling", @@ -66,7 +74,8 @@ "range": 5, "dispersion": 75, "durability": 6, - "clip_size": 1 + "clip_size": 1, + "valid_mod_locations": [ [ "grip mount", 1 ], [ "underbarrel mount", 1 ] ] }, { "id": "wristrocket", @@ -87,7 +96,8 @@ "range": 8, "dispersion": 45, "durability": 7, - "clip_size": 1 + "clip_size": 1, + "valid_mod_locations": [ [ "grip mount", 1 ], [ "underbarrel mount", 1 ] ] }, { "id": "bullet_crossbow", @@ -263,7 +273,15 @@ "loudness": 25, "barrel_length": 2, "built_in_mods": [ "combination_gun_shotgun_pipe" ], - "valid_mod_locations": [ [ "muzzle", 1 ], [ "sling", 1 ], [ "stock", 1 ] ] + "valid_mod_locations": [ + [ "muzzle", 1 ], + [ "sling", 1 ], + [ "stock", 1 ], + [ "grip mount", 1 ], + [ "rail mount", 1 ], + [ "sights mount", 1 ], + [ "underbarrel mount", 1 ] + ] }, { "id": "tihar", @@ -290,7 +308,16 @@ "clip_size": 15, "reload": 1000, "loudness": 18, - "valid_mod_locations": [ [ "accessories", 4 ], [ "grip", 1 ], [ "mechanism", 4 ], [ "sights", 1 ], [ "sling", 1 ], [ "stock", 1 ] ] + "valid_mod_locations": [ + [ "accessories", 4 ], + [ "grip", 1 ], + [ "mechanism", 4 ], + [ "sights", 1 ], + [ "sling", 1 ], + [ "stock", 1 ], + [ "rail mount", 1 ], + [ "underbarrel mount", 1 ] + ] }, { "id": "helsing", @@ -316,7 +343,16 @@ "clip_size": 8, "reload": 1000, "loudness": 22, - "valid_mod_locations": [ [ "accessories", 4 ], [ "grip", 1 ], [ "mechanism", 4 ], [ "sights", 1 ], [ "sling", 1 ], [ "stock", 1 ] ] + "valid_mod_locations": [ + [ "accessories", 4 ], + [ "grip", 1 ], + [ "mechanism", 4 ], + [ "sights", 1 ], + [ "sling", 1 ], + [ "stock", 1 ], + [ "rail mount", 1 ], + [ "underbarrel mount", 1 ] + ] }, { "id": "pneumatic_shotgun", @@ -368,7 +404,7 @@ "durability": 7, "clip_size": 1, "reload": 800, - "valid_mod_locations": [ [ "sling", 1 ] ] + "valid_mod_locations": [ [ "sling", 1 ], [ "grip mount", 1 ], [ "rail mount", 1 ], [ "sights mount", 1 ], [ "underbarrel mount", 1 ] ] }, { "id": "m202_flash", @@ -394,7 +430,15 @@ "clip_size": 4, "reload": 600, "loudness": 200, - "valid_mod_locations": [ [ "accessories", 4 ], [ "grip", 1 ], [ "mechanism", 4 ], [ "sights", 1 ], [ "sling", 1 ] ] + "valid_mod_locations": [ + [ "accessories", 4 ], + [ "grip", 1 ], + [ "mechanism", 4 ], + [ "sights", 1 ], + [ "sling", 1 ], + [ "rail mount", 1 ], + [ "underbarrel mount", 1 ] + ] }, { "id": "RPG", @@ -419,7 +463,15 @@ "durability": 10, "clip_size": 1, "reload": 150, - "valid_mod_locations": [ [ "accessories", 4 ], [ "grip", 1 ], [ "mechanism", 4 ], [ "sights", 1 ], [ "sling", 1 ] ] + "valid_mod_locations": [ + [ "accessories", 4 ], + [ "grip", 1 ], + [ "mechanism", 4 ], + [ "sights", 1 ], + [ "sling", 1 ], + [ "rail mount", 1 ], + [ "underbarrel mount", 1 ] + ] }, { "id": "speargun", @@ -444,7 +496,15 @@ "durability": 8, "clip_size": 1, "reload": 700, - "valid_mod_locations": [ [ "accessories", 4 ], [ "grip", 1 ], [ "sights", 1 ], [ "sling", 1 ], [ "stock", 1 ] ] + "valid_mod_locations": [ + [ "accessories", 4 ], + [ "grip", 1 ], + [ "sights", 1 ], + [ "sling", 1 ], + [ "stock", 1 ], + [ "rail mount", 1 ], + [ "underbarrel mount", 1 ] + ] }, { "id": "minispeargun", @@ -467,7 +527,14 @@ "durability": 8, "clip_size": 1, "reload": 600, - "valid_mod_locations": [ [ "accessories", 2 ], [ "grip", 1 ], [ "sights", 1 ], [ "stock", 1 ] ] + "valid_mod_locations": [ + [ "accessories", 2 ], + [ "grip", 1 ], + [ "sights", 1 ], + [ "stock", 1 ], + [ "rail mount", 1 ], + [ "underbarrel mount", 1 ] + ] }, { "id": "doublespeargun", @@ -492,7 +559,15 @@ "durability": 7, "clip_size": 2, "reload": 700, - "valid_mod_locations": [ [ "accessories", 4 ], [ "grip", 1 ], [ "sights", 1 ], [ "sling", 1 ], [ "stock", 1 ] ] + "valid_mod_locations": [ + [ "accessories", 4 ], + [ "grip", 1 ], + [ "sights", 1 ], + [ "sling", 1 ], + [ "stock", 1 ], + [ "rail mount", 1 ], + [ "underbarrel mount", 1 ] + ] }, { "id": "airspeargun", @@ -518,7 +593,15 @@ "clip_size": 4, "reload": 1000, "loudness": 11, - "valid_mod_locations": [ [ "accessories", 4 ], [ "grip", 1 ], [ "sights", 1 ], [ "sling", 1 ], [ "stock", 1 ] ] + "valid_mod_locations": [ + [ "accessories", 4 ], + [ "grip", 1 ], + [ "sights", 1 ], + [ "sling", 1 ], + [ "stock", 1 ], + [ "rail mount", 1 ], + [ "underbarrel mount", 1 ] + ] }, { "id": "combination_gun", @@ -552,7 +635,8 @@ [ "sights", 1 ], [ "sling", 1 ], [ "stock", 1 ], - [ "underbarrel", 1 ] + [ "underbarrel", 1 ], + [ "rail mount", 1 ] ] }, { @@ -578,7 +662,7 @@ "clip_size": 1, "reload": 800, "loudness": 200, - "valid_mod_locations": [ [ "sling", 1 ] ] + "valid_mod_locations": [ [ "sling", 1 ], [ "grip mount", 1 ], [ "rail mount", 1 ], [ "sights mount", 1 ], [ "underbarrel mount", 1 ] ] }, { "id": "watercannon", diff --git a/data/json/items/resources/metals.json b/data/json/items/resources/metals.json index 1c880b9fb5d5e..f611e461e6933 100644 --- a/data/json/items/resources/metals.json +++ b/data/json/items/resources/metals.json @@ -199,5 +199,39 @@ "color": "light_gray", "ammo_type": "components", "qualities": [ [ "HAMMER", 1 ] ] + }, + { + "id": "hinge", + "type": "AMMO", + "category": "spare_parts", + "name": "door hinge", + "description": "A small metal hinge with two metal plates with screw holes. Useful for making doors.", + "weight": 300, + "volume": 1, + "price": 3000, + "bashing": 5, + "to_hit": -3, + "stack_size": 6, + "//": "Roughly in the 8cm×8cm to 10cm×10cm range. Compact and stacks well", + "material": "steel", + "symbol": "%", + "color": "light_cyan", + "ammo_type": "components" + }, + { + "type": "material", + "ident": "bronze", + "name": "Bronze", + "density": 58, + "bash_resist": 4, + "cut_resist": 5, + "acid_resist": 1, + "fire_resist": 2, + "elec_resist": 0, + "chip_resist": 15, + "salvaged_into": "scrap_bronze", + "dmg_adj": [ "marked", "dented", "smashed", "shattered" ], + "bash_dmg_verb": "dented", + "cut_dmg_verb": "scratched" } ] diff --git a/data/json/items/tool_armor.json b/data/json/items/tool_armor.json index 2f7d95ffacff1..e5e87566aa88f 100644 --- a/data/json/items/tool_armor.json +++ b/data/json/items/tool_armor.json @@ -2034,6 +2034,49 @@ "coverage": 10, "material_thickness": 2 }, + { + "type": "TOOL_ARMOR", + "id": "guitar_electric", + "name": "electric guitar", + "category": "tools", + "weight": 2250, + "color": "red", + "covers": [ "TORSO" ], + "to_hit": 2, + "max_charges": 1, + "initial_charges": 1, + "use_action": { + "type": "musical_instrument", + "speed_penalty": 15, + "volume": 20, + "fun": 2, + "fun_bonus": 2, + "description_frequency": 20, + "player_descriptions": [ + "You plink out a shredding solo on your guitar.", + "You play an epic classic rock riff on your guitar.", + "You play a furious, muted riff on your guitar.", + "You play a crunchy stoner tune on your guitar.", + "You play an old Britpop song on your guitar.", + "You play a tasteful classical piece on your guitar.", + "You play a jangly folk ditty on your guitar.", + "You play a melancholy melody on your guitar." + ] + }, + "symbol": "-", + "description": "A standard factory-made electric guitar. It's probably better at smashing heads than melting faces, these days. Has a strap.", + "price": 1000, + "price_postapoc": 500, + "//": "Electric guitar less awesome when there's no electricity.", + "material": [ "wood", "iron" ], + "volume": 27, + "warmth": 2, + "encumbrance": 27, + "bashing": 8, + "flags": [ "BELTED" ], + "coverage": 10, + "material_thickness": 2 + }, { "type": "TOOL_ARMOR", "id": "bagpipes", @@ -2528,5 +2571,66 @@ "power_draw": 100000, "use_action": { "type": "transform", "msg": "You turn the blanket's heating elements off.", "target": "electric_blanket" }, "magazine_well": 2 + }, + { + "id": "foodperson_mask", + "type": "TOOL_ARMOR", + "name": "Foodperson mask", + "description": "Foodperson, the mascot your stomach deserves!", + "weight": 1500, + "volume": "16L", + "price": 1500, + "to_hit": -3, + "material": [ "cotton", "plastic" ], + "symbol": "Q", + "color": "pink", + "covers": [ "HEAD", "MOUTH", "EYES" ], + "coverage": 100, + "encumbrance": 30, + "warmth": 50, + "material_thickness": 5, + "environmental_protection": 2, + "charges_per_use": 1, + "ammo": "battery", + "use_action": { + "type": "transform", + "msg": "Your HUD lights-up: \"Greetings Foodperson, your shift begins now. Good luck!\"", + "target": "foodperson_mask_on", + "active": true, + "need_worn": true, + "need_charges": 1, + "need_charges_msg": "The mask's batteries are dead." + }, + "magazines": [ + [ + "battery", + [ + "medium_battery_cell", + "medium_plus_battery_cell", + "medium_atomic_battery_cell", + "medium_disposable_cell", + "light_battery_cell", + "light_plus_battery_cell", + "light_minus_battery_cell", + "light_atomic_battery_cell", + "light_minus_atomic_battery_cell", + "light_minus_disposable_cell", + "light_disposable_cell" + ] + ] + ], + "magazine_well": 2, + "flags": [ "OUTER", "SUN_GLASSES" ] + }, + { + "id": "foodperson_mask_on", + "type": "TOOL_ARMOR", + "name": "Foodperson mask (on)", + "name_plural": "Foodperson masks (on)", + "copy-from": "foodperson_mask", + "turns_per_charge": 15, + "revert_to": "foodperson_mask", + "use_action": "FOODPERSON", + "flags": [ "OUTER", "SUN_GLASSES", "NO_TAKEOFF", "LIGHT_10", "WATCH", "NO_UNLOAD" ] } ] diff --git a/data/json/items/tools.json b/data/json/items/tools.json index 606ae5b7f556b..a929f1c1d0039 100644 --- a/data/json/items/tools.json +++ b/data/json/items/tools.json @@ -3608,8 +3608,8 @@ "type": "explosion", "fields_type": "fd_tear_gas", "fields_radius": 3, - "fields_min_density": 1, - "fields_max_density": 3, + "fields_min_intensity": 1, + "fields_max_intensity": 3, "sound_volume": 0, "sound_msg": "Tick.", "no_deactivate_msg": "You've already pulled the %s's pin, try throwing it instead." @@ -3817,8 +3817,8 @@ "type": "explosion", "fields_type": "fd_toxic_gas", "fields_radius": 2, - "fields_min_density": 1, - "fields_max_density": 3, + "fields_min_intensity": 1, + "fields_max_intensity": 3, "sound_volume": 0, "sound_msg": "Hiss.", "no_deactivate_msg": "You've already armed the %s, try throwing it instead." @@ -4821,14 +4821,25 @@ "use_action": { "type": "firestarter", "moves": 50 }, "flags": [ "FIRESTARTER" ] }, + { + "abstract": "lightstrip_base", + "type": "TOOL", + "name": "lightstrip_base", + "weight": 27, + "volume": 1, + "price": 500, + "to_hit": 2, + "bashing": 1, + "material": [ "plastic", "aluminum" ], + "symbol": ";" + }, { "id": "lightstrip", "type": "TOOL", "name": "lightstrip", - "copy-from": "lightstrip_inactive", "name_plural": "lightstrips", + "copy-from": "lightstrip_base", "description": "This is a light-emitting circuit that has been wired directly to a battery. It provides some weak light and can't be turned off until the battery dies.", - "symbol": ";", "color": "green", "power_draw": 1000, "revert_to": "lightstrip_inactive", @@ -4841,17 +4852,17 @@ "type": "TOOL", "name": "lightstrip (inactive)", "name_plural": "lightstrips (inactive)", + "copy-from": "lightstrip_base", "description": "This is a light-emitting circuit that can be wired directly to a battery. It provides some weak light and can't be turned off until the battery dies.", - "weight": 27, - "volume": 1, - "price": 500, - "to_hit": 2, - "bashing": 1, - "material": [ "plastic", "aluminum" ], - "symbol": ";", "color": "white", "ammo": "battery", - "use_action": { "target": "lightstrip", "msg": "You irreversibly activate the lightstrip.", "active": true, "type": "transform" }, + "use_action": { + "target": "lightstrip", + "msg": "You irreversibly activate the lightstrip.", + "active": true, + "need_charges": 1, + "type": "transform" + }, "magazines": [ [ "battery", @@ -5274,8 +5285,8 @@ "type": "explosion", "fields_type": "fd_nuke_gas", "fields_radius": 18, - "fields_min_density": 3, - "fields_max_density": 3, + "fields_min_intensity": 3, + "fields_max_intensity": 3, "sound_volume": 2, "sound_msg": "Tick.", "no_deactivate_msg": "You've already set the %s's timer, you might want to get away from it.", @@ -8118,8 +8129,8 @@ "type": "explosion", "fields_type": "fd_smoke", "fields_radius": 2, - "fields_min_density": 2, - "fields_max_density": 3, + "fields_min_intensity": 2, + "fields_max_intensity": 3, "sound_volume": 5, "sound_msg": "Hsssss.", "no_deactivate_msg": "You've already lit the fuse - get rid of it immediately!", @@ -9149,6 +9160,82 @@ "looks_like": "frame_wood_light", "flags": [ "NONCONDUCTIVE" ] }, + { + "id": "sword_xiphos", + "type": "TOOL", + "category": "weapons", + "name": "xiphos", + "name_plural": "xiphoses", + "description": "A bronze sword of ancient Greek origin, wielded as a sidearm to the dory spear.", + "weight": 800, + "volume": 8, + "price": 12000, + "to_hit": 2, + "bashing": 8, + "cutting": 20, + "material": "bronze", + "symbol": "!", + "color": "yellow", + "techniques": [ "WBLOCK_2" ], + "qualities": [ [ "CUT", 1 ], [ "BUTCHER", 8 ] ], + "flags": [ "SHEATH_SWORD", "DURABLE_MELEE" ] + }, + { + "id": "khopesh", + "type": "TOOL", + "category": "weapons", + "name": "khopesh", + "name_plural": "khopeshes", + "description": "This ancient bronze weapon features a curved, sickle-like blade sharpened on the outside edge. Associated with the New Kingdom period of ancient Egypt, it was designed mainly to hack through the light armor common to the region.", + "weight": 750, + "volume": 7, + "price": 12000, + "to_hit": 1, + "bashing": 7, + "cutting": 19, + "material": "bronze", + "symbol": "/", + "color": "yellow", + "techniques": [ "WBLOCK_2", "DEF_DISARM" ], + "qualities": [ [ "CUT", 1 ], [ "BUTCHER", 8 ] ], + "flags": [ "DURABLE_MELEE" ] + }, + { + "id": "dao", + "type": "TOOL", + "category": "weapons", + "name": "dao", + "name_plural": "dao", + "description": "An ancient Chinese sword consisting of a curved blade and a guard with a cupped design. Existing since the Shang dynasty, this one is made of bronze. One of the four major weapons in folklore, alongside the jian sword, qiang spear, and gun staff.", + "weight": 850, + "volume": 7, + "price": 12500, + "to_hit": 2, + "bashing": 6, + "cutting": 18, + "material": "bronze", + "symbol": "/", + "color": "yellow", + "techniques": [ "WBLOCK_2" ], + "qualities": [ [ "CUT", 1 ], [ "BUTCHER", 8 ] ], + "flags": [ "DURABLE_MELEE", "SHEATH_SWORD" ] + }, + { + "id": "anvil_bronze", + "type": "TOOL", + "name": "bronze anvil", + "description": "This is a block of oddly shaped bronze with a chisel-like projection set into the corner. It's used in most metalworking fabrication recipes.", + "weight": 2180, + "volume": 10, + "price": 60000, + "to_hit": -5, + "bashing": 20, + "material": "bronze", + "symbol": ";", + "color": "yellow", + "qualities": [ [ "ANVIL", 2 ] ], + "flags": [ "DURABLE_MELEE" ] + }, { "id": "hand_axe", "type": "TOOL", diff --git a/data/json/mapgen/apartment_con.json b/data/json/mapgen/apartment_con.json index ecadd230d5531..ac3b1674f0974 100644 --- a/data/json/mapgen/apartment_con.json +++ b/data/json/mapgen/apartment_con.json @@ -6,20 +6,20 @@ "rows": [ " ", " |------|-|-|ww---| |---ww|-|-|------| ", - " |.dBBd.+r|u+..eSc|-w--w-|cSe..+u|r+.dBBd.| ", - " w..BB..|-|-|....c|.....l|c....|-|-|..BB..w ", + " |.dBBd.+r|u+..e3u|-w--w-|u3e..+u|r+.dBBd.| ", + " w..BB..|-|-|....2|.....l|2....|-|-|..BB..w ", " w.h....|STb|....O|.hc..l|O....|bTS|......w ", - " |cxc...+.fb|..ccc|cxc...|ccc..|bf.+....d.| ", + " |cxc...+.fb|..uu1|cxc...|1uu..|bf.+....d.| ", " |--|-+-|-+-|....Q|-ww-D-|.QQ..|-+-|-+-|--| ", " RssX.............|^.....|.............XssR ", " Rssw..F..........D......D.............wssR ", " Rssw..F.......|+-|......|-+|..........wssR ", " Rss|..F...FFF^|.Y|......|Y.|oo.FFFF..^|ssR ", " |------|-|-|--|--|......|--|--|-|-|------| ", - " |.dBBd.+r|u+..eSc|......|cSe..+u|r+.dBBd.| ", - " w..BB..|-|-|....c|......|c....|-|-|..BB..w ", + " |.dBBd.+r|u+..e3u|......|u3e..+u|r+.dBBd.| ", + " w..BB..|-|-|....2|......|2....|-|-|..BB..w ", " w......|STb|....O|......|O....|bTS|......w ", - " |od....+.fb|..ccc|......|ccc..|bf.+....d.| ", + " |od....+.fb|..1uu|......|1uu..|bf.+....d.| ", " |--|-+-|-+-|...QQ|.....^|Q.Q..|-+-|-+-|--| ", " RssX.............|......|.............XssR ", " Rssw.............D......D......A......wssR ", @@ -29,20 +29,20 @@ " |############|EEE=......=xEE|############| ", " |############|EEx=......=EEE|############| ", " |------|-|-|-|---|......|---|-|-|-|------| ", - " |.dBBd.+r|u+..eSc|......|cSe..+u|r+.dBBd.| ", - " w..BB..|-|-|....c|......|c....|-|-|..BB..w ", + " |.dBBd.+r|u+..e32|......|23e..+u|r+.dBBd.| ", + " w..BB..|-|-|....u|......|u....|-|-|..BB..w ", " w......|STb|....O|......|O....|bTS|......w ", - " |oo....+..b|..ccc|^.....|ccc..|bf.+....d.| ", + " |oo....+..b|..1uu|^.....|u1u..|bf.+....d.| ", " |--|-+-|-+-|..QQQ|......|.Q...|-+-|-+-|--| ", " RssX.............|......|.............+ssR ", " Rssw.............D......D.............wssR ", " Rssw..A....A..|+-|......|-+|...htth...wssR ", " Rss|...FFF...^|.Y|......|Y.|^..htth.oo|ssR ", " |------|-|-|--|--|......|--|--|-|-|------| ", - " |.dBBd.+r|u+..eSc|......|cSe..+u|r+.dBBd.| ", - " w..BB..|-|-|....c|.....^|c....|-|-|..BB..w ", + " |.dBBd.+r|u+..e3u|......|u3e..+u|r+.dBBd.| ", + " w..BB..|-|-|....2|.....^|2....|-|-|..BB..w ", " w......|STb|....O|......|O....|bTS|......w ", - " |.d....+..b|..ccc|......|ccc..|bf.+....d.| ", + " |.d....+..b|..uu1|......|u1u..|bf.+....d.| ", " |--|-+-|-+-|....^|......|.....|-+-|-+-|--| ", " RssX...A.........|......|.............+ssR ", " Rssw.............D......D...........A.wssR ", @@ -54,30 +54,6 @@ " ssss " ], "palettes": [ "apartment_con_old" ], - "toilets": { "T": { } }, - "items": { - "B": { "item": "bed", "chance": 60 }, - "O": { "item": "oven", "chance": 70 }, - "S": [ { "item": "softdrugs", "chance": 70 }, { "item": "cleaning", "chance": 50 } ], - "d": { "item": "dresser", "chance": 70 }, - "e": { "item": "fridge", "chance": 70 }, - "f": [ { "item": "magazines", "chance": 70 }, { "item": "novels", "chance": 50 } ], - "o": [ - { "item": "magazines", "chance": 30 }, - { "item": "novels", "chance": 40 }, - { "item": "alcohol", "chance": 30 }, - { "item": "manuals", "chance": 20 } - ], - "r": [ { "item": "dresser", "chance": 30 }, { "item": "jackets", "chance": 60 } ], - "u": [ - { "item": "cleaning", "chance": 50 }, - { "item": "home_hw", "chance": 30 }, - { "item": "cannedfood", "chance": 50 }, - { "item": "pasta", "chance": 50 } - ], - "Y": { "item": "coat_rack", "chance": 35, "repeat": [ 1, 4 ] }, - "p": { "item": "mail", "chance": 30, "repeat": [ 2, 5 ] } - }, "place_monsters": [ { "monster": "GROUP_ZOMBIE", "x": [ 4, 23 ], "y": [ 2, 23 ], "repeat": [ 1, 2 ] }, { "monster": "GROUP_ZOMBIE", "x": [ 24, 43 ], "y": [ 2, 23 ], "repeat": [ 1, 2 ] }, diff --git a/data/json/mapgen/apartment_con_new.json b/data/json/mapgen/apartment_con_new.json index c7eb032d9d919..fed4f97726d7d 100644 --- a/data/json/mapgen/apartment_con_new.json +++ b/data/json/mapgen/apartment_con_new.json @@ -6,20 +6,20 @@ "rows": [ " ", " |------|-|-|ww---| |---ww|-|-|------| ", - " |.dBBd.+r|u+..eSc|-w--w-|cSe..+u|r+.dBBd.| ", - " w..BB..|-|-|..iic|.....l|cii..|-|-|..BB..w ", + " |.dBBd.+r|u+..e3u|-w--w-|23e..+u|r+.dBBd.| ", + " w..BB..|-|-|..ii2|.....l|uii..|-|-|..BB..w ", " w.h....|STb|..iiO|.hC..l|Oii..|bTS|......w ", - " |CxC...+iib|..ccc|CxC...|ccc.j|bii+....X.| ", + " |CxC...+iib|..u1u|CxC...|u1u.j|bii+....X.| ", " |--|-+-|-+-|..lll|-ww-D-|lll..|-+-|-+-|--| ", " R,,+......nt.....|^.....|........nt...+,,R ", " R,,w..F..........D......D.............w,,R ", " R,,w..F.......|+-|p....p|-+|..........w,,R ", " R,Q|..F.I.FFF^|.Y|......|Y.|oo.FFFFI.^|Q,R ", " |------|-|-|--|--|......|--|--|-|-|------| ", - " |.dBBd.+r|u+..eSc|......|cSe..+u|r+.dBBd.| ", - " w..BB..|-|-|..iic|......|cii..|-|-|..BB..w ", + " |.dBBd.+r|u+..e32|......|u3e..+u|r+.dBBd.| ", + " w..BB..|-|-|..iiu|......|2ii..|-|-|..BB..w ", " w......|STb|..iiO|......|Oii..|bTS|......w ", - " |oX....+iib|j.ccc|......|ccc.j|bii+....X.| ", + " |oX....+iib|j.uu1|......|1uu.j|bii+....X.| ", " |--|-+-|-+-|..lll|.....^|lll..|-+-|-+-|--| ", " R,,+...tn........|p....p|.........nt..+,,R ", " R,,w.............D......D......A......w,,R ", @@ -29,20 +29,20 @@ " |%%%%%%%%%%%%|,,,G......=EEx|%%%%%%%%%%%%| ", " |%%%%%%%%%%%%|<,,G......=EEE|%%%%%%%%%%%%| ", " |------|-|-|-|---|......|---|-|-|-|------| ", - " |.dBBd.+r|u+..eSc|......|cSe..+u|r+.dBBd.| ", - " w..BB..|-|-|..iic|......|cii..|-|-|..BB..w ", + " |.dBBd.+r|u+..e32|......|23e..+u|r+.dBBd.| ", + " w..BB..|-|-|..iiu|......|uii..|-|-|..BB..w ", " w......|STb|..iiO|......|Oii..|bTS|......w ", - " |oo....+iib|j.ccc|^.....|ccc.j|bii+....X.| ", + " |oo....+iib|j.uu1|^.....|u1u.j|bii+....X.| ", " |--|-+-|-+-|..lll|......|lll..|-+-|-+-|--| ", " R,,+...tn........|......|........nt...+,,R ", " R,,w.............D......D.............w,,R ", " R,,w..A....A..|+-|p....p|-+|I..htth...w,,R ", " R,Q|...FFFI..^|.Y|......|Y.|^..htth.oo|Q,R ", " |------|-|-|--|--|......|--|--|-|-|------| ", - " |.dBBd.+r|u+..eSc|......|cSe..+u|r+.dBBd.| ", - " w..BB..|-|-|..iic|.....^|cii..|-|-|..BB..w ", + " |.dBBd.+r|u+..e32|......|u3e..+u|r+.dBBd.| ", + " w..BB..|-|-|..ii1|.....^|2ii..|-|-|..BB..w ", " w......|STb|..iiO|......|Oii..|bTS|......w ", - " |.X....+iib|j.ccc|......|ccc.j|bii+....X.| ", + " |.X....+iib|j.uuu|......|1uu.j|bii+....X.| ", " |--|-+-|-+-|^.lll|......|lll..|-+-|-+-|--| ", " R,,+...A..nt.....|p....p|........tn...+,,R ", " R,,w.............D......D...........A.w,,R ", @@ -75,20 +75,20 @@ "rows": [ "************************************************", "***|------|-|-|ww---|******|---ww|-|-|------|***", - "***|.dBBd.+r|u+..eSc|zzzzzz|cSe..+u|r+.dBBd.|***", - "***w..BB..|-|-|..iic|zzzzzz|cii..|-|-|..BB..w***", + "***|.dBBd.+r|u+..e3u|zzzzzz|u3e..+u|r+.dBBd.|***", + "***w..BB..|-|-|..ii2|zzzzzz|2ii..|-|-|..BB..w***", "***w.h....|STb|..iiO|zzzzzz|Oii..|bTS|......w***", - "***|CxC...+iib|j.ccc|zzzzzz|ccc.j|bii+....X.|***", + "***|CxC...+iib|j.uu1|zzzzzz|uu1.j|bii+....X.|***", "***|--|-+-|-+-|..lll|-WW-D-|lll..|-+-|-+-|--|***", "***R,,+......nt.....|^.....|........nt...+,,R***", "***R,,w..F..........D......D.............w,,R***", "***R,,w..F.......|+-|p....p|-+|..........w,,R***", "***R,Q|..F.I.FFF^|.Y|......|Y.|oo.FFFF..^|Q,R***", "***|------|-|-|--|--|......|--|--|-|-|------|***", - "***|.dBBd.+r|u+..eSc|......|cSe..+u|r+.dBBd.|***", - "***w..BB..|-|-|..iic|......|cii..|-|-|..BB..w***", + "***|.dBBd.+r|u+..e3u|......|u3e..+u|r+.dBBd.|***", + "***w..BB..|-|-|..ii2|......|2ii..|-|-|..BB..w***", "***w......|STb|..iiO|......|Oii..|bTS|......w***", - "***|oX....+iib|j.ccc|......|ccc.j|bii+....X.|***", + "***|oX....+iib|j.uu1|......|uu1.j|bii+....X.|***", "***|--|-+-|-+-|..lll|.....^|lll..|-+-|-+-|--|***", "***R,,+...tn........|p....p|.........nt..+,,R***", "***R,,w.............D......D......A......w,,R***", @@ -98,20 +98,20 @@ "***|%%%%%%%%%%%%|<,,G......=EEx|%%%%%%%%%%%%|***", "***|%%%%%%%%%%%%|>,,G......=EEE|%%%%%%%%%%%%|***", "***|------|-|-|-|---|......|---|-|-|-|------|***", - "***|.dBBd.+r|u+..eSc|......|cSe..+u|r+.dBBd.|***", - "***w..BB..|-|-|..iic|......|cii..|-|-|..BB..w***", + "***|.dBBd.+r|u+..e3u|......|u3e..+u|r+.dBBd.|***", + "***w..BB..|-|-|..ii2|......|2ii..|-|-|..BB..w***", "***w......|STb|..iiO|......|Oii..|bTS|......w***", - "***|oo....+iib|j.ccc|^.....|ccc.j|bii+....X.|***", + "***|oo....+iib|j.uu1|^.....|uu1.j|bii+....X.|***", "***|--|-+-|-+-|..lll|......|lll..|-+-|-+-|--|***", "***R,,+...tn........|......|........nt...+,,R***", "***R,,w.............D......D.............w,,R***", "***R,,w..A....A..|+-|p....p|-+|I..htth...w,,R***", "***R,Q|...FFFI..^|.Y|......|Y.|^..htth.oo|Q,R***", "***|------|-|-|--|--|......|--|--|-|-|------|***", - "***|.dBBd.+r|u+..eSc|......|cSe..+u|r+.dBBd.|***", - "***w..BB..|-|-|..iic|.....^|cii..|-|-|..BB..w***", + "***|.dBBd.+r|u+..e3u|......|u3e..+u|r+.dBBd.|***", + "***w..BB..|-|-|..ii2|.....^|2ii..|-|-|..BB..w***", "***w......|STb|..iiO|......|Oii..|bTS|......w***", - "***|.X....+iib|j.ccc|......|ccc.j|bii+....X.|***", + "***|.X....+iib|j.uu1|......|uu1.j|bii+....X.|***", "***|--|-+-|-+-|^.lll|......|lll..|-+-|-+-|--|***", "***R,,+...A..nt.....|p....p|........tn...+,,R***", "***R,,w.............D......D...........A.w,,R***", @@ -144,20 +144,20 @@ "rows": [ "************************************************", "***|------|-|-|ww---|******|---ww|-|-|------|***", - "***|.dBBd.+r|u+..eSc|******|cSe..+u|r+.dBBd.|***", - "***w..BB..|-|-|..iic|******|cii..|-|-|..BB..w***", + "***|.dBBd.+r|u+..e3u|******|u3e..+u|r+.dBBd.|***", + "***w..BB..|-|-|..ii2|******|2ii..|-|-|..BB..w***", "***w.h....|STb|..iiO|******|Oii..|bTS|......w***", - "***|CxC...+iib|j.ccc|******|ccc.j|bii+....X.|***", + "***|CxC...+iib|j.uu1|******|uu1.j|bii+....X.|***", "***|--|-+-|-+-|..lll|-WWWW-|lll..|-+-|-+-|--|***", "***R,,+......nt.....|^.....|........nt...+,,R***", "***R,,w..F..........D......D.............w,,R***", "***R,,w..F.......|+-|p....p|-+|..........w,,R***", "***R,Q|..F.I.FFF^|.Y|......|Y.|oo.FFFFI.^|Q,R***", "***|------|-|-|--|--|......|--|--|-|-|------|***", - "***|.dBBd.+r|u+..eSc|......|cSe..+u|r+.dBBd.|***", - "***w..BB..|-|-|..iic|......|cii..|-|-|..BB..w***", + "***|.dBBd.+r|u+..e3u|......|u3e..+u|r+.dBBd.|***", + "***w..BB..|-|-|..ii2|......|2ii..|-|-|..BB..w***", "***w......|STb|..iiO|......|Oii..|bTS|......w***", - "***|oX....+iib|j.ccc|......|ccc.j|bii+....X.|***", + "***|oX....+iib|j.uu1|......|uu1.j|bii+....X.|***", "***|--|-+-|-+-|..lll|.....^|lll..|-+-|-+-|--|***", "***R,,+...tn........|p....p|.........nt..+,,R***", "***R,,w.............D......D......A......w,,R***", @@ -167,20 +167,20 @@ "***|%%%%%%%%%%%%|>,,G......=EEx|%%%%%%%%%%%%|***", "***|%%%%%%%%%%%%|<,,G......=EEE|%%%%%%%%%%%%|***", "***|------|-|-|-|---|......|---|-|-|-|------|***", - "***|.dBBd.+r|u+..eSc|......|cSe..+u|r+.dBBd.|***", - "***w..BB..|-|-|..iic|......|cii..|-|-|..BB..w***", + "***|.dBBd.+r|u+..e3u|......|u3e..+u|r+.dBBd.|***", + "***w..BB..|-|-|..ii2|......|2ii..|-|-|..BB..w***", "***w......|STb|..iiO|......|Oii..|bTS|......w***", - "***|oo....+iib|..ccc|^.....|ccc.j|bii+....X.|***", + "***|oo....+iib|..uu1|^.....|uu1.j|bii+....X.|***", "***|--|-+-|-+-|..lll|......|lll..|-+-|-+-|--|***", "***R,,+...tn........|......|........nt...+,,R***", "***R,,w.............D......D.............w,,R***", "***R,,w..A....A..|+-|p....p|-+|I..htth...w,,R***", "***R,Q|...FFFI..^|.Y|......|Y.|^..htth.oo|Q,R***", "***|------|-|-|--|--|......|--|--|-|-|------|***", - "***|.dBBd.+r|u+..eSc|......|cSe..+u|r+.dBBd.|***", - "***w..BB..|-|-|..iic|.....^|cii..|-|-|..BB..w***", + "***|.dBBd.+r|u+..e3u|......|u3e..+u|r+.dBBd.|***", + "***w..BB..|-|-|..ii2|.....^|2ii..|-|-|..BB..w***", "***w......|STb|..iiO|......|Oii..|bTS|......w***", - "***|.X....+iib|j.ccc|......|ccc.j|bii+....X.|***", + "***|.X....+iib|j.uu1|......|uu1.j|bii+....X.|***", "***|--|-+-|-+-|^.lll|......|lll..|-+-|-+-|--|***", "***R,,+...A..nt.....|p....p|........tn...+,,R***", "***R,,w.............D......D...........A.w,,R***", @@ -213,20 +213,20 @@ "rows": [ "************************************************", "***|------|-|-|ww---|******|---ww|-|-|------|***", - "***|.dBBd.+r|u+..eSc|******|cSe..+u|r+.dBBd.|***", - "***w..BB..|-|-|..iic|******|cii..|-|-|..BB..w***", + "***|.dBBd.+r|u+..e3u|******|u3e..+u|r+.dBBd.|***", + "***w..BB..|-|-|..ii2|******|2ii..|-|-|..BB..w***", "***w.h....|STb|..iiO|******|Oii..|bTS|......w***", - "***|CxC...+iib|j.ccc|******|ccc.j|bii+....X.|***", + "***|CxC...+iib|j.uu1|******|uu1.j|bii+....X.|***", "***|--|-+-|-+-|..lll|-WWWW-|lll..|-+-|-+-|--|***", "***R,,+......nt.....|^.....|........nt...+,,R***", "***R,,w..F..........D......D.............w,,R***", "***R,,w..F.......|+-|p....p|-+|..........w,,R***", "***R,Q|..F.I.FFF^|.Y|......|Y.|oo.FFFFI.^|Q,R***", "***|------|-|-|--|--|......|--|--|-|-|------|***", - "***|.dBBd.+r|u+..eSc|......|cSe..+u|r+.dBBd.|***", - "***w..BB..|-|-|..iic|......|cii..|-|-|..BB..w***", + "***|.dBBd.+r|u+..e3u|......|u3e..+u|r+.dBBd.|***", + "***w..BB..|-|-|..ii2|......|2ii..|-|-|..BB..w***", "***w......|STb|..iiO|......|Oii..|bTS|......w***", - "***|oX....+iib|j.ccc|......|ccc.j|bii+....X.|***", + "***|oX....+iib|j.uu1|......|uu1.j|bii+....X.|***", "***|--|-+-|-+-|..lll|.....^|lll..|-+-|-+-|--|***", "***R,,+...tn........|p....p|.........nt..+,,R***", "***R,,w.............D......D......A......w,,R***", @@ -236,20 +236,20 @@ "***|%%%%%%%%%%%%|<,,G......=EEx|%%%%%%%%%%%%|***", "***|%%%%%%%%%%%%|>,,G......=EEE|%%%%%%%%%%%%|***", "***|------|-|-|-|---|......|---|-|-|-|------|***", - "***|.dBBd.+r|u+..eSc|......|cSe..+u|r+.dBBd.|***", - "***w..BB..|-|-|..iic|......|cii..|-|-|..BB..w***", + "***|.dBBd.+r|u+..e3u|......|u3e..+u|r+.dBBd.|***", + "***w..BB..|-|-|..ii2|......|2ii..|-|-|..BB..w***", "***w......|STb|..iiO|......|Oii..|bTS|......w***", - "***|oo....+iib|..ccc|^.....|ccc.j|bii+....X.|***", + "***|oo....+iib|..uu1|^.....|uu1.j|bii+....X.|***", "***|--|-+-|-+-|..lll|......|lll..|-+-|-+-|--|***", "***R,,+...tn........|......|........nt...+,,R***", "***R,,w.............D......D.............w,,R***", "***R,,w..A....A..|+-|p....p|-+|I..htth...w,,R***", "***R,Q|...FFFI..^|.Y|......|Y.|^..htth.oo|Q,R***", "***|------|-|-|--|--|......|--|--|-|-|------|***", - "***|.dBBd.+r|u+..eSc|......|cSe..+u|r+.dBBd.|***", - "***w..BB..|-|-|..iic|.....^|cii..|-|-|..BB..w***", + "***|.dBBd.+r|u+..e3u|......|u3e..+u|r+.dBBd.|***", + "***w..BB..|-|-|..ii2|.....^|2ii..|-|-|..BB..w***", "***w......|STb|..iiO|......|Oii..|bTS|......w***", - "***|.X....+iib|j.ccc|......|ccc.j|bii+....X.|***", + "***|.X....+iib|j.uu1|......|uu1.j|bii+....X.|***", "***|--|-+-|-+-|^.lll|......|lll..|-+-|-+-|--|***", "***R,,+...A..nt.....|p....p|........tn...+,,R***", "***R,,w.............D......D...........A.w,,R***", @@ -282,20 +282,20 @@ "rows": [ "************************************************", "***|------|-|-|ww---|******|---ww|-|-|------|***", - "***|.dBBd.+r|u+..eSc|******|cSe..+u|r+.dBBd.|***", - "***w..BB..|-|-|..iic|******|cii..|-|-|..BB..w***", + "***|.dBBd.+r|u+..e3u|******|u3e..+u|r+.dBBd.|***", + "***w..BB..|-|-|..ii2|******|2ii..|-|-|..BB..w***", "***w.h....|STb|..iiO|******|Oii..|bTS|......w***", - "***|CxC...+iib|j.ccc|******|ccc.j|bii+....X.|***", + "***|CxC...+iib|j.uu1|******|uu1.j|bii+....X.|***", "***|--|-+-|-+-|..lll|-WWWW-|lll..|-+-|-+-|--|***", "***R,,+......nt.....|^.....|........nt...+,,R***", "***R,,w..F..........D......D.............w,,R***", "***R,,w..F.......|+-|p....p|-+|..........w,,R***", "***R,Q|..F.I.FFF^|.Y|......|Y.|oo.FFFFI.^|Q,R***", "***|------|-|-|--|--|......|--|--|-|-|------|***", - "***|.dBBd.+r|u+..eSc|......|cSe..+u|r+.dBBd.|***", - "***w..BB..|-|-|..iic|......|cii..|-|-|..BB..w***", + "***|.dBBd.+r|u+..e3u|......|u3e..+u|r+.dBBd.|***", + "***w..BB..|-|-|..ii2|......|2ii..|-|-|..BB..w***", "***w......|STb|..iiO|......|Oii..|bTS|......w***", - "***|oX....+iib|j.ccc|......|ccc.j|bii+....X.|***", + "***|oX....+iib|j.uu1|......|uu1.j|bii+....X.|***", "***|--|-+-|-+-|..lll|.....^|lll..|-+-|-+-|--|***", "***R,,+...tn........|p....p|.........nt..+,,R***", "***R,,w.............D......D......A......w,,R***", @@ -305,20 +305,20 @@ "***|%%%%%%%%%%%%|>,,G......=EEx|%%%%%%%%%%%%|***", "***|%%%%%%%%%%%%|<,,G......=EEE|%%%%%%%%%%%%|***", "***|------|-|-|-|---|......|---|-|-|-|------|***", - "***|.dBBd.+r|u+..eSc|......|cSe..+u|r+.dBBd.|***", - "***w..BB..|-|-|..iic|......|cii..|-|-|..BB..w***", + "***|.dBBd.+r|u+..e3u|......|u3e..+u|r+.dBBd.|***", + "***w..BB..|-|-|..ii2|......|2ii..|-|-|..BB..w***", "***w......|STb|..iiO|......|Oii..|bTS|......w***", - "***|oo....+iib|..ccc|^.....|ccc.j|bii+....X.|***", + "***|oo....+iib|..uu1|^.....|uu1.j|bii+....X.|***", "***|--|-+-|-+-|..lll|......|lll..|-+-|-+-|--|***", "***R,,+...tn........|......|........nt...+,,R***", "***R,,w.............D......D.............w,,R***", "***R,,w..A....A..|+-|p....p|-+|I..htth...w,,R***", "***R,Q|...FFFI..^|.Y|......|Y.|^..htth.oo|Q,R***", "***|------|-|-|--|--|......|--|--|-|-|------|***", - "***|.dBBd.+r|u+..eSc|......|cSe..+u|r+.dBBd.|***", - "***w..BB..|-|-|..iic|.....^|cii..|-|-|..BB..w***", + "***|.dBBd.+r|u+..e3u|......|u3e..+u|r+.dBBd.|***", + "***w..BB..|-|-|..ii2|.....^|2ii..|-|-|..BB..w***", "***w......|STb|..iiO|......|Oii..|bTS|......w***", - "***|.X....+iib|j.ccc|......|ccc.j|bii+....X.|***", + "***|.X....+iib|j.uu1|......|uu1.j|bii+....X.|***", "***|--|-+-|-+-|^.lll|......|lll..|-+-|-+-|--|***", "***R,,+...A..nt.....|p....p|........tn...+,,R***", "***R,,w.............D......D...........A.w,,R***", @@ -351,20 +351,20 @@ "rows": [ "************************************************", "***|------|-|-|ww---|******|---ww|-|-|------|***", - "***|.dBBd.+r|u+..eSc|******|cSe..+u|r+.dBBd.|***", - "***w..BB..|-|-|..iic|******|cii..|-|-|..BB..w***", + "***|.dBBd.+r|u+..e3u|******|u3e..+u|r+.dBBd.|***", + "***w..BB..|-|-|..ii2|******|2ii..|-|-|..BB..w***", "***w.h....|STb|..iiO|******|Oii..|bTS|......w***", - "***|CxC...+iib|j.ccc|******|ccc.j|bii+....X.|***", + "***|CxC...+iib|j.uu1|******|uu1.j|bii+....X.|***", "***|--|-+-|-+-|..lll|-WWWW-|lll..|-+-|-+-|--|***", "***R,,+......nt.....|^.....|........nt...+,,R***", "***R,,w..F..........D......D.............w,,R***", "***R,,w..F.......|+-|p....p|-+|..........w,,R***", "***R,Q|..F.I.FFF^|.Y|......|Y.|oo.FFFFI.^|Q,R***", "***|------|-|-|--|--|......|--|--|-|-|------|***", - "***|.dBBd.+r|u+..eSc|......|cSe..+u|r+.dBBd.|***", - "***w..BB..|-|-|..iic|......|cii..|-|-|..BB..w***", + "***|.dBBd.+r|u+..e3u|......|u3e..+u|r+.dBBd.|***", + "***w..BB..|-|-|..ii2|......|2ii..|-|-|..BB..w***", "***w......|STb|..iiO|......|Oii..|bTS|......w***", - "***|oX....+iib|j.ccc|......|ccc.j|bii+....X.|***", + "***|oX....+iib|j.uu1|......|uu1.j|bii+....X.|***", "***|--|-+-|-+-|..lll|.....^|lll..|-+-|-+-|--|***", "***R,,+...tn........|p....p|.........nt..+,,R***", "***R,,w.............D......D......A......w,,R***", @@ -374,20 +374,20 @@ "***|%%%%%%%%%%%%|<,,G......=EEx|%%%%%%%%%%%%|***", "***|%%%%%%%%%%%%|>,,G......=EEE|%%%%%%%%%%%%|***", "***|------|-|-|-|---|......|---|-|-|-|------|***", - "***|.dBBd.+r|u+..eSc|......|cSe..+u|r+.dBBd.|***", - "***w..BB..|-|-|..iic|......|cii..|-|-|..BB..w***", + "***|.dBBd.+r|u+..e3u|......|u3e..+u|r+.dBBd.|***", + "***w..BB..|-|-|..ii2|......|2ii..|-|-|..BB..w***", "***w......|STb|..iiO|......|Oii..|bTS|......w***", - "***|oo....+iib|..ccc|^.....|ccc.j|bii+....X.|***", + "***|oo....+iib|..uu1|^.....|uu1.j|bii+....X.|***", "***|--|-+-|-+-|..lll|......|lll..|-+-|-+-|--|***", "***R,,+...tn........|......|........nt...+,,R***", "***R,,w.............D......D.............w,,R***", "***R,,w..A....A..|+-|p....p|-+|I..htth...w,,R***", "***R,Q|...FFFI..^|.Y|......|Y.|^..htth.oo|Q,R***", "***|------|-|-|--|--|......|--|--|-|-|------|***", - "***|.dBBd.+r|u+..eSc|......|cSe..+u|r+.dBBd.|***", - "***w..BB..|-|-|..iic|.....^|cii..|-|-|..BB..w***", + "***|.dBBd.+r|u+..e3u|......|u3e..+u|r+.dBBd.|***", + "***w..BB..|-|-|..ii2|.....^|2ii..|-|-|..BB..w***", "***w......|STb|..iiO|......|Oii..|bTS|......w***", - "***|.X....+iib|j.ccc|......|ccc.j|bii+....X.|***", + "***|.X....+iib|j.uu1|......|uu1.j|bii+....X.|***", "***|--|-+-|-+-|^.lll|......|lll..|-+-|-+-|--|***", "***R,,+...A..nt.....|p....p|........tn...+,,R***", "***R,,w.............D......D...........A.w,,R***", diff --git a/data/json/mapgen/apartment_mod.json b/data/json/mapgen/apartment_mod.json index 59891fbe50be8..5d65d2a93b811 100644 --- a/data/json/mapgen/apartment_mod.json +++ b/data/json/mapgen/apartment_mod.json @@ -16,24 +16,24 @@ " RsswFFFF...^|.STb| |bTS.|...FFFF.wssR ", " Rssw........+...b|-WW-|b...+........wssR ", " RssX........|--|-|EEEE|-|--|........XssR ", - " Rss|c.htth...oo|Y|EEEE|Y|..........c|ssR ", + " Rss|1.htth...oo|Y|EEEE|Y|..........1|ssR ", " Rss|e.htth.....+.|xEEE|.+..........e|ssR ", - " |-----|c.........A|-|-==-|-|..hh......c|-----| ", - " |..BBd|cOS........|........|..tt....SOc|dBB..| ", + " |-----|2.........A|-|-==-|-|..hh......u|-----| ", + " |..BBd|uO3........|........|..tt....3O2|dBB..| ", " w..BB.|--|+|......D........D..tt..|+|--|.BB..w ", " |d....+.r|u|^....t|........|..hh.^|u|r.+....d| ", " |r...||--|-|------|........|------|-|--||...r| ", - " w....|STb|u|...e.S|........|S.e..^|u|bTS|....w ", - " |....+..b|.+.....c|........|c.....+.|b..+....| ", + " w....|STb|u|...e.3|........|3.e..^|u|bTS|....w ", + " |....+..b|.+.....1|........|1.....+.|b..+....| ", " |--|+|-+-|-|.....O|........|O.....|-|-+-|+|--| ", - " RssX.....A....cccc|........|cccc...oo..A..XssR ", + " RssX.....A....uuu2|........|2uuu...oo..A..XssR ", " Rssw.........l.ll.|........|.l.l..........wssR ", " Rssw..............D........D..............wssR ", " Rss|..ooo.FFFF..Y^|........|^....A..FFFF..|ssR ", " R|-|--------------|........|--------------|-|R ", - " w.htth..FFFF..eSc|........|cSe.u.htth...oo.w ", + " w.htth..FFFF..e32|........|u3e.u.htth...oo.w ", " w...............O|........|O.....htth......w ", - " |-X|..........ccc|........|ccc..........|X-| ", + " |-X|..........1uu|........|2u1..........|X-| ", " Rss|-+----|o...l.|........|l.....|----+-|ssR ", " Rss|...BBd|o....A|........|.....A|dBB...|ssR ", " Rssw...BB.|^.....|........|.....^|.BB...wssR ", @@ -43,9 +43,9 @@ " |b....|bTS.+..|---|........|---|..+.STb|....b| ", " |b.T.S|b...|..+..u|........|u..+..|...b|S.T.b| ", " |-----|-+|-|..|---|........|---|..|-|+-|-----| ", - " |.dBBd...+r|...eSc|........|cSe...|r+..d.BBd.| ", + " |.dBBd...+r|...e3u|........|23e...|r+..d.BBd.| ", " w..BB....|-|.....O|........|O.....|-|....BB..w ", - " |.....h..+.....ccc|........|ccc.....+........| ", + " |.....h..+.....12u|........|u1u.....+........| ", " |--|.cxc.|......ll|........|.l.....A|....o|--| ", " |-www-|o.tt....D........D........|-www-| ", " Rsssss|.......F|........|t.......wsssssR ", @@ -56,67 +56,7 @@ " ppsssspp ", " ssss " ], - "terrain": { - " ": [ "t_grass", "t_grass", "t_grass", "t_dirt" ], - "+": [ "t_door_c", "t_door_c", "t_door_o" ], - "-": "t_wall", - "=": "t_door_metal_c", - "D": "t_door_locked_interior", - "E": "t_elevator", - "G": "t_door_glass_c", - "R": "t_railing_v", - "W": "t_window", - "X": "t_door_locked", - "a": "t_railing_h", - "s": "t_sidewalk", - "w": [ "t_window_domestic", "t_window_domestic", "t_window_domestic", "t_curtains" ], - "x": "t_console_broken", - "|": "t_wall" - }, - "furniture": { - "A": "f_armchair", - "B": "f_bed", - "F": "f_sofa", - "O": "f_oven", - "p": "f_mailbox", - "l": "f_stool", - "Y": "f_rack_coat", - "S": "f_sink", - "^": "f_indoor_plant", - "b": "f_bathtub", - "c": "f_counter", - "d": "f_dresser", - "e": "f_fridge", - "h": "f_chair", - "o": "f_bookcase", - "r": "f_rack", - "t": "f_table", - "u": "f_cupboard" - }, - "toilets": { "T": { } }, - "items": { - "B": { "item": "bed", "chance": 60 }, - "O": { "item": "oven", "chance": 70 }, - "S": [ { "item": "softdrugs", "chance": 70 }, { "item": "cleaning", "chance": 50 } ], - "T": [ { "item": "magazines", "chance": 50 }, { "item": "novels", "chance": 50 } ], - "d": { "item": "dresser", "chance": 70 }, - "e": { "item": "fridge", "chance": 70 }, - "o": [ - { "item": "magazines", "chance": 30 }, - { "item": "novels", "chance": 40 }, - { "item": "alcohol", "chance": 30 }, - { "item": "manuals", "chance": 20 } - ], - "r": [ { "item": "dresser", "chance": 30 }, { "item": "jackets", "chance": 60 } ], - "u": [ - { "item": "cleaning", "chance": 50 }, - { "item": "home_hw", "chance": 30 }, - { "item": "cannedfood", "chance": 50 }, - { "item": "pasta", "chance": 50 } - ], - "Y": { "item": "coat_rack", "chance": 35, "repeat": [ 1, 4 ] }, - "p": { "item": "mail", "chance": 30, "repeat": [ 2, 5 ] } - }, + "palettes": [ "apartment_palette" ], "place_monsters": [ { "monster": "GROUP_ZOMBIE", "x": [ 0, 23 ], "y": [ 0, 23 ], "repeat": [ 1, 2 ] }, { "monster": "GROUP_ZOMBIE", "x": [ 0, 23 ], "y": [ 24, 47 ], "repeat": [ 1, 2 ] }, diff --git a/data/json/mapgen/apartment_mod_new.json b/data/json/mapgen/apartment_mod_new.json index 637b6de4f33bf..5fa2c41af7304 100644 --- a/data/json/mapgen/apartment_mod_new.json +++ b/data/json/mapgen/apartment_mod_new.json @@ -19,24 +19,24 @@ " R,,wFFFFI..^|iSTb| |bTSi|A..FFFFIw,,R ", " R,,w........+iiib|-WW-|biii+........w,,R ", " R,,D....hh..|--|-|,,,,|-|--|nt......D,,R ", - " R,,|cii.tt..joo|Y|<,,,|Y|........iic|,,R ", + " R,,|1ii.tt..joo|Y|<,,,|Y|........ii1|,,R ", " R,Q|eii.tt.....+.|,,,,|.+........iie|Q,R ", - " |-----|cii.hh....A|-|-++-|-|..hh....iic|-----| ", - " |A.BBd|cOS.....A..|........|..tt....SOc|dBB.X| ", + " |-----|2ii.hh....A|-|-++-|-|..hh....iiu|-----| ", + " |A.BBd|uO3.....A..|........|..tt....3O2|dBB.X| ", " w..BB.|--|+|......D........D..tt..|+|--|.BB..w ", " |d....+.r|u|^...nt|p......p|j.hh.^|u|r.+....d| ", " |r...||--|-|------|........|------|-|--||...r| ", - " w....|STb|u|j.ieiS|C......3|Siei.^|u|bTS|....w ", - " |X...+iib|i+..iiic|C......3|ciii..+i|bii+....| ", + " w....|STb|u|j.iei3|C......3|3iei.^|u|bTS|....w ", + " |X...+iib|i+..iiiu|C......3|uiii..+i|bii+....| ", " |--|+|-+-|-|..iiiO|C......3|Oiii.j|-|-+-|+|--| ", - " R,,D.....Atn..cccc|........|cccc...oon.A..D,,R ", + " R,,D.....Atn..12uu|........|12uu...oon.A..D,,R ", " R,,w..........llll|p......p|llll..........w,,R ", " R,,w..............D........D..............w,,R ", " R,Q|A.ooo.FFFFI.Y^|........|^....A..FFFF.I|Q,R ", " R|-|--------------|........|--------------|-|R ", - " w.htth.IFFFF..eSc|^.......|cSeiu.htth..noohw ", + " w.htth.IFFFF..e32|^.......|23eiu.htth..noohw ", " w.............iiO|........|Oiiii.htth......w ", - " |-D|h....nt...ccc|........|cccii.......I|D-| ", + " |-D|h....nt...1uu|........|1uuii.......I|D-| ", " R,,|-+----|o..lll|.......^|lll...|----+-|,,R ", " R,,|X..BBd|o....A|........|.....A|dBB...|,,R ", " R,,w...BB.|^.....|........|.....^|.BB...w,,R ", @@ -46,9 +46,9 @@ " |biiii|bTSi+.A|---|........|---|j.+iSTb|iiiib| ", " |biTiS|biii|..+iiu|3......C|uii+..|iiib|SiTib| ", " |-----|-+|-|..|---|3......C|---|..|-|+-|-----| ", - " |.dBBd.h.+r|...eSc|3......C|cSe...|r+..d.BBd.| ", + " |.dBBd.h.+r|...e32|3......C|23e...|r+..d.BBd.| ", " w..BB....|-|I..iiO|........|Oii...|-|....BB..w ", - " |X....h..+.....ccc|........|ccc.....+.......A| ", + " |X....h..+.....1uu|........|1uu.....+.......A| ", " |--|.CxC.|.....lll|p......p|lll.tn.A|X...o|--| ", " |-www-|o.tn....D........D........|-www-| ", " R,,,,Q|j......F|........|t.......wQ,,,,R ", @@ -88,24 +88,24 @@ "****R,,wFFFFI..^|iSTb|****|bTSi|A..FFFFIw,,R****", "****R,,w........+iiib|-WW-|biii+........w,,R****", "****R,,D....hh..|--|-|,,,,|-|--|nt......D,,R****", - "****R,,|cii.tt..joo|Y|>,,<|Y|........iic|,,R****", + "****R,,|1ii.tt..joo|Y|>,,<|Y|........ii1|,,R****", "****R,Q|eii.tt.....+.|,,,,|.+........iie|Q,R****", - "*|-----|cii.hh....A|-|-++-|-|..hh....iic|-----|*", - "*|..BBd|cOS.....A..|........|..tt....SOc|dBB.X|*", + "*|-----|uii.hh....A|-|-++-|-|..hh....iiu|-----|*", + "*|..BBd|2O3.....A..|........|..tt....3O2|dBB.X|*", "*w..BB.|--|+|......D........D..tt..|+|--|.BB..w*", "*|d....+.r|u|^...nt|p......p|j.hh.^|u|r.+....d|*", "*|r...||--|-|------|........|------|-|--||...r|*", - "*w....|STb|u|j.ieiS|C......3|Siei.^|u|bTS|....w*", - "*|X...+iib|i+..iiic|C......3|ciii..+i|bii+....|*", + "*w....|STb|u|j.iei3|C......3|3iei.^|u|bTS|....w*", + "*|X...+iib|i+..iii2|C......3|2iii..+i|bii+....|*", "*|--|+|-+-|-|..iiiO|C......3|Oiii.j|-|-+-|+|--|*", - "*R,,D.....Atn..cccc|........|cccc...oon.A..D,,R*", + "*R,,D.....Atn..uuu1|........|1uuu...oon.A..D,,R*", "*R,,w..........llll|p......p|llll..........w,,R*", "*R,,w..............D........D..............w,,R*", "*R,Q|A.ooo.FFFFI.Y^|........|^....A..FFFF.I|Q,R*", "*R|-|--------------|........|--------------|-|R*", - "**w.htth.IFFFF..eSc|.......^|cSeiu.htth..noohw**", + "**w.htth.IFFFF..e32|.......^|23eiu.htth..noohw**", "**w.............iiO|........|Oiiii.htth......w**", - "**|-D|A....nt...ccc|........|cccii.......I|D-|**", + "**|-D|A....nt...uu1|........|1uuii.......I|D-|**", "**R,,|-+----|o..lll|^.......|lll...|----+-|,,R**", "**R,,|X..BBd|o....A|........|.....A|dBB...|,,R**", "**R,,w...BB.|^.....|........|.....^|.BB...w,,R**", @@ -115,9 +115,9 @@ "*|biiii|bTSi+.A|---|........|---|j.+iSTb|iiiib|*", "*|biTiS|biii|..+iiu|3......C|uii+..|iiib|SiTib|*", "*|-----|-+|-|..|---|3......C|---|..|-|+-|-----|*", - "*|.dBBd...+r|...eSc|3......C|cSe...|r+..d.BBd.|*", + "*|.dBBd...+r|...e32|3......C|23e...|r+..d.BBd.|*", "*w..BB...h|-|I..iiO|........|Oii...|-|....BB..w*", - "*|X....h..+.....ccc|........|ccc.....+........|*", + "*|X....h..+.....uu1|........|1uu.....+........|*", "*|--|.CxC.|.....lll|p......p|lll.tn.A|X...o|--|*", "****|-www-|o.tn....D........D........|-www-|****", "****R,,,,Q|j......F|........|t.......wQ,,,,R****", @@ -154,17 +154,17 @@ "****R,,wFFFFI..^|iSTb|****|bTSi|A..FFFFIw,,R****", "****R,,w........+iiib|-WW-|biii+........w,,R****", "****R,,D....hh..|--|-|,,,,|-|--|nt......D,,R****", - "****R,,|cii.tth.joo|Y|<,,>|Y|........iic|,,R****", + "****R,,|uii.tth.joo|Y|<,,>|Y|........iiu|,,R****", "****R,Q|eii.tth....+.|,,,,|.+........iie|Q,R****", - "*|-----|cii.hh....A|-|-++-|-|..hh....iic|-----|*", - "*|A.BBd|cOS.....A..|........|..tth...SOc|dBB.X|*", + "*|-----|1ii.hh....A|-|-++-|-|..hh....ii1|-----|*", + "*|A.BBd|2O3.....A..|........|..tth...3O2|dBB.X|*", "*w..BB.|--|+|......D........D..tth.|+|--|.BB..w*", "*|d....+.r|u|^...nt|p......p|j.hh.^|u|r.+....d|*", "*|r...||--|-|------|........|------|-|--||...r|*", - "*w....|STb|u|j.ieiS|C......3|Siei.^|u|bTS|....w*", - "*|X...+iib|i+..iiic|C......3|ciii..+i|bii+....|*", + "*w....|STb|u|j.iei3|C......3|3iei.^|u|bTS|....w*", + "*|X...+iib|i+..iii2|C......3|2iii..+i|bii+....|*", "*|--|+|-+-|-|..iiiO|C......3|Oiii.j|-|-+-|+|--|*", - "*R,,D.....Atn..cccc|........|cccc...oon.A..D,,R*", + "*R,,D.....Atn..uuu1|........|1uuu...oon.A..D,,R*", "*R,,w..........llll|p......p|llll..........w,,R*", "*R,,w..............D........D..............w,,R*", "*R,Q|A.ooo.FFFFI.Y^|........|^....A..FFFF.I|Q,R*", diff --git a/data/json/mapgen/basecamps/modular_field_common.json b/data/json/mapgen/basecamps/modular_field_common.json index a238e7dbff7b8..d02837d3821f4 100644 --- a/data/json/mapgen/basecamps/modular_field_common.json +++ b/data/json/mapgen/basecamps/modular_field_common.json @@ -1,7 +1,7 @@ [ { "type": "mapgen", - "update_mapgen_id": "fbmf_0", + "update_mapgen_id": "fbmh_0", "method": "json", "object": { "set": [ @@ -12,26 +12,26 @@ }, { "type": "mapgen", - "update_mapgen_id": "fbmf_fireplace_northeast", + "update_mapgen_id": "fbmh_fireplace_northeast", "method": "json", "object": { "set": [ { "point": "furniture", "id": "f_fireplace", "x": 19, "y": 6 } ] } }, { "type": "mapgen", - "update_mapgen_id": "fbmf_brazier_northeast", + "update_mapgen_id": "fbmh_brazier_northeast", "method": "json", "object": { "set": [ { "point": "furniture", "id": "f_brazier", "x": 19, "y": 6 } ] } }, { "type": "mapgen", - "update_mapgen_id": "fbmf_stove_northeast", + "update_mapgen_id": "fbmh_stove_northeast", "method": "json", "object": { "set": [ { "point": "furniture", "id": "f_woodstove", "x": 19, "y": 6 } ] } }, { "type": "mapgen", "method": "json", - "nested_mapgen_id": "fbmf_strawbed", + "nested_mapgen_id": "fbmh_strawbed", "object": { "mapgensize": [ 2, 2 ], "set": [ @@ -42,14 +42,14 @@ }, { "type": "mapgen", - "update_mapgen_id": "fbmf_strawbed1_northeast", + "update_mapgen_id": "fbmh_strawbed1_northeast", "method": "json", - "object": { "place_nested": [ { "chunks": [ "fbmf_strawbed" ], "x": 18, "y": 5 } ] } + "object": { "place_nested": [ { "chunks": [ "fbmh_strawbed" ], "x": 18, "y": 5 } ] } }, { "type": "mapgen", "method": "json", - "nested_mapgen_id": "fbmf_bedset", + "nested_mapgen_id": "fbmh_bedset", "object": { "mapgensize": [ 3, 3 ], "set": [ @@ -61,167 +61,167 @@ }, { "type": "mapgen", - "update_mapgen_id": "fbmf_bed1_northeast", + "update_mapgen_id": "fbmh_bed1_northeast", "method": "json", - "object": { "place_nested": [ { "chunks": [ "fbmf_bedset" ], "x": 17, "y": 5 } ] } + "object": { "place_nested": [ { "chunks": [ "fbmh_bedset" ], "x": 17, "y": 5 } ] } }, { "type": "mapgen", - "update_mapgen_id": "fbmf_strawbed2_northeast", + "update_mapgen_id": "fbmh_strawbed2_northeast", "method": "json", - "object": { "place_nested": [ { "chunks": [ "fbmf_strawbed" ], "x": 18, "y": 7 } ] } + "object": { "place_nested": [ { "chunks": [ "fbmh_strawbed" ], "x": 18, "y": 7 } ] } }, { "type": "mapgen", - "update_mapgen_id": "fbmf_bed2_northeast", + "update_mapgen_id": "fbmh_bed2_northeast", "method": "json", - "object": { "place_nested": [ { "chunks": [ "fbmf_bedset" ], "x": 17, "y": 7 } ] } + "object": { "place_nested": [ { "chunks": [ "fbmh_bedset" ], "x": 17, "y": 7 } ] } }, { "type": "mapgen", - "update_mapgen_id": "fbmf_tent_strawbed3_east", + "update_mapgen_id": "fbmh_tent_strawbed3_east", "method": "json", "object": { - "place_nested": [ { "chunks": [ "fbmf_strawbed" ], "x": 18, "y": 11 }, { "chunks": [ "fbmf_strawbed" ], "x": 18, "y": 13 } ] + "place_nested": [ { "chunks": [ "fbmh_strawbed" ], "x": 18, "y": 11 }, { "chunks": [ "fbmh_strawbed" ], "x": 18, "y": 13 } ] } }, { "type": "mapgen", - "update_mapgen_id": "fbmf_tent_bed3_east", + "update_mapgen_id": "fbmh_tent_bed3_east", "method": "json", "object": { - "place_nested": [ { "chunks": [ "fbmf_bedset" ], "x": 17, "y": 11 }, { "chunks": [ "fbmf_bedset" ], "x": 17, "y": 13 } ] + "place_nested": [ { "chunks": [ "fbmh_bedset" ], "x": 17, "y": 11 }, { "chunks": [ "fbmh_bedset" ], "x": 17, "y": 13 } ] } }, { "type": "mapgen", - "update_mapgen_id": "fbmf_room_strawbed3_east", + "update_mapgen_id": "fbmh_room_strawbed3_east", "method": "json", "object": { - "place_nested": [ { "chunks": [ "fbmf_strawbed" ], "x": 18, "y": 10 }, { "chunks": [ "fbmf_strawbed" ], "x": 18, "y": 13 } ] + "place_nested": [ { "chunks": [ "fbmh_strawbed" ], "x": 18, "y": 10 }, { "chunks": [ "fbmh_strawbed" ], "x": 18, "y": 13 } ] } }, { "type": "mapgen", - "update_mapgen_id": "fbmf_room_bed3_east", + "update_mapgen_id": "fbmh_room_bed3_east", "method": "json", "object": { - "place_nested": [ { "chunks": [ "fbmf_bedset" ], "x": 17, "y": 10 }, { "chunks": [ "fbmf_bedset" ], "x": 17, "y": 13 } ] + "place_nested": [ { "chunks": [ "fbmh_bedset" ], "x": 17, "y": 10 }, { "chunks": [ "fbmh_bedset" ], "x": 17, "y": 13 } ] } }, { "type": "mapgen", - "update_mapgen_id": "fbmf_tent_strawbed3_southeast", + "update_mapgen_id": "fbmh_tent_strawbed3_southeast", "method": "json", "object": { - "place_nested": [ { "chunks": [ "fbmf_strawbed" ], "x": 18, "y": 17 }, { "chunks": [ "fbmf_strawbed" ], "x": 18, "y": 19 } ] + "place_nested": [ { "chunks": [ "fbmh_strawbed" ], "x": 18, "y": 17 }, { "chunks": [ "fbmh_strawbed" ], "x": 18, "y": 19 } ] } }, { "type": "mapgen", - "update_mapgen_id": "fbmf_tent_bed3_southeast", + "update_mapgen_id": "fbmh_tent_bed3_southeast", "method": "json", "object": { - "place_nested": [ { "chunks": [ "fbmf_bedset" ], "x": 17, "y": 17 }, { "chunks": [ "fbmf_bedset" ], "x": 17, "y": 19 } ] + "place_nested": [ { "chunks": [ "fbmh_bedset" ], "x": 17, "y": 17 }, { "chunks": [ "fbmh_bedset" ], "x": 17, "y": 19 } ] } }, { "type": "mapgen", - "update_mapgen_id": "fbmf_room_strawbed3_southeast", + "update_mapgen_id": "fbmh_room_strawbed3_southeast", "method": "json", "object": { - "place_nested": [ { "chunks": [ "fbmf_strawbed" ], "x": 18, "y": 16 }, { "chunks": [ "fbmf_strawbed" ], "x": 18, "y": 19 } ] + "place_nested": [ { "chunks": [ "fbmh_strawbed" ], "x": 18, "y": 16 }, { "chunks": [ "fbmh_strawbed" ], "x": 18, "y": 19 } ] } }, { "type": "mapgen", - "update_mapgen_id": "fbmf_room_bed3_southeast", + "update_mapgen_id": "fbmh_room_bed3_southeast", "method": "json", "object": { - "place_nested": [ { "chunks": [ "fbmf_bedset" ], "x": 17, "y": 16 }, { "chunks": [ "fbmf_bedset" ], "x": 17, "y": 19 } ] + "place_nested": [ { "chunks": [ "fbmh_bedset" ], "x": 17, "y": 16 }, { "chunks": [ "fbmh_bedset" ], "x": 17, "y": 19 } ] } }, { "type": "mapgen", - "update_mapgen_id": "fbmf_strawbed3_northwest", + "update_mapgen_id": "fbmh_strawbed3_northwest", "method": "json", "object": { - "place_nested": [ { "chunks": [ "fbmf_strawbed" ], "x": 4, "y": 5 }, { "chunks": [ "fbmf_strawbed" ], "x": 4, "y": 7 } ] + "place_nested": [ { "chunks": [ "fbmh_strawbed" ], "x": 4, "y": 5 }, { "chunks": [ "fbmh_strawbed" ], "x": 4, "y": 7 } ] } }, { "type": "mapgen", - "update_mapgen_id": "fbmf_bed3_northwest", + "update_mapgen_id": "fbmh_bed3_northwest", "method": "json", - "object": { "place_nested": [ { "chunks": [ "fbmf_bedset" ], "x": 4, "y": 5 }, { "chunks": [ "fbmf_bedset" ], "x": 4, "y": 7 } ] } + "object": { "place_nested": [ { "chunks": [ "fbmh_bedset" ], "x": 4, "y": 5 }, { "chunks": [ "fbmh_bedset" ], "x": 4, "y": 7 } ] } }, { "type": "mapgen", - "update_mapgen_id": "fbmf_tent_strawbed3_west", + "update_mapgen_id": "fbmh_tent_strawbed3_west", "method": "json", "object": { - "place_nested": [ { "chunks": [ "fbmf_strawbed" ], "x": 4, "y": 11 }, { "chunks": [ "fbmf_strawbed" ], "x": 4, "y": 13 } ] + "place_nested": [ { "chunks": [ "fbmh_strawbed" ], "x": 4, "y": 11 }, { "chunks": [ "fbmh_strawbed" ], "x": 4, "y": 13 } ] } }, { "type": "mapgen", - "update_mapgen_id": "fbmf_tent_bed3_west", + "update_mapgen_id": "fbmh_tent_bed3_west", "method": "json", "object": { - "place_nested": [ { "chunks": [ "fbmf_bedset" ], "x": 4, "y": 11 }, { "chunks": [ "fbmf_bedset" ], "x": 4, "y": 13 } ] + "place_nested": [ { "chunks": [ "fbmh_bedset" ], "x": 4, "y": 11 }, { "chunks": [ "fbmh_bedset" ], "x": 4, "y": 13 } ] } }, { "type": "mapgen", - "update_mapgen_id": "fbmf_room_strawbed3_west", + "update_mapgen_id": "fbmh_room_strawbed3_west", "method": "json", "object": { - "place_nested": [ { "chunks": [ "fbmf_strawbed" ], "x": 4, "y": 10 }, { "chunks": [ "fbmf_strawbed" ], "x": 4, "y": 13 } ] + "place_nested": [ { "chunks": [ "fbmh_strawbed" ], "x": 4, "y": 10 }, { "chunks": [ "fbmh_strawbed" ], "x": 4, "y": 13 } ] } }, { "type": "mapgen", - "update_mapgen_id": "fbmf_room_bed3_west", + "update_mapgen_id": "fbmh_room_bed3_west", "method": "json", "object": { - "place_nested": [ { "chunks": [ "fbmf_bedset" ], "x": 4, "y": 10 }, { "chunks": [ "fbmf_bedset" ], "x": 4, "y": 13 } ] + "place_nested": [ { "chunks": [ "fbmh_bedset" ], "x": 4, "y": 10 }, { "chunks": [ "fbmh_bedset" ], "x": 4, "y": 13 } ] } }, { "type": "mapgen", - "update_mapgen_id": "fbmf_tent_strawbed3_southwest", + "update_mapgen_id": "fbmh_tent_strawbed3_southwest", "method": "json", "object": { - "place_nested": [ { "chunks": [ "fbmf_strawbed" ], "x": 4, "y": 17 }, { "chunks": [ "fbmf_strawbed" ], "x": 4, "y": 19 } ] + "place_nested": [ { "chunks": [ "fbmh_strawbed" ], "x": 4, "y": 17 }, { "chunks": [ "fbmh_strawbed" ], "x": 4, "y": 19 } ] } }, { "type": "mapgen", - "update_mapgen_id": "fbmf_tent_bed3_southwest", + "update_mapgen_id": "fbmh_tent_bed3_southwest", "method": "json", "object": { - "place_nested": [ { "chunks": [ "fbmf_bedset" ], "x": 4, "y": 17 }, { "chunks": [ "fbmf_bedset" ], "x": 4, "y": 19 } ] + "place_nested": [ { "chunks": [ "fbmh_bedset" ], "x": 4, "y": 17 }, { "chunks": [ "fbmh_bedset" ], "x": 4, "y": 19 } ] } }, { "type": "mapgen", - "update_mapgen_id": "fbmf_room_strawbed3_southwest", + "update_mapgen_id": "fbmh_room_strawbed3_southwest", "method": "json", "object": { - "place_nested": [ { "chunks": [ "fbmf_strawbed" ], "x": 4, "y": 16 }, { "chunks": [ "fbmf_strawbed" ], "x": 4, "y": 19 } ] + "place_nested": [ { "chunks": [ "fbmh_strawbed" ], "x": 4, "y": 16 }, { "chunks": [ "fbmh_strawbed" ], "x": 4, "y": 19 } ] } }, { "type": "mapgen", - "update_mapgen_id": "fbmf_room_bed3_southwest", + "update_mapgen_id": "fbmh_room_bed3_southwest", "method": "json", "object": { - "place_nested": [ { "chunks": [ "fbmf_bedset" ], "x": 4, "y": 16 }, { "chunks": [ "fbmf_bedset" ], "x": 4, "y": 19 } ] + "place_nested": [ { "chunks": [ "fbmh_bedset" ], "x": 4, "y": 16 }, { "chunks": [ "fbmh_bedset" ], "x": 4, "y": 19 } ] } }, { "type": "mapgen", - "update_mapgen_id": "fbmf_core_kitchen_fireplace_center", + "update_mapgen_id": "fbmh_core_kitchen_fireplace_center", "method": "json", "object": { "mapgensize": [ 6, 6 ], @@ -233,20 +233,20 @@ }, { "type": "mapgen", - "update_mapgen_id": "fbmf_core_kitchen_butchery_center", + "update_mapgen_id": "fbmh_core_kitchen_butchery_center", "method": "json", "object": { "set": [ { "point": "furniture", "id": "f_butcher_rack", "x": 12, "y": 10 } ] } }, { "type": "mapgen", - "update_mapgen_id": "fbmf_core_kitchen_toolrack_center", + "update_mapgen_id": "fbmh_core_kitchen_toolrack_center", "method": "json", "object": { "set": [ { "point": "furniture", "id": "f_bookcase", "x": 10, "y": 10 } ] } }, { "type": "mapgen", "method": "json", - "nested_mapgen_id": "fbmf_core_tableset", + "nested_mapgen_id": "fbmh_core_tableset", "object": { "mapgensize": [ 3, 3 ], "set": [ @@ -258,23 +258,23 @@ }, { "type": "mapgen", - "update_mapgen_id": "fbmf_core_kitchen_table_center", + "update_mapgen_id": "fbmh_core_kitchen_table_center", "method": "json", "object": { - "place_nested": [ { "chunks": [ "fbmf_core_tableset" ], "x": 11, "y": 12 }, { "chunks": [ "fbmf_core_tableset" ], "x": 11, "y": 13 } ] + "place_nested": [ { "chunks": [ "fbmh_core_tableset" ], "x": 11, "y": 12 }, { "chunks": [ "fbmh_core_tableset" ], "x": 11, "y": 13 } ] } }, { "type": "mapgen", - "update_mapgen_id": "fbmf_core_kitchen_table_south", + "update_mapgen_id": "fbmh_core_kitchen_table_south", "method": "json", "object": { - "place_nested": [ { "chunks": [ "fbmf_core_tableset" ], "x": 11, "y": 16 }, { "chunks": [ "fbmf_core_tableset" ], "x": 11, "y": 15 } ] + "place_nested": [ { "chunks": [ "fbmh_core_tableset" ], "x": 11, "y": 16 }, { "chunks": [ "fbmh_core_tableset" ], "x": 11, "y": 15 } ] } }, { "type": "mapgen", - "update_mapgen_id": "fbmf_core_kitchen_stove_south", + "update_mapgen_id": "fbmh_core_kitchen_stove_south", "method": "json", "object": { "set": [ @@ -285,25 +285,25 @@ }, { "type": "mapgen", - "update_mapgen_id": "fbmf_well_north", + "update_mapgen_id": "fbmh_well_north", "method": "json", "object": { "set": [ { "point": "terrain", "id": "t_water_pump", "x": 13, "y": 6 } ] } }, { "type": "mapgen", - "update_mapgen_id": "fbmf_root_cellar_north", + "update_mapgen_id": "fbmh_root_cellar_north", "method": "json", "object": { "set": [ { "point": "terrain", "id": "t_rootcellar", "x": 12, "y": 8 } ] } }, { "type": "mapgen", - "update_mapgen_id": "fbmf_radio_tower_north", + "update_mapgen_id": "fbmh_radio_tower_north", "method": "json", "object": { "set": [ { "point": "terrain", "id": "t_radio_tower", "x": 13, "y": 3 } ] } }, { "type": "mapgen", - "update_mapgen_id": "fbmf_radio_console_north", + "update_mapgen_id": "fbmh_radio_console_north", "method": "json", "object": { "set": [ { "point": "terrain", "id": "t_radio_controls", "x": 13, "y": 4 } ] } } diff --git a/data/json/mapgen/basecamps/modular_field_defenses.json b/data/json/mapgen/basecamps/modular_field_defenses.json index 84388fb9754d3..728b67d5e5bed 100644 --- a/data/json/mapgen/basecamps/modular_field_defenses.json +++ b/data/json/mapgen/basecamps/modular_field_defenses.json @@ -1,61 +1,193 @@ [ { "type": "mapgen", - "update_mapgen_id": "fbmf_trench_north", + "update_mapgen_id": "fbmh_trench_north", "method": "json", - "object": { "set": [ { "line": "terrain", "id": "t_pit", "x": 3, "x2": 20, "y": 0, "y2": 0 } ] } + "object": { + "set": [ { "line": "terrain", "id": "t_pit", "x": 3, "x2": 20, "y": 0, "y2": 0 } ], + "place_items": [ + { "x": 3, "y": 1, "item": "digging_soil_loam_50L", "chance": 99, "repeat": 30 }, + { "x": 4, "y": 1, "item": "digging_soil_loam_50L", "chance": 99, "repeat": 30 }, + { "x": 5, "y": 1, "item": "digging_soil_loam_50L", "chance": 99, "repeat": 30 }, + { "x": 6, "y": 1, "item": "digging_soil_loam_50L", "chance": 99, "repeat": 30 }, + { "x": 7, "y": 1, "item": "digging_soil_loam_50L", "chance": 99, "repeat": 30 }, + { "x": 8, "y": 1, "item": "digging_soil_loam_50L", "chance": 99, "repeat": 30 }, + { "x": 9, "y": 1, "item": "digging_soil_loam_50L", "chance": 99, "repeat": 30 }, + { "x": 10, "y": 1, "item": "digging_soil_loam_50L", "chance": 99, "repeat": 30 }, + { "x": 11, "y": 1, "item": "digging_soil_loam_50L", "chance": 99, "repeat": 30 }, + { "x": 12, "y": 1, "item": "digging_soil_loam_50L", "chance": 99, "repeat": 30 }, + { "x": 13, "y": 1, "item": "digging_soil_loam_50L", "chance": 99, "repeat": 30 }, + { "x": 14, "y": 1, "item": "digging_soil_loam_50L", "chance": 99, "repeat": 30 }, + { "x": 15, "y": 1, "item": "digging_soil_loam_50L", "chance": 99, "repeat": 30 }, + { "x": 16, "y": 1, "item": "digging_soil_loam_50L", "chance": 99, "repeat": 30 }, + { "x": 17, "y": 1, "item": "digging_soil_loam_50L", "chance": 99, "repeat": 30 }, + { "x": 18, "y": 1, "item": "digging_soil_loam_50L", "chance": 99, "repeat": 30 }, + { "x": 19, "y": 1, "item": "digging_soil_loam_50L", "chance": 99, "repeat": 30 }, + { "x": 20, "y": 1, "item": "digging_soil_loam_50L", "chance": 99, "repeat": 30 } + ] + } }, { "type": "mapgen", - "update_mapgen_id": "fbmf_trench_south", + "update_mapgen_id": "fbmh_trench_south", "method": "json", - "object": { "set": [ { "line": "terrain", "id": "t_pit", "x": 3, "x2": 20, "y": 23, "y2": 23 } ] } + "object": { + "set": [ { "line": "terrain", "id": "t_pit", "x": 3, "x2": 20, "y": 23, "y2": 23 } ], + "place_items": [ + { "x": 3, "y": 22, "item": "digging_soil_loam_50L", "chance": 99, "repeat": 30 }, + { "x": 4, "y": 22, "item": "digging_soil_loam_50L", "chance": 99, "repeat": 30 }, + { "x": 5, "y": 22, "item": "digging_soil_loam_50L", "chance": 99, "repeat": 30 }, + { "x": 6, "y": 22, "item": "digging_soil_loam_50L", "chance": 99, "repeat": 30 }, + { "x": 7, "y": 22, "item": "digging_soil_loam_50L", "chance": 99, "repeat": 30 }, + { "x": 8, "y": 22, "item": "digging_soil_loam_50L", "chance": 99, "repeat": 30 }, + { "x": 9, "y": 22, "item": "digging_soil_loam_50L", "chance": 99, "repeat": 30 }, + { "x": 10, "y": 22, "item": "digging_soil_loam_50L", "chance": 99, "repeat": 30 }, + { "x": 11, "y": 22, "item": "digging_soil_loam_50L", "chance": 99, "repeat": 30 }, + { "x": 12, "y": 22, "item": "digging_soil_loam_50L", "chance": 99, "repeat": 30 }, + { "x": 13, "y": 22, "item": "digging_soil_loam_50L", "chance": 99, "repeat": 30 }, + { "x": 14, "y": 22, "item": "digging_soil_loam_50L", "chance": 99, "repeat": 30 }, + { "x": 15, "y": 22, "item": "digging_soil_loam_50L", "chance": 99, "repeat": 30 }, + { "x": 16, "y": 22, "item": "digging_soil_loam_50L", "chance": 99, "repeat": 30 }, + { "x": 17, "y": 22, "item": "digging_soil_loam_50L", "chance": 99, "repeat": 30 }, + { "x": 18, "y": 22, "item": "digging_soil_loam_50L", "chance": 99, "repeat": 30 }, + { "x": 19, "y": 22, "item": "digging_soil_loam_50L", "chance": 99, "repeat": 30 }, + { "x": 20, "y": 22, "item": "digging_soil_loam_50L", "chance": 99, "repeat": 30 } + ] + } }, { "type": "mapgen", - "update_mapgen_id": "fbmf_trench_corner_northeast", + "update_mapgen_id": "fbmh_trench_corner_northeast", "method": "json", - "object": { "set": [ { "line": "terrain", "id": "t_pit", "x": 21, "x2": 21, "y": 0, "y2": 4 } ] } + "object": { + "set": [ { "line": "terrain", "id": "t_pit", "x": 21, "x2": 21, "y": 0, "y2": 4 } ], + "place_items": [ + { "x": 20, "y": 0, "item": "digging_soil_loam_50L", "chance": 99, "repeat": 30 }, + { "x": 20, "y": 1, "item": "digging_soil_loam_50L", "chance": 99, "repeat": 30 }, + { "x": 20, "y": 2, "item": "digging_soil_loam_50L", "chance": 99, "repeat": 30 }, + { "x": 20, "y": 3, "item": "digging_soil_loam_50L", "chance": 99, "repeat": 30 }, + { "x": 20, "y": 4, "item": "digging_soil_loam_50L", "chance": 99, "repeat": 30 } + ] + } }, { "type": "mapgen", - "update_mapgen_id": "fbmf_trench_corner_northwest", + "update_mapgen_id": "fbmh_trench_corner_northwest", "method": "json", - "object": { "set": [ { "line": "terrain", "id": "t_pit", "x": 2, "x2": 2, "y": 0, "y2": 4 } ] } + "object": { + "set": [ { "line": "terrain", "id": "t_pit", "x": 2, "x2": 2, "y": 0, "y2": 4 } ], + "place_items": [ + { "x": 3, "y": 0, "item": "digging_soil_loam_50L", "chance": 99, "repeat": 30 }, + { "x": 3, "y": 1, "item": "digging_soil_loam_50L", "chance": 99, "repeat": 30 }, + { "x": 3, "y": 2, "item": "digging_soil_loam_50L", "chance": 99, "repeat": 30 }, + { "x": 3, "y": 3, "item": "digging_soil_loam_50L", "chance": 99, "repeat": 30 }, + { "x": 3, "y": 4, "item": "digging_soil_loam_50L", "chance": 99, "repeat": 30 } + ] + } }, { "type": "mapgen", - "update_mapgen_id": "fbmf_trench_corner_southeast", + "update_mapgen_id": "fbmh_trench_corner_southeast", "method": "json", - "object": { "set": [ { "line": "terrain", "id": "t_pit", "x": 21, "x2": 21, "y": 19, "y2": 23 } ] } + "object": { + "set": [ { "line": "terrain", "id": "t_pit", "x": 21, "x2": 21, "y": 19, "y2": 23 } ], + "place_items": [ + { "x": 20, "y": 19, "item": "digging_soil_loam_50L", "chance": 99, "repeat": 30 }, + { "x": 20, "y": 20, "item": "digging_soil_loam_50L", "chance": 99, "repeat": 30 }, + { "x": 20, "y": 21, "item": "digging_soil_loam_50L", "chance": 99, "repeat": 30 }, + { "x": 20, "y": 22, "item": "digging_soil_loam_50L", "chance": 99, "repeat": 30 }, + { "x": 20, "y": 23, "item": "digging_soil_loam_50L", "chance": 99, "repeat": 30 } + ] + } }, { "type": "mapgen", - "update_mapgen_id": "fbmf_trench_corner_southwest", + "update_mapgen_id": "fbmh_trench_corner_southwest", "method": "json", - "object": { "set": [ { "line": "terrain", "id": "t_pit", "x": 2, "x2": 2, "y": 19, "y2": 23 } ] } + "object": { + "set": [ { "line": "terrain", "id": "t_pit", "x": 2, "x2": 2, "y": 19, "y2": 23 } ], + "place_items": [ + { "x": 3, "y": 19, "item": "digging_soil_loam_50L", "chance": 99, "repeat": 30 }, + { "x": 3, "y": 20, "item": "digging_soil_loam_50L", "chance": 99, "repeat": 30 }, + { "x": 3, "y": 21, "item": "digging_soil_loam_50L", "chance": 99, "repeat": 30 }, + { "x": 3, "y": 22, "item": "digging_soil_loam_50L", "chance": 99, "repeat": 30 }, + { "x": 3, "y": 23, "item": "digging_soil_loam_50L", "chance": 99, "repeat": 30 } + ] + } }, { "type": "mapgen", - "update_mapgen_id": "fbmf_trench_east", + "update_mapgen_id": "fbmh_trench_east", "method": "json", "object": { "set": [ { "line": "terrain", "id": "t_pit", "x": 21, "x2": 22, "y": 0, "y2": 0 }, { "line": "terrain", "id": "t_pit", "x": 21, "x2": 22, "y": 23, "y2": 23 }, { "line": "terrain", "id": "t_pit", "x": 23, "x2": 23, "y": 0, "y2": 23 } + ], + "place_items": [ + { "x": 22, "y": 0, "item": "digging_soil_loam_50L", "chance": 99, "repeat": 30 }, + { "x": 22, "y": 1, "item": "digging_soil_loam_50L", "chance": 99, "repeat": 30 }, + { "x": 22, "y": 2, "item": "digging_soil_loam_50L", "chance": 99, "repeat": 30 }, + { "x": 22, "y": 3, "item": "digging_soil_loam_50L", "chance": 99, "repeat": 30 }, + { "x": 22, "y": 4, "item": "digging_soil_loam_50L", "chance": 99, "repeat": 30 }, + { "x": 22, "y": 5, "item": "digging_soil_loam_50L", "chance": 99, "repeat": 30 }, + { "x": 22, "y": 6, "item": "digging_soil_loam_50L", "chance": 99, "repeat": 30 }, + { "x": 22, "y": 7, "item": "digging_soil_loam_50L", "chance": 99, "repeat": 30 }, + { "x": 22, "y": 8, "item": "digging_soil_loam_50L", "chance": 99, "repeat": 30 }, + { "x": 22, "y": 9, "item": "digging_soil_loam_50L", "chance": 99, "repeat": 30 }, + { "x": 22, "y": 10, "item": "digging_soil_loam_50L", "chance": 99, "repeat": 30 }, + { "x": 22, "y": 11, "item": "digging_soil_loam_50L", "chance": 99, "repeat": 30 }, + { "x": 22, "y": 12, "item": "digging_soil_loam_50L", "chance": 99, "repeat": 30 }, + { "x": 22, "y": 13, "item": "digging_soil_loam_50L", "chance": 99, "repeat": 30 }, + { "x": 22, "y": 14, "item": "digging_soil_loam_50L", "chance": 99, "repeat": 30 }, + { "x": 22, "y": 15, "item": "digging_soil_loam_50L", "chance": 99, "repeat": 30 }, + { "x": 22, "y": 16, "item": "digging_soil_loam_50L", "chance": 99, "repeat": 30 }, + { "x": 22, "y": 17, "item": "digging_soil_loam_50L", "chance": 99, "repeat": 30 }, + { "x": 22, "y": 18, "item": "digging_soil_loam_50L", "chance": 99, "repeat": 30 }, + { "x": 22, "y": 19, "item": "digging_soil_loam_50L", "chance": 99, "repeat": 30 }, + { "x": 22, "y": 20, "item": "digging_soil_loam_50L", "chance": 99, "repeat": 30 }, + { "x": 22, "y": 21, "item": "digging_soil_loam_50L", "chance": 99, "repeat": 30 }, + { "x": 22, "y": 22, "item": "digging_soil_loam_50L", "chance": 99, "repeat": 30 }, + { "x": 22, "y": 23, "item": "digging_soil_loam_50L", "chance": 99, "repeat": 30 } ] } }, { "type": "mapgen", - "update_mapgen_id": "fbmf_trench_west", + "update_mapgen_id": "fbmh_trench_west", "method": "json", "object": { "set": [ { "line": "terrain", "id": "t_pit", "x": 1, "x2": 2, "y": 0, "y2": 0 }, { "line": "terrain", "id": "t_pit", "x": 1, "x2": 2, "y": 23, "y2": 23 }, { "line": "terrain", "id": "t_pit", "x": 0, "x2": 0, "y": 0, "y2": 23 } + ], + "place_items": [ + { "x": 1, "y": 0, "item": "digging_soil_loam_50L", "chance": 99, "repeat": 30 }, + { "x": 1, "y": 1, "item": "digging_soil_loam_50L", "chance": 99, "repeat": 30 }, + { "x": 1, "y": 2, "item": "digging_soil_loam_50L", "chance": 99, "repeat": 30 }, + { "x": 1, "y": 3, "item": "digging_soil_loam_50L", "chance": 99, "repeat": 30 }, + { "x": 1, "y": 4, "item": "digging_soil_loam_50L", "chance": 99, "repeat": 30 }, + { "x": 1, "y": 5, "item": "digging_soil_loam_50L", "chance": 99, "repeat": 30 }, + { "x": 1, "y": 6, "item": "digging_soil_loam_50L", "chance": 99, "repeat": 30 }, + { "x": 1, "y": 7, "item": "digging_soil_loam_50L", "chance": 99, "repeat": 30 }, + { "x": 1, "y": 8, "item": "digging_soil_loam_50L", "chance": 99, "repeat": 30 }, + { "x": 1, "y": 9, "item": "digging_soil_loam_50L", "chance": 99, "repeat": 30 }, + { "x": 1, "y": 10, "item": "digging_soil_loam_50L", "chance": 99, "repeat": 30 }, + { "x": 1, "y": 11, "item": "digging_soil_loam_50L", "chance": 99, "repeat": 30 }, + { "x": 1, "y": 12, "item": "digging_soil_loam_50L", "chance": 99, "repeat": 30 }, + { "x": 1, "y": 13, "item": "digging_soil_loam_50L", "chance": 99, "repeat": 30 }, + { "x": 1, "y": 14, "item": "digging_soil_loam_50L", "chance": 99, "repeat": 30 }, + { "x": 1, "y": 15, "item": "digging_soil_loam_50L", "chance": 99, "repeat": 30 }, + { "x": 1, "y": 16, "item": "digging_soil_loam_50L", "chance": 99, "repeat": 30 }, + { "x": 1, "y": 17, "item": "digging_soil_loam_50L", "chance": 99, "repeat": 30 }, + { "x": 1, "y": 18, "item": "digging_soil_loam_50L", "chance": 99, "repeat": 30 }, + { "x": 1, "y": 19, "item": "digging_soil_loam_50L", "chance": 99, "repeat": 30 }, + { "x": 1, "y": 20, "item": "digging_soil_loam_50L", "chance": 99, "repeat": 30 }, + { "x": 1, "y": 21, "item": "digging_soil_loam_50L", "chance": 99, "repeat": 30 }, + { "x": 1, "y": 22, "item": "digging_soil_loam_50L", "chance": 99, "repeat": 30 }, + { "x": 1, "y": 23, "item": "digging_soil_loam_50L", "chance": 99, "repeat": 30 } ] } } diff --git a/data/json/mapgen/basecamps/modular_field_metal.json b/data/json/mapgen/basecamps/modular_field_metal.json index 244895d06a2a8..48a75f3f60c90 100644 --- a/data/json/mapgen/basecamps/modular_field_metal.json +++ b/data/json/mapgen/basecamps/modular_field_metal.json @@ -1,14 +1,14 @@ [ { "type": "palette", - "id": "fbmf_metal_palette", + "id": "fbmh_metal_palette", "terrain": { ";": "t_dirt", ".": "t_scrap_floor", "+": "t_door_metal_c", "v": "t_window_no_curtains", "w": "t_scrap_wall" }, "furniture": { } }, { "type": "mapgen", "method": "json", - "nested_mapgen_id": "fbmf_room0_metal", + "nested_mapgen_id": "fbmh_room0_metal", "object": { "mapgensize": [ 6, 6 ], "rows": [ @@ -19,19 +19,19 @@ " ;;;;;", " ;;;;;" ], - "palettes": [ "fbmf_metal_palette" ] + "palettes": [ "fbmh_metal_palette" ] } }, { "type": "mapgen", - "update_mapgen_id": "fbmf_room0_metal_northeast", + "update_mapgen_id": "fbmh_room0_metal_northeast", "method": "json", - "object": { "place_nested": [ { "chunks": [ "fbmf_room0_metal" ], "x": 15, "y": 3 } ] } + "object": { "place_nested": [ { "chunks": [ "fbmh_room0_metal" ], "x": 15, "y": 3 } ] } }, { "type": "mapgen", "method": "json", - "nested_mapgen_id": "fbmf_room1_metal", + "nested_mapgen_id": "fbmh_room1_metal", "object": { "mapgensize": [ 6, 6 ], "rows": [ @@ -42,19 +42,19 @@ " w...w", " " ], - "palettes": [ "fbmf_metal_palette" ] + "palettes": [ "fbmh_metal_palette" ] } }, { "type": "mapgen", - "update_mapgen_id": "fbmf_room1_metal_northeast", + "update_mapgen_id": "fbmh_room1_metal_northeast", "method": "json", - "object": { "place_nested": [ { "chunks": [ "fbmf_room1_metal" ], "x": 15, "y": 3 } ] } + "object": { "place_nested": [ { "chunks": [ "fbmh_room1_metal" ], "x": 15, "y": 3 } ] } }, { "type": "mapgen", "method": "json", - "nested_mapgen_id": "fbmf_room2_metal", + "nested_mapgen_id": "fbmh_room2_metal", "object": { "mapgensize": [ 6, 6 ], "rows": [ @@ -65,19 +65,19 @@ " ", " wwwww" ], - "palettes": [ "fbmf_metal_palette" ] + "palettes": [ "fbmh_metal_palette" ] } }, { "type": "mapgen", - "update_mapgen_id": "fbmf_room2_metal_northeast", + "update_mapgen_id": "fbmh_room2_metal_northeast", "method": "json", - "object": { "place_nested": [ { "chunks": [ "fbmf_room2_metal" ], "x": 15, "y": 3 } ] } + "object": { "place_nested": [ { "chunks": [ "fbmh_room2_metal" ], "x": 15, "y": 3 } ] } }, { "type": "mapgen", "method": "json", - "nested_mapgen_id": "fbmf_metal_shack_east", + "nested_mapgen_id": "fbmh_metal_shack_east", "object": { "mapgensize": [ 6, 6 ], "rows": [ @@ -88,19 +88,19 @@ "w....w", "w+wwww" ], - "palettes": [ "fbmf_metal_palette" ] + "palettes": [ "fbmh_metal_palette" ] } }, { "type": "mapgen", - "update_mapgen_id": "fbmf_shack4_metal_east", + "update_mapgen_id": "fbmh_shack4_metal_east", "method": "json", - "object": { "place_nested": [ { "chunks": [ "fbmf_metal_shack_east" ], "x": 15, "y": 9 } ] } + "object": { "place_nested": [ { "chunks": [ "fbmh_metal_shack_east" ], "x": 15, "y": 9 } ] } }, { "type": "mapgen", "method": "json", - "nested_mapgen_id": "fbmf_metal_room_east", + "nested_mapgen_id": "fbmh_metal_room_east", "object": { "mapgensize": [ 6, 6 ], "rows": [ @@ -111,34 +111,34 @@ "w....w", "w+wwww" ], - "palettes": [ "fbmf_metal_palette" ] + "palettes": [ "fbmh_metal_palette" ] } }, { "type": "mapgen", - "update_mapgen_id": "fbmf_room4_metal_east", + "update_mapgen_id": "fbmh_room4_metal_east", "method": "json", "object": { - "place_nested": [ { "chunks": [ "fbmf_metal_room_east" ], "x": 15, "y": 9 } ], + "place_nested": [ { "chunks": [ "fbmh_metal_room_east" ], "x": 15, "y": 9 } ], "set": [ { "point": "terrain", "id": "t_wall_metal", "x": 15, "y": 8 } ] } }, { "type": "mapgen", - "update_mapgen_id": "fbmf_shack4_metal_southeast", + "update_mapgen_id": "fbmh_shack4_metal_southeast", "method": "json", - "object": { "place_nested": [ { "chunks": [ "fbmf_metal_shack_east" ], "x": 15, "y": 15 } ] } + "object": { "place_nested": [ { "chunks": [ "fbmh_metal_shack_east" ], "x": 15, "y": 15 } ] } }, { "type": "mapgen", - "update_mapgen_id": "fbmf_room4_metal_southeast", + "update_mapgen_id": "fbmh_room4_metal_southeast", "method": "json", - "object": { "place_nested": [ { "chunks": [ "fbmf_metal_room_east" ], "x": 15, "y": 15 } ] } + "object": { "place_nested": [ { "chunks": [ "fbmh_metal_room_east" ], "x": 15, "y": 15 } ] } }, { "type": "mapgen", "method": "json", - "nested_mapgen_id": "fbmf_metal_shack_northwest", + "nested_mapgen_id": "fbmh_metal_shack_northwest", "object": { "mapgensize": [ 6, 6 ], "rows": [ @@ -149,19 +149,19 @@ "w...w;", "wwwww;" ], - "palettes": [ "fbmf_metal_palette" ] + "palettes": [ "fbmh_metal_palette" ] } }, { "type": "mapgen", - "update_mapgen_id": "fbmf_room4_metal_northwest", + "update_mapgen_id": "fbmh_room4_metal_northwest", "method": "json", - "object": { "place_nested": [ { "chunks": [ "fbmf_metal_shack_northwest" ], "x": 3, "y": 3 } ] } + "object": { "place_nested": [ { "chunks": [ "fbmh_metal_shack_northwest" ], "x": 3, "y": 3 } ] } }, { "type": "mapgen", "method": "json", - "nested_mapgen_id": "fbmf_metal_shack_west", + "nested_mapgen_id": "fbmh_metal_shack_west", "object": { "mapgensize": [ 6, 6 ], "rows": [ @@ -172,19 +172,19 @@ "w....w", "wwww+w" ], - "palettes": [ "fbmf_metal_palette" ] + "palettes": [ "fbmh_metal_palette" ] } }, { "type": "mapgen", - "update_mapgen_id": "fbmf_shack4_metal_west", + "update_mapgen_id": "fbmh_shack4_metal_west", "method": "json", - "object": { "place_nested": [ { "chunks": [ "fbmf_metal_shack_west" ], "x": 3, "y": 9 } ] } + "object": { "place_nested": [ { "chunks": [ "fbmh_metal_shack_west" ], "x": 3, "y": 9 } ] } }, { "type": "mapgen", "method": "json", - "nested_mapgen_id": "fbmf_metal_room_west", + "nested_mapgen_id": "fbmh_metal_room_west", "object": { "mapgensize": [ 6, 6 ], "rows": [ @@ -195,34 +195,34 @@ "w....w", "wwww+w" ], - "palettes": [ "fbmf_metal_palette" ] + "palettes": [ "fbmh_metal_palette" ] } }, { "type": "mapgen", - "update_mapgen_id": "fbmf_room4_metal_west", + "update_mapgen_id": "fbmh_room4_metal_west", "method": "json", "object": { - "place_nested": [ { "chunks": [ "fbmf_metal_room_west" ], "x": 3, "y": 9 } ], + "place_nested": [ { "chunks": [ "fbmh_metal_room_west" ], "x": 3, "y": 9 } ], "set": [ { "point": "terrain", "id": "t_wall_metal", "x": 8, "y": 8 } ] } }, { "type": "mapgen", - "update_mapgen_id": "fbmf_shack4_metal_southwest", + "update_mapgen_id": "fbmh_shack4_metal_southwest", "method": "json", - "object": { "place_nested": [ { "chunks": [ "fbmf_metal_shack_west" ], "x": 3, "y": 15 } ] } + "object": { "place_nested": [ { "chunks": [ "fbmh_metal_shack_west" ], "x": 3, "y": 15 } ] } }, { "type": "mapgen", - "update_mapgen_id": "fbmf_room4_metal_southwest", + "update_mapgen_id": "fbmh_room4_metal_southwest", "method": "json", - "object": { "place_nested": [ { "chunks": [ "fbmf_metal_room_west" ], "x": 3, "y": 15 } ] } + "object": { "place_nested": [ { "chunks": [ "fbmh_metal_room_west" ], "x": 3, "y": 15 } ] } }, { "type": "mapgen", "method": "json", - "nested_mapgen_id": "fbmf_core_shack_ne_metal_center", + "nested_mapgen_id": "fbmh_core_shack_ne_metal_center", "object": { "mapgensize": [ 6, 6 ], "rows": [ @@ -233,19 +233,19 @@ " ..w", " ..w" ], - "palettes": [ "fbmf_metal_palette" ] + "palettes": [ "fbmh_metal_palette" ] } }, { "type": "mapgen", - "update_mapgen_id": "fbmf_core_shack_ne_metal_center", + "update_mapgen_id": "fbmh_core_shack_ne_metal_center", "method": "json", - "object": { "place_nested": [ { "chunks": [ "fbmf_core_shack_ne_metal_center" ], "x": 9, "y": 9 } ] } + "object": { "place_nested": [ { "chunks": [ "fbmh_core_shack_ne_metal_center" ], "x": 9, "y": 9 } ] } }, { "type": "mapgen", "method": "json", - "nested_mapgen_id": "fbmf_core_ne_metal_center", + "nested_mapgen_id": "fbmh_core_ne_metal_center", "object": { "mapgensize": [ 6, 6 ], "rows": [ @@ -256,19 +256,19 @@ " ...", " ..." ], - "palettes": [ "fbmf_metal_palette" ] + "palettes": [ "fbmh_metal_palette" ] } }, { "type": "mapgen", - "update_mapgen_id": "fbmf_core_ne_metal_center", + "update_mapgen_id": "fbmh_core_ne_metal_center", "method": "json", - "object": { "place_nested": [ { "chunks": [ "fbmf_core_ne_metal_center" ], "x": 9, "y": 9 } ] } + "object": { "place_nested": [ { "chunks": [ "fbmh_core_ne_metal_center" ], "x": 9, "y": 9 } ] } }, { "type": "mapgen", "method": "json", - "nested_mapgen_id": "fbmf_core_shack_nw_metal_center", + "nested_mapgen_id": "fbmh_core_shack_nw_metal_center", "object": { "mapgensize": [ 6, 6 ], "rows": [ @@ -279,19 +279,19 @@ "w.. ", "w.. " ], - "palettes": [ "fbmf_metal_palette" ] + "palettes": [ "fbmh_metal_palette" ] } }, { "type": "mapgen", - "update_mapgen_id": "fbmf_core_shack_nw_metal_center", + "update_mapgen_id": "fbmh_core_shack_nw_metal_center", "method": "json", - "object": { "place_nested": [ { "chunks": [ "fbmf_core_shack_nw_metal_center" ], "x": 9, "y": 9 } ] } + "object": { "place_nested": [ { "chunks": [ "fbmh_core_shack_nw_metal_center" ], "x": 9, "y": 9 } ] } }, { "type": "mapgen", "method": "json", - "nested_mapgen_id": "fbmf_core_nw_metal_center", + "nested_mapgen_id": "fbmh_core_nw_metal_center", "object": { "mapgensize": [ 6, 6 ], "rows": [ @@ -302,30 +302,30 @@ "... ", "... " ], - "palettes": [ "fbmf_metal_palette" ] + "palettes": [ "fbmh_metal_palette" ] } }, { "type": "mapgen", - "update_mapgen_id": "fbmf_core_nw_metal_center", + "update_mapgen_id": "fbmh_core_nw_metal_center", "method": "json", - "object": { "place_nested": [ { "chunks": [ "fbmf_core_nw_metal_center" ], "x": 9, "y": 9 } ] } + "object": { "place_nested": [ { "chunks": [ "fbmh_core_nw_metal_center" ], "x": 9, "y": 9 } ] } }, { "type": "mapgen", - "update_mapgen_id": "fbmf_core_metal_center", + "update_mapgen_id": "fbmh_core_metal_center", "method": "json", "object": { "place_nested": [ - { "chunks": [ "fbmf_core_nw_metal_center" ], "x": 9, "y": 9 }, - { "chunks": [ "fbmf_core_ne_metal_center" ], "x": 9, "y": 9 } + { "chunks": [ "fbmh_core_nw_metal_center" ], "x": 9, "y": 9 }, + { "chunks": [ "fbmh_core_ne_metal_center" ], "x": 9, "y": 9 } ] } }, { "type": "mapgen", "method": "json", - "nested_mapgen_id": "fbmf_core_shack_se_metal_south", + "nested_mapgen_id": "fbmh_core_shack_se_metal_south", "object": { "mapgensize": [ 6, 6 ], "rows": [ @@ -336,19 +336,19 @@ " ..w", " +ww" ], - "palettes": [ "fbmf_metal_palette" ] + "palettes": [ "fbmh_metal_palette" ] } }, { "type": "mapgen", - "update_mapgen_id": "fbmf_core_shack_se_metal_south", + "update_mapgen_id": "fbmh_core_shack_se_metal_south", "method": "json", - "object": { "place_nested": [ { "chunks": [ "fbmf_core_shack_se_metal_south" ], "x": 9, "y": 15 } ] } + "object": { "place_nested": [ { "chunks": [ "fbmh_core_shack_se_metal_south" ], "x": 9, "y": 15 } ] } }, { "type": "mapgen", "method": "json", - "nested_mapgen_id": "fbmf_core_se_metal_south", + "nested_mapgen_id": "fbmh_core_se_metal_south", "object": { "mapgensize": [ 6, 6 ], "rows": [ @@ -359,19 +359,19 @@ " ...", " +ww" ], - "palettes": [ "fbmf_metal_palette" ] + "palettes": [ "fbmh_metal_palette" ] } }, { "type": "mapgen", - "update_mapgen_id": "fbmf_core_se_metal_south", + "update_mapgen_id": "fbmh_core_se_metal_south", "method": "json", - "object": { "place_nested": [ { "chunks": [ "fbmf_core_se_metal_south" ], "x": 9, "y": 15 } ] } + "object": { "place_nested": [ { "chunks": [ "fbmh_core_se_metal_south" ], "x": 9, "y": 15 } ] } }, { "type": "mapgen", "method": "json", - "nested_mapgen_id": "fbmf_core_shack_sw_metal_south", + "nested_mapgen_id": "fbmh_core_shack_sw_metal_south", "object": { "mapgensize": [ 6, 6 ], "rows": [ @@ -382,19 +382,19 @@ "w.. ", "www " ], - "palettes": [ "fbmf_metal_palette" ] + "palettes": [ "fbmh_metal_palette" ] } }, { "type": "mapgen", - "update_mapgen_id": "fbmf_core_shack_sw_metal_south", + "update_mapgen_id": "fbmh_core_shack_sw_metal_south", "method": "json", - "object": { "place_nested": [ { "chunks": [ "fbmf_core_shack_sw_metal_south" ], "x": 9, "y": 15 } ] } + "object": { "place_nested": [ { "chunks": [ "fbmh_core_shack_sw_metal_south" ], "x": 9, "y": 15 } ] } }, { "type": "mapgen", "method": "json", - "nested_mapgen_id": "fbmf_core_sw_metal_south", + "nested_mapgen_id": "fbmh_core_sw_metal_south", "object": { "mapgensize": [ 6, 6 ], "rows": [ @@ -405,23 +405,23 @@ "... ", "www " ], - "palettes": [ "fbmf_metal_palette" ] + "palettes": [ "fbmh_metal_palette" ] } }, { "type": "mapgen", - "update_mapgen_id": "fbmf_core_sw_metal_south", + "update_mapgen_id": "fbmh_core_sw_metal_south", "method": "json", - "object": { "place_nested": [ { "chunks": [ "fbmf_core_sw_metal_south" ], "x": 9, "y": 15 } ] } + "object": { "place_nested": [ { "chunks": [ "fbmh_core_sw_metal_south" ], "x": 9, "y": 15 } ] } }, { "type": "mapgen", - "update_mapgen_id": "fbmf_core_metal_south", + "update_mapgen_id": "fbmh_core_metal_south", "method": "json", "object": { "place_nested": [ - { "chunks": [ "fbmf_core_sw_metal_south" ], "x": 9, "y": 15 }, - { "chunks": [ "fbmf_core_se_metal_south" ], "x": 9, "y": 15 } + { "chunks": [ "fbmh_core_sw_metal_south" ], "x": 9, "y": 15 }, + { "chunks": [ "fbmh_core_se_metal_south" ], "x": 9, "y": 15 } ] } } diff --git a/data/json/mapgen/basecamps/modular_field_tent.json b/data/json/mapgen/basecamps/modular_field_tent.json index 7045c38c3f06d..e2675d80dbe0c 100644 --- a/data/json/mapgen/basecamps/modular_field_tent.json +++ b/data/json/mapgen/basecamps/modular_field_tent.json @@ -1,14 +1,14 @@ [ { "type": "palette", - "id": "fbmf_tent_palette", + "id": "fbmh_tent_palette", "terrain": { " ": "t_dirt", ".": "t_dirtfloor", "+": "t_dirtfloor", "w": "t_dirtfloor" }, "furniture": { "+": "f_canvas_door", "w": "f_canvas_wall" } }, { "type": "mapgen", "method": "json", - "nested_mapgen_id": "fbmf_large_tent_east", + "nested_mapgen_id": "fbmh_large_tent_east", "object": { "mapgensize": [ 6, 6 ], "rows": [ @@ -19,31 +19,31 @@ " w...w", " wwwww" ], - "palettes": [ "fbmf_tent_palette" ] + "palettes": [ "fbmh_tent_palette" ] } }, { "type": "mapgen", - "update_mapgen_id": "fbmf_tent_northeast", + "update_mapgen_id": "fbmh_tent_northeast", "method": "json", - "object": { "place_nested": [ { "chunks": [ "fbmf_large_tent_east" ], "x": 15, "y": 3 } ] } + "object": { "place_nested": [ { "chunks": [ "fbmh_large_tent_east" ], "x": 15, "y": 3 } ] } }, { "type": "mapgen", - "update_mapgen_id": "fbmf_tent_east", + "update_mapgen_id": "fbmh_tent_east", "method": "json", - "object": { "place_nested": [ { "chunks": [ "fbmf_large_tent_east" ], "x": 15, "y": 9 } ] } + "object": { "place_nested": [ { "chunks": [ "fbmh_large_tent_east" ], "x": 15, "y": 9 } ] } }, { "type": "mapgen", - "update_mapgen_id": "fbmf_tent_southeast", + "update_mapgen_id": "fbmh_tent_southeast", "method": "json", - "object": { "place_nested": [ { "chunks": [ "fbmf_large_tent_east" ], "x": 15, "y": 15 } ] } + "object": { "place_nested": [ { "chunks": [ "fbmh_large_tent_east" ], "x": 15, "y": 15 } ] } }, { "type": "mapgen", "method": "json", - "nested_mapgen_id": "fbmf_large_tent_west", + "nested_mapgen_id": "fbmh_large_tent_west", "object": { "mapgensize": [ 6, 6 ], "rows": [ @@ -54,25 +54,25 @@ "w...w ", "wwwww " ], - "palettes": [ "fbmf_tent_palette" ] + "palettes": [ "fbmh_tent_palette" ] } }, { "type": "mapgen", - "update_mapgen_id": "fbmf_tent_northwest", + "update_mapgen_id": "fbmh_tent_northwest", "method": "json", - "object": { "place_nested": [ { "chunks": [ "fbmf_large_tent_west" ], "x": 3, "y": 3 } ] } + "object": { "place_nested": [ { "chunks": [ "fbmh_large_tent_west" ], "x": 3, "y": 3 } ] } }, { "type": "mapgen", - "update_mapgen_id": "fbmf_tent_west", + "update_mapgen_id": "fbmh_tent_west", "method": "json", - "object": { "place_nested": [ { "chunks": [ "fbmf_large_tent_west" ], "x": 3, "y": 9 } ] } + "object": { "place_nested": [ { "chunks": [ "fbmh_large_tent_west" ], "x": 3, "y": 9 } ] } }, { "type": "mapgen", - "update_mapgen_id": "fbmf_tent_southwest", + "update_mapgen_id": "fbmh_tent_southwest", "method": "json", - "object": { "place_nested": [ { "chunks": [ "fbmf_large_tent_west" ], "x": 3, "y": 15 } ] } + "object": { "place_nested": [ { "chunks": [ "fbmh_large_tent_west" ], "x": 3, "y": 15 } ] } } ] diff --git a/data/json/mapgen/basecamps/modular_field_wad.json b/data/json/mapgen/basecamps/modular_field_wad.json index 6c83e4be8ce3c..dfd368333f5c6 100644 --- a/data/json/mapgen/basecamps/modular_field_wad.json +++ b/data/json/mapgen/basecamps/modular_field_wad.json @@ -1,14 +1,14 @@ [ { "type": "palette", - "id": "fbmf_wad_palette", + "id": "fbmh_wad_palette", "terrain": { ";": "t_dirt", ".": "t_floor_primitive", "+": "t_door_makeshift_c", "v": "t_wall_wattle_half", "w": "t_wall_wattle" }, "furniture": { } }, { "type": "mapgen", "method": "json", - "nested_mapgen_id": "fbmf_room0_wad", + "nested_mapgen_id": "fbmh_room0_wad", "object": { "mapgensize": [ 6, 6 ], "rows": [ @@ -19,19 +19,19 @@ " ;;;;;", " ;;;;;" ], - "palettes": [ "fbmf_wad_palette" ] + "palettes": [ "fbmh_wad_palette" ] } }, { "type": "mapgen", - "update_mapgen_id": "fbmf_room0_wad_northeast", + "update_mapgen_id": "fbmh_room0_wad_northeast", "method": "json", - "object": { "place_nested": [ { "chunks": [ "fbmf_room0_wad" ], "x": 15, "y": 3 } ] } + "object": { "place_nested": [ { "chunks": [ "fbmh_room0_wad" ], "x": 15, "y": 3 } ] } }, { "type": "mapgen", "method": "json", - "nested_mapgen_id": "fbmf_room1_wad", + "nested_mapgen_id": "fbmh_room1_wad", "object": { "mapgensize": [ 6, 6 ], "rows": [ @@ -42,19 +42,19 @@ " w...w", " " ], - "palettes": [ "fbmf_wad_palette" ] + "palettes": [ "fbmh_wad_palette" ] } }, { "type": "mapgen", - "update_mapgen_id": "fbmf_room1_wad_northeast", + "update_mapgen_id": "fbmh_room1_wad_northeast", "method": "json", - "object": { "place_nested": [ { "chunks": [ "fbmf_room1_wad" ], "x": 15, "y": 3 } ] } + "object": { "place_nested": [ { "chunks": [ "fbmh_room1_wad" ], "x": 15, "y": 3 } ] } }, { "type": "mapgen", "method": "json", - "nested_mapgen_id": "fbmf_room2_wad", + "nested_mapgen_id": "fbmh_room2_wad", "object": { "mapgensize": [ 6, 6 ], "rows": [ @@ -65,19 +65,19 @@ " ", " wwwww" ], - "palettes": [ "fbmf_wad_palette" ] + "palettes": [ "fbmh_wad_palette" ] } }, { "type": "mapgen", - "update_mapgen_id": "fbmf_room2_wad_northeast", + "update_mapgen_id": "fbmh_room2_wad_northeast", "method": "json", - "object": { "place_nested": [ { "chunks": [ "fbmf_room2_wad" ], "x": 15, "y": 3 } ] } + "object": { "place_nested": [ { "chunks": [ "fbmh_room2_wad" ], "x": 15, "y": 3 } ] } }, { "type": "mapgen", "method": "json", - "nested_mapgen_id": "fbmf_wad_shack_east", + "nested_mapgen_id": "fbmh_wad_shack_east", "object": { "mapgensize": [ 6, 6 ], "rows": [ @@ -88,19 +88,19 @@ "w....w", "w+wwww" ], - "palettes": [ "fbmf_wad_palette" ] + "palettes": [ "fbmh_wad_palette" ] } }, { "type": "mapgen", - "update_mapgen_id": "fbmf_shack4_wad_east", + "update_mapgen_id": "fbmh_shack4_wad_east", "method": "json", - "object": { "place_nested": [ { "chunks": [ "fbmf_wad_shack_east" ], "x": 15, "y": 9 } ] } + "object": { "place_nested": [ { "chunks": [ "fbmh_wad_shack_east" ], "x": 15, "y": 9 } ] } }, { "type": "mapgen", "method": "json", - "nested_mapgen_id": "fbmf_wad_room_east", + "nested_mapgen_id": "fbmh_wad_room_east", "object": { "mapgensize": [ 6, 6 ], "rows": [ @@ -111,34 +111,34 @@ "w....w", "w+wwww" ], - "palettes": [ "fbmf_wad_palette" ] + "palettes": [ "fbmh_wad_palette" ] } }, { "type": "mapgen", - "update_mapgen_id": "fbmf_room4_wad_east", + "update_mapgen_id": "fbmh_room4_wad_east", "method": "json", "object": { - "place_nested": [ { "chunks": [ "fbmf_wad_room_east" ], "x": 15, "y": 9 } ], + "place_nested": [ { "chunks": [ "fbmh_wad_room_east" ], "x": 15, "y": 9 } ], "set": [ { "point": "terrain", "id": "t_wall_wattle", "x": 15, "y": 8 } ] } }, { "type": "mapgen", - "update_mapgen_id": "fbmf_shack4_wad_southeast", + "update_mapgen_id": "fbmh_shack4_wad_southeast", "method": "json", - "object": { "place_nested": [ { "chunks": [ "fbmf_wad_shack_east" ], "x": 15, "y": 15 } ] } + "object": { "place_nested": [ { "chunks": [ "fbmh_wad_shack_east" ], "x": 15, "y": 15 } ] } }, { "type": "mapgen", - "update_mapgen_id": "fbmf_room4_wad_southeast", + "update_mapgen_id": "fbmh_room4_wad_southeast", "method": "json", - "object": { "place_nested": [ { "chunks": [ "fbmf_wad_room_east" ], "x": 15, "y": 15 } ] } + "object": { "place_nested": [ { "chunks": [ "fbmh_wad_room_east" ], "x": 15, "y": 15 } ] } }, { "type": "mapgen", "method": "json", - "nested_mapgen_id": "fbmf_wad_shack_northwest", + "nested_mapgen_id": "fbmh_wad_shack_northwest", "object": { "mapgensize": [ 6, 6 ], "rows": [ @@ -149,19 +149,19 @@ "w...w;", "wwwww;" ], - "palettes": [ "fbmf_wad_palette" ] + "palettes": [ "fbmh_wad_palette" ] } }, { "type": "mapgen", - "update_mapgen_id": "fbmf_room4_wad_northwest", + "update_mapgen_id": "fbmh_room4_wad_northwest", "method": "json", - "object": { "place_nested": [ { "chunks": [ "fbmf_wad_shack_northwest" ], "x": 3, "y": 3 } ] } + "object": { "place_nested": [ { "chunks": [ "fbmh_wad_shack_northwest" ], "x": 3, "y": 3 } ] } }, { "type": "mapgen", "method": "json", - "nested_mapgen_id": "fbmf_wad_shack_west", + "nested_mapgen_id": "fbmh_wad_shack_west", "object": { "mapgensize": [ 6, 6 ], "rows": [ @@ -172,19 +172,19 @@ "w....w", "wwww+w" ], - "palettes": [ "fbmf_wad_palette" ] + "palettes": [ "fbmh_wad_palette" ] } }, { "type": "mapgen", - "update_mapgen_id": "fbmf_shack4_wad_west", + "update_mapgen_id": "fbmh_shack4_wad_west", "method": "json", - "object": { "place_nested": [ { "chunks": [ "fbmf_wad_shack_west" ], "x": 3, "y": 9 } ] } + "object": { "place_nested": [ { "chunks": [ "fbmh_wad_shack_west" ], "x": 3, "y": 9 } ] } }, { "type": "mapgen", "method": "json", - "nested_mapgen_id": "fbmf_wad_room_west", + "nested_mapgen_id": "fbmh_wad_room_west", "object": { "mapgensize": [ 6, 6 ], "rows": [ @@ -195,34 +195,34 @@ "w....w", "wwww+w" ], - "palettes": [ "fbmf_wad_palette" ] + "palettes": [ "fbmh_wad_palette" ] } }, { "type": "mapgen", - "update_mapgen_id": "fbmf_room4_wad_west", + "update_mapgen_id": "fbmh_room4_wad_west", "method": "json", "object": { - "place_nested": [ { "chunks": [ "fbmf_wad_room_west" ], "x": 3, "y": 9 } ], + "place_nested": [ { "chunks": [ "fbmh_wad_room_west" ], "x": 3, "y": 9 } ], "set": [ { "point": "terrain", "id": "t_wall_wattle", "x": 8, "y": 8 } ] } }, { "type": "mapgen", - "update_mapgen_id": "fbmf_shack4_wad_southwest", + "update_mapgen_id": "fbmh_shack4_wad_southwest", "method": "json", - "object": { "place_nested": [ { "chunks": [ "fbmf_wad_shack_west" ], "x": 3, "y": 15 } ] } + "object": { "place_nested": [ { "chunks": [ "fbmh_wad_shack_west" ], "x": 3, "y": 15 } ] } }, { "type": "mapgen", - "update_mapgen_id": "fbmf_room4_wad_southwest", + "update_mapgen_id": "fbmh_room4_wad_southwest", "method": "json", - "object": { "place_nested": [ { "chunks": [ "fbmf_wad_room_west" ], "x": 3, "y": 15 } ] } + "object": { "place_nested": [ { "chunks": [ "fbmh_wad_room_west" ], "x": 3, "y": 15 } ] } }, { "type": "mapgen", "method": "json", - "nested_mapgen_id": "fbmf_core_shack_ne_wad_center", + "nested_mapgen_id": "fbmh_core_shack_ne_wad_center", "object": { "mapgensize": [ 6, 6 ], "rows": [ @@ -233,19 +233,19 @@ " ..w", " ..w" ], - "palettes": [ "fbmf_wad_palette" ] + "palettes": [ "fbmh_wad_palette" ] } }, { "type": "mapgen", - "update_mapgen_id": "fbmf_core_shack_ne_wad_center", + "update_mapgen_id": "fbmh_core_shack_ne_wad_center", "method": "json", - "object": { "place_nested": [ { "chunks": [ "fbmf_core_shack_ne_wad_center" ], "x": 9, "y": 9 } ] } + "object": { "place_nested": [ { "chunks": [ "fbmh_core_shack_ne_wad_center" ], "x": 9, "y": 9 } ] } }, { "type": "mapgen", "method": "json", - "nested_mapgen_id": "fbmf_core_ne_wad_center", + "nested_mapgen_id": "fbmh_core_ne_wad_center", "object": { "mapgensize": [ 6, 6 ], "rows": [ @@ -256,19 +256,19 @@ " ...", " ..." ], - "palettes": [ "fbmf_wad_palette" ] + "palettes": [ "fbmh_wad_palette" ] } }, { "type": "mapgen", - "update_mapgen_id": "fbmf_core_ne_wad_center", + "update_mapgen_id": "fbmh_core_ne_wad_center", "method": "json", - "object": { "place_nested": [ { "chunks": [ "fbmf_core_ne_wad_center" ], "x": 9, "y": 9 } ] } + "object": { "place_nested": [ { "chunks": [ "fbmh_core_ne_wad_center" ], "x": 9, "y": 9 } ] } }, { "type": "mapgen", "method": "json", - "nested_mapgen_id": "fbmf_core_shack_nw_wad_center", + "nested_mapgen_id": "fbmh_core_shack_nw_wad_center", "object": { "mapgensize": [ 6, 6 ], "rows": [ @@ -279,19 +279,19 @@ "w.. ", "w.. " ], - "palettes": [ "fbmf_wad_palette" ] + "palettes": [ "fbmh_wad_palette" ] } }, { "type": "mapgen", - "update_mapgen_id": "fbmf_core_shack_nw_wad_center", + "update_mapgen_id": "fbmh_core_shack_nw_wad_center", "method": "json", - "object": { "place_nested": [ { "chunks": [ "fbmf_core_shack_nw_wad_center" ], "x": 9, "y": 9 } ] } + "object": { "place_nested": [ { "chunks": [ "fbmh_core_shack_nw_wad_center" ], "x": 9, "y": 9 } ] } }, { "type": "mapgen", "method": "json", - "nested_mapgen_id": "fbmf_core_nw_wad_center", + "nested_mapgen_id": "fbmh_core_nw_wad_center", "object": { "mapgensize": [ 6, 6 ], "rows": [ @@ -302,30 +302,30 @@ "... ", "... " ], - "palettes": [ "fbmf_wad_palette" ] + "palettes": [ "fbmh_wad_palette" ] } }, { "type": "mapgen", - "update_mapgen_id": "fbmf_core_nw_wad_center", + "update_mapgen_id": "fbmh_core_nw_wad_center", "method": "json", - "object": { "place_nested": [ { "chunks": [ "fbmf_core_nw_wad_center" ], "x": 9, "y": 9 } ] } + "object": { "place_nested": [ { "chunks": [ "fbmh_core_nw_wad_center" ], "x": 9, "y": 9 } ] } }, { "type": "mapgen", - "update_mapgen_id": "fbmf_core_wad_center", + "update_mapgen_id": "fbmh_core_wad_center", "method": "json", "object": { "place_nested": [ - { "chunks": [ "fbmf_core_nw_wad_center" ], "x": 9, "y": 9 }, - { "chunks": [ "fbmf_core_ne_wad_center" ], "x": 9, "y": 9 } + { "chunks": [ "fbmh_core_nw_wad_center" ], "x": 9, "y": 9 }, + { "chunks": [ "fbmh_core_ne_wad_center" ], "x": 9, "y": 9 } ] } }, { "type": "mapgen", "method": "json", - "nested_mapgen_id": "fbmf_core_shack_se_wad_south", + "nested_mapgen_id": "fbmh_core_shack_se_wad_south", "object": { "mapgensize": [ 6, 6 ], "rows": [ @@ -336,19 +336,19 @@ " ..w", " +ww" ], - "palettes": [ "fbmf_wad_palette" ] + "palettes": [ "fbmh_wad_palette" ] } }, { "type": "mapgen", - "update_mapgen_id": "fbmf_core_shack_se_wad_south", + "update_mapgen_id": "fbmh_core_shack_se_wad_south", "method": "json", - "object": { "place_nested": [ { "chunks": [ "fbmf_core_shack_se_wad_south" ], "x": 9, "y": 15 } ] } + "object": { "place_nested": [ { "chunks": [ "fbmh_core_shack_se_wad_south" ], "x": 9, "y": 15 } ] } }, { "type": "mapgen", "method": "json", - "nested_mapgen_id": "fbmf_core_se_wad_south", + "nested_mapgen_id": "fbmh_core_se_wad_south", "object": { "mapgensize": [ 6, 6 ], "rows": [ @@ -359,19 +359,19 @@ " ...", " +ww" ], - "palettes": [ "fbmf_wad_palette" ] + "palettes": [ "fbmh_wad_palette" ] } }, { "type": "mapgen", - "update_mapgen_id": "fbmf_core_se_wad_south", + "update_mapgen_id": "fbmh_core_se_wad_south", "method": "json", - "object": { "place_nested": [ { "chunks": [ "fbmf_core_se_wad_south" ], "x": 9, "y": 15 } ] } + "object": { "place_nested": [ { "chunks": [ "fbmh_core_se_wad_south" ], "x": 9, "y": 15 } ] } }, { "type": "mapgen", "method": "json", - "nested_mapgen_id": "fbmf_core_shack_sw_wad_south", + "nested_mapgen_id": "fbmh_core_shack_sw_wad_south", "object": { "mapgensize": [ 6, 6 ], "rows": [ @@ -382,19 +382,19 @@ "w.. ", "www " ], - "palettes": [ "fbmf_wad_palette" ] + "palettes": [ "fbmh_wad_palette" ] } }, { "type": "mapgen", - "update_mapgen_id": "fbmf_core_shack_sw_wad_south", + "update_mapgen_id": "fbmh_core_shack_sw_wad_south", "method": "json", - "object": { "place_nested": [ { "chunks": [ "fbmf_core_shack_sw_wad_south" ], "x": 9, "y": 15 } ] } + "object": { "place_nested": [ { "chunks": [ "fbmh_core_shack_sw_wad_south" ], "x": 9, "y": 15 } ] } }, { "type": "mapgen", "method": "json", - "nested_mapgen_id": "fbmf_core_sw_wad_south", + "nested_mapgen_id": "fbmh_core_sw_wad_south", "object": { "mapgensize": [ 6, 6 ], "rows": [ @@ -405,23 +405,23 @@ "... ", "www " ], - "palettes": [ "fbmf_wad_palette" ] + "palettes": [ "fbmh_wad_palette" ] } }, { "type": "mapgen", - "update_mapgen_id": "fbmf_core_sw_wad_south", + "update_mapgen_id": "fbmh_core_sw_wad_south", "method": "json", - "object": { "place_nested": [ { "chunks": [ "fbmf_core_sw_wad_south" ], "x": 9, "y": 15 } ] } + "object": { "place_nested": [ { "chunks": [ "fbmh_core_sw_wad_south" ], "x": 9, "y": 15 } ] } }, { "type": "mapgen", - "update_mapgen_id": "fbmf_core_wad_south", + "update_mapgen_id": "fbmh_core_wad_south", "method": "json", "object": { "place_nested": [ - { "chunks": [ "fbmf_core_sw_wad_south" ], "x": 9, "y": 15 }, - { "chunks": [ "fbmf_core_se_wad_south" ], "x": 9, "y": 15 } + { "chunks": [ "fbmh_core_sw_wad_south" ], "x": 9, "y": 15 }, + { "chunks": [ "fbmh_core_se_wad_south" ], "x": 9, "y": 15 } ] } } diff --git a/data/json/mapgen/basecamps/modular_field_wood.json b/data/json/mapgen/basecamps/modular_field_wood.json index cae2a3cae11e2..5f2db459d69ef 100644 --- a/data/json/mapgen/basecamps/modular_field_wood.json +++ b/data/json/mapgen/basecamps/modular_field_wood.json @@ -1,14 +1,14 @@ [ { "type": "palette", - "id": "fbmf_wood_palette", + "id": "fbmh_wood_palette", "terrain": { ";": "t_dirt", ".": "t_floor", "+": "t_door_c", "v": "t_window_no_curtains", "w": "t_wall_wood" }, "furniture": { } }, { "type": "mapgen", "method": "json", - "nested_mapgen_id": "fbmf_room0_wood", + "nested_mapgen_id": "fbmh_room0_wood", "object": { "mapgensize": [ 6, 6 ], "rows": [ @@ -19,19 +19,19 @@ " ;;;;;", " ;;;;;" ], - "palettes": [ "fbmf_wood_palette" ] + "palettes": [ "fbmh_wood_palette" ] } }, { "type": "mapgen", - "update_mapgen_id": "fbmf_room0_wood_northeast", + "update_mapgen_id": "fbmh_room0_wood_northeast", "method": "json", - "object": { "place_nested": [ { "chunks": [ "fbmf_room0_wood" ], "x": 15, "y": 3 } ] } + "object": { "place_nested": [ { "chunks": [ "fbmh_room0_wood" ], "x": 15, "y": 3 } ] } }, { "type": "mapgen", "method": "json", - "nested_mapgen_id": "fbmf_room1_wood", + "nested_mapgen_id": "fbmh_room1_wood", "object": { "mapgensize": [ 6, 6 ], "rows": [ @@ -42,19 +42,19 @@ " w...w", " " ], - "palettes": [ "fbmf_wood_palette" ] + "palettes": [ "fbmh_wood_palette" ] } }, { "type": "mapgen", - "update_mapgen_id": "fbmf_room1_wood_northeast", + "update_mapgen_id": "fbmh_room1_wood_northeast", "method": "json", - "object": { "place_nested": [ { "chunks": [ "fbmf_room1_wood" ], "x": 15, "y": 3 } ] } + "object": { "place_nested": [ { "chunks": [ "fbmh_room1_wood" ], "x": 15, "y": 3 } ] } }, { "type": "mapgen", "method": "json", - "nested_mapgen_id": "fbmf_room2_wood", + "nested_mapgen_id": "fbmh_room2_wood", "object": { "mapgensize": [ 6, 6 ], "rows": [ @@ -65,19 +65,19 @@ " ", " wwwww" ], - "palettes": [ "fbmf_wood_palette" ] + "palettes": [ "fbmh_wood_palette" ] } }, { "type": "mapgen", - "update_mapgen_id": "fbmf_room2_wood_northeast", + "update_mapgen_id": "fbmh_room2_wood_northeast", "method": "json", - "object": { "place_nested": [ { "chunks": [ "fbmf_room2_wood" ], "x": 15, "y": 3 } ] } + "object": { "place_nested": [ { "chunks": [ "fbmh_room2_wood" ], "x": 15, "y": 3 } ] } }, { "type": "mapgen", "method": "json", - "nested_mapgen_id": "fbmf_wood_shack_east", + "nested_mapgen_id": "fbmh_wood_shack_east", "object": { "mapgensize": [ 6, 6 ], "rows": [ @@ -88,19 +88,19 @@ "w....w", "w+wwww" ], - "palettes": [ "fbmf_wood_palette" ] + "palettes": [ "fbmh_wood_palette" ] } }, { "type": "mapgen", - "update_mapgen_id": "fbmf_shack4_wood_east", + "update_mapgen_id": "fbmh_shack4_wood_east", "method": "json", - "object": { "place_nested": [ { "chunks": [ "fbmf_wood_shack_east" ], "x": 15, "y": 9 } ] } + "object": { "place_nested": [ { "chunks": [ "fbmh_wood_shack_east" ], "x": 15, "y": 9 } ] } }, { "type": "mapgen", "method": "json", - "nested_mapgen_id": "fbmf_wood_room_east", + "nested_mapgen_id": "fbmh_wood_room_east", "object": { "mapgensize": [ 6, 6 ], "rows": [ @@ -111,34 +111,34 @@ "w....w", "w+wwww" ], - "palettes": [ "fbmf_wood_palette" ] + "palettes": [ "fbmh_wood_palette" ] } }, { "type": "mapgen", - "update_mapgen_id": "fbmf_room4_wood_east", + "update_mapgen_id": "fbmh_room4_wood_east", "method": "json", "object": { - "place_nested": [ { "chunks": [ "fbmf_wood_room_east" ], "x": 15, "y": 9 } ], + "place_nested": [ { "chunks": [ "fbmh_wood_room_east" ], "x": 15, "y": 9 } ], "set": [ { "point": "terrain", "id": "t_wall_wood", "x": 15, "y": 8 } ] } }, { "type": "mapgen", - "update_mapgen_id": "fbmf_shack4_wood_southeast", + "update_mapgen_id": "fbmh_shack4_wood_southeast", "method": "json", - "object": { "place_nested": [ { "chunks": [ "fbmf_wood_shack_east" ], "x": 15, "y": 15 } ] } + "object": { "place_nested": [ { "chunks": [ "fbmh_wood_shack_east" ], "x": 15, "y": 15 } ] } }, { "type": "mapgen", - "update_mapgen_id": "fbmf_room4_wood_southeast", + "update_mapgen_id": "fbmh_room4_wood_southeast", "method": "json", - "object": { "place_nested": [ { "chunks": [ "fbmf_wood_room_east" ], "x": 15, "y": 15 } ] } + "object": { "place_nested": [ { "chunks": [ "fbmh_wood_room_east" ], "x": 15, "y": 15 } ] } }, { "type": "mapgen", "method": "json", - "nested_mapgen_id": "fbmf_wood_shack_northwest", + "nested_mapgen_id": "fbmh_wood_shack_northwest", "object": { "mapgensize": [ 6, 6 ], "rows": [ @@ -149,19 +149,19 @@ "w...w;", "wwwww;" ], - "palettes": [ "fbmf_wood_palette" ] + "palettes": [ "fbmh_wood_palette" ] } }, { "type": "mapgen", - "update_mapgen_id": "fbmf_room4_wood_northwest", + "update_mapgen_id": "fbmh_room4_wood_northwest", "method": "json", - "object": { "place_nested": [ { "chunks": [ "fbmf_wood_shack_northwest" ], "x": 3, "y": 3 } ] } + "object": { "place_nested": [ { "chunks": [ "fbmh_wood_shack_northwest" ], "x": 3, "y": 3 } ] } }, { "type": "mapgen", "method": "json", - "nested_mapgen_id": "fbmf_wood_shack_west", + "nested_mapgen_id": "fbmh_wood_shack_west", "object": { "mapgensize": [ 6, 6 ], "rows": [ @@ -172,19 +172,19 @@ "w....w", "wwww+w" ], - "palettes": [ "fbmf_wood_palette" ] + "palettes": [ "fbmh_wood_palette" ] } }, { "type": "mapgen", - "update_mapgen_id": "fbmf_shack4_wood_west", + "update_mapgen_id": "fbmh_shack4_wood_west", "method": "json", - "object": { "place_nested": [ { "chunks": [ "fbmf_wood_shack_west" ], "x": 3, "y": 9 } ] } + "object": { "place_nested": [ { "chunks": [ "fbmh_wood_shack_west" ], "x": 3, "y": 9 } ] } }, { "type": "mapgen", "method": "json", - "nested_mapgen_id": "fbmf_wood_room_west", + "nested_mapgen_id": "fbmh_wood_room_west", "object": { "mapgensize": [ 6, 6 ], "rows": [ @@ -195,34 +195,34 @@ "w....w", "wwww+w" ], - "palettes": [ "fbmf_wood_palette" ] + "palettes": [ "fbmh_wood_palette" ] } }, { "type": "mapgen", - "update_mapgen_id": "fbmf_room4_wood_west", + "update_mapgen_id": "fbmh_room4_wood_west", "method": "json", "object": { - "place_nested": [ { "chunks": [ "fbmf_wood_room_west" ], "x": 3, "y": 9 } ], + "place_nested": [ { "chunks": [ "fbmh_wood_room_west" ], "x": 3, "y": 9 } ], "set": [ { "point": "terrain", "id": "t_wall_wood", "x": 8, "y": 8 } ] } }, { "type": "mapgen", - "update_mapgen_id": "fbmf_shack4_wood_southwest", + "update_mapgen_id": "fbmh_shack4_wood_southwest", "method": "json", - "object": { "place_nested": [ { "chunks": [ "fbmf_wood_shack_west" ], "x": 3, "y": 15 } ] } + "object": { "place_nested": [ { "chunks": [ "fbmh_wood_shack_west" ], "x": 3, "y": 15 } ] } }, { "type": "mapgen", - "update_mapgen_id": "fbmf_room4_wood_southwest", + "update_mapgen_id": "fbmh_room4_wood_southwest", "method": "json", - "object": { "place_nested": [ { "chunks": [ "fbmf_wood_room_west" ], "x": 3, "y": 15 } ] } + "object": { "place_nested": [ { "chunks": [ "fbmh_wood_room_west" ], "x": 3, "y": 15 } ] } }, { "type": "mapgen", "method": "json", - "nested_mapgen_id": "fbmf_core_shack_ne_wood_center", + "nested_mapgen_id": "fbmh_core_shack_ne_wood_center", "object": { "mapgensize": [ 6, 6 ], "rows": [ @@ -233,19 +233,19 @@ " ..w", " ..w" ], - "palettes": [ "fbmf_wood_palette" ] + "palettes": [ "fbmh_wood_palette" ] } }, { "type": "mapgen", - "update_mapgen_id": "fbmf_core_shack_ne_wood_center", + "update_mapgen_id": "fbmh_core_shack_ne_wood_center", "method": "json", - "object": { "place_nested": [ { "chunks": [ "fbmf_core_shack_ne_wood_center" ], "x": 9, "y": 9 } ] } + "object": { "place_nested": [ { "chunks": [ "fbmh_core_shack_ne_wood_center" ], "x": 9, "y": 9 } ] } }, { "type": "mapgen", "method": "json", - "nested_mapgen_id": "fbmf_core_ne_wood_center", + "nested_mapgen_id": "fbmh_core_ne_wood_center", "object": { "mapgensize": [ 6, 6 ], "rows": [ @@ -256,19 +256,19 @@ " ...", " ..." ], - "palettes": [ "fbmf_wood_palette" ] + "palettes": [ "fbmh_wood_palette" ] } }, { "type": "mapgen", - "update_mapgen_id": "fbmf_core_ne_wood_center", + "update_mapgen_id": "fbmh_core_ne_wood_center", "method": "json", - "object": { "place_nested": [ { "chunks": [ "fbmf_core_ne_wood_center" ], "x": 9, "y": 9 } ] } + "object": { "place_nested": [ { "chunks": [ "fbmh_core_ne_wood_center" ], "x": 9, "y": 9 } ] } }, { "type": "mapgen", "method": "json", - "nested_mapgen_id": "fbmf_core_shack_nw_wood_center", + "nested_mapgen_id": "fbmh_core_shack_nw_wood_center", "object": { "mapgensize": [ 6, 6 ], "rows": [ @@ -279,19 +279,19 @@ "w.. ", "w.. " ], - "palettes": [ "fbmf_wood_palette" ] + "palettes": [ "fbmh_wood_palette" ] } }, { "type": "mapgen", - "update_mapgen_id": "fbmf_core_shack_nw_wood_center", + "update_mapgen_id": "fbmh_core_shack_nw_wood_center", "method": "json", - "object": { "place_nested": [ { "chunks": [ "fbmf_core_shack_nw_wood_center" ], "x": 9, "y": 9 } ] } + "object": { "place_nested": [ { "chunks": [ "fbmh_core_shack_nw_wood_center" ], "x": 9, "y": 9 } ] } }, { "type": "mapgen", "method": "json", - "nested_mapgen_id": "fbmf_core_nw_wood_center", + "nested_mapgen_id": "fbmh_core_nw_wood_center", "object": { "mapgensize": [ 6, 6 ], "rows": [ @@ -302,30 +302,30 @@ "... ", "... " ], - "palettes": [ "fbmf_wood_palette" ] + "palettes": [ "fbmh_wood_palette" ] } }, { "type": "mapgen", - "update_mapgen_id": "fbmf_core_nw_wood_center", + "update_mapgen_id": "fbmh_core_nw_wood_center", "method": "json", - "object": { "place_nested": [ { "chunks": [ "fbmf_core_nw_wood_center" ], "x": 9, "y": 9 } ] } + "object": { "place_nested": [ { "chunks": [ "fbmh_core_nw_wood_center" ], "x": 9, "y": 9 } ] } }, { "type": "mapgen", - "update_mapgen_id": "fbmf_core_wood_center", + "update_mapgen_id": "fbmh_core_wood_center", "method": "json", "object": { "place_nested": [ - { "chunks": [ "fbmf_core_nw_wood_center" ], "x": 9, "y": 9 }, - { "chunks": [ "fbmf_core_ne_wood_center" ], "x": 9, "y": 9 } + { "chunks": [ "fbmh_core_nw_wood_center" ], "x": 9, "y": 9 }, + { "chunks": [ "fbmh_core_ne_wood_center" ], "x": 9, "y": 9 } ] } }, { "type": "mapgen", "method": "json", - "nested_mapgen_id": "fbmf_core_shack_se_wood_south", + "nested_mapgen_id": "fbmh_core_shack_se_wood_south", "object": { "mapgensize": [ 6, 6 ], "rows": [ @@ -336,19 +336,19 @@ " ..w", " +ww" ], - "palettes": [ "fbmf_wood_palette" ] + "palettes": [ "fbmh_wood_palette" ] } }, { "type": "mapgen", - "update_mapgen_id": "fbmf_core_shack_se_wood_south", + "update_mapgen_id": "fbmh_core_shack_se_wood_south", "method": "json", - "object": { "place_nested": [ { "chunks": [ "fbmf_core_shack_se_wood_south" ], "x": 9, "y": 15 } ] } + "object": { "place_nested": [ { "chunks": [ "fbmh_core_shack_se_wood_south" ], "x": 9, "y": 15 } ] } }, { "type": "mapgen", "method": "json", - "nested_mapgen_id": "fbmf_core_se_wood_south", + "nested_mapgen_id": "fbmh_core_se_wood_south", "object": { "mapgensize": [ 6, 6 ], "rows": [ @@ -359,19 +359,19 @@ " ...", " +ww" ], - "palettes": [ "fbmf_wood_palette" ] + "palettes": [ "fbmh_wood_palette" ] } }, { "type": "mapgen", - "update_mapgen_id": "fbmf_core_se_wood_south", + "update_mapgen_id": "fbmh_core_se_wood_south", "method": "json", - "object": { "place_nested": [ { "chunks": [ "fbmf_core_se_wood_south" ], "x": 9, "y": 15 } ] } + "object": { "place_nested": [ { "chunks": [ "fbmh_core_se_wood_south" ], "x": 9, "y": 15 } ] } }, { "type": "mapgen", "method": "json", - "nested_mapgen_id": "fbmf_core_shack_sw_wood_south", + "nested_mapgen_id": "fbmh_core_shack_sw_wood_south", "object": { "mapgensize": [ 6, 6 ], "rows": [ @@ -382,19 +382,19 @@ "w.. ", "www " ], - "palettes": [ "fbmf_wood_palette" ] + "palettes": [ "fbmh_wood_palette" ] } }, { "type": "mapgen", - "update_mapgen_id": "fbmf_core_shack_sw_wood_south", + "update_mapgen_id": "fbmh_core_shack_sw_wood_south", "method": "json", - "object": { "place_nested": [ { "chunks": [ "fbmf_core_shack_sw_wood_south" ], "x": 9, "y": 15 } ] } + "object": { "place_nested": [ { "chunks": [ "fbmh_core_shack_sw_wood_south" ], "x": 9, "y": 15 } ] } }, { "type": "mapgen", "method": "json", - "nested_mapgen_id": "fbmf_core_sw_wood_south", + "nested_mapgen_id": "fbmh_core_sw_wood_south", "object": { "mapgensize": [ 6, 6 ], "rows": [ @@ -405,23 +405,23 @@ "... ", "www " ], - "palettes": [ "fbmf_wood_palette" ] + "palettes": [ "fbmh_wood_palette" ] } }, { "type": "mapgen", - "update_mapgen_id": "fbmf_core_sw_wood_south", + "update_mapgen_id": "fbmh_core_sw_wood_south", "method": "json", - "object": { "place_nested": [ { "chunks": [ "fbmf_core_sw_wood_south" ], "x": 9, "y": 15 } ] } + "object": { "place_nested": [ { "chunks": [ "fbmh_core_sw_wood_south" ], "x": 9, "y": 15 } ] } }, { "type": "mapgen", - "update_mapgen_id": "fbmf_core_wood_south", + "update_mapgen_id": "fbmh_core_wood_south", "method": "json", "object": { "place_nested": [ - { "chunks": [ "fbmf_core_sw_wood_south" ], "x": 9, "y": 15 }, - { "chunks": [ "fbmf_core_se_wood_south" ], "x": 9, "y": 15 } + { "chunks": [ "fbmh_core_sw_wood_south" ], "x": 9, "y": 15 }, + { "chunks": [ "fbmh_core_se_wood_south" ], "x": 9, "y": 15 } ] } } diff --git a/data/json/mapgen/basement/basement_meth.json b/data/json/mapgen/basement/basement_meth.json index d2a7309b6e2aa..93a3658e68354 100644 --- a/data/json/mapgen/basement/basement_meth.json +++ b/data/json/mapgen/basement/basement_meth.json @@ -101,13 +101,13 @@ { "monster": "mon_zombie", "x": [ 13, 14 ], "y": [ 11, 17 ], "chance": 90, "repeat": [ 1, 3 ] } ], "place_fields": [ - { "x": [ 15, 16 ], "y": [ 5, 6 ], "field": "fd_blood", "density": 3 }, - { "x": [ 15, 16 ], "y": [ 5, 6 ], "field": "fd_blood", "density": 2 }, - { "x": [ 14, 19 ], "y": [ 12, 13 ], "field": "fd_toxic_gas", "density": 3 }, - { "x": [ 14, 19 ], "y": [ 12, 13 ], "field": "fd_toxic_gas", "density": 3 }, - { "x": [ 14, 16 ], "y": [ 12, 13 ], "field": "fd_toxic_gas", "density": 3 }, - { "x": [ 14, 16 ], "y": [ 12, 13 ], "field": "fd_toxic_gas", "density": 3 }, - { "x": [ 14, 16 ], "y": [ 12, 13 ], "field": "fd_toxic_gas", "density": 3 } + { "x": [ 15, 16 ], "y": [ 5, 6 ], "field": "fd_blood", "intensity": 3 }, + { "x": [ 15, 16 ], "y": [ 5, 6 ], "field": "fd_blood", "intensity": 2 }, + { "x": [ 14, 19 ], "y": [ 12, 13 ], "field": "fd_toxic_gas", "intensity": 3 }, + { "x": [ 14, 19 ], "y": [ 12, 13 ], "field": "fd_toxic_gas", "intensity": 3 }, + { "x": [ 14, 16 ], "y": [ 12, 13 ], "field": "fd_toxic_gas", "intensity": 3 }, + { "x": [ 14, 16 ], "y": [ 12, 13 ], "field": "fd_toxic_gas", "intensity": 3 }, + { "x": [ 14, 16 ], "y": [ 12, 13 ], "field": "fd_toxic_gas", "intensity": 3 } ] } }, diff --git a/data/json/mapgen/farm.json b/data/json/mapgen/farm.json index 734e4997fff11..3fb11bc35b849 100644 --- a/data/json/mapgen/farm.json +++ b/data/json/mapgen/farm.json @@ -5,7 +5,7 @@ "om_terrain": [ [ "farm_3", "farm_2", "farm_1" ], [ "farm_6", "farm_5", "farm_4" ], [ "farm_9", "farm_8", "farm_7" ] ], "weight": 250, "object": { - "fill_ter": "t_dirt", + "fill_ter": "t_floor", "rows": [ " FFFFFFFFFFFFFFFFFFFFFF ", " P F F ", @@ -19,9 +19,9 @@ " #333__________ 233W F F ", " #__2__________ 2__# $$$ $$$ F DDDDDDDDDDDDDDDD F ", " #__2__________ 2__# ###++### --w---+-----w-- F Q F ", - " W__g__________ g__W #EE____# -uSeuu...Y....- F DDDDDDDDDDDDDDDD F ", + " W__g__________ g__W #EE____# -u5e4u...Y....- F DDDDDDDDDDDDDDDD F ", " W__g__________ g__W #E_____# -o............- F F ", - " #__2__________ 2__# #_1__1_# -u..........H.- F DDDDDDDDDDDDDDDD F ", + " #__2__________ 2__# #_1__1_# -6..........H.- F DDDDDDDDDDDDDDDD F ", " #__2__________ 2__# #______# -u...----+----- F F ", " #332__________ 233# #______# --+---kh......- F DDDDDDDDDDDDDDDD F ", " #_____________1___# #_1__1_# -...-.........w F F ", @@ -80,39 +80,6 @@ "F F ", "FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF " ], - "terrain": { - "Q": [ "t_grass", "t_grass", "t_grass", "t_dirt" ], - "#": "t_wall_wood", - "+": "t_door_c", - "5": "t_palisade_pulley", - "H": "t_floor", - "g": "t_fencegate_c" - }, - "toilets": { "T": { } }, - "items": { - "B": { "item": "bed", "chance": 60 }, - "D": { "item": "hydro", "chance": 5 }, - "H": { "item": "livingroom", "chance": 65 }, - "b": { "item": "softdrugs", "chance": 70 }, - "d": [ { "item": "dresser", "chance": 80 }, { "item": "homeguns", "chance": 20 } ], - "e": { "item": "fridge", "chance": 65 }, - "h": { "item": "bedroom", "chance": 65 }, - "k": { "item": "bedroom", "chance": 65 }, - "Y": { "item": "coat_rack", "chance": 35, "repeat": [ 1, 4 ] }, - "P": { "item": "mail", "chance": 30, "repeat": [ 2, 5 ] }, - "l": [ - { "item": "tools_earthworking", "chance": 65 }, - { "item": "mechanics", "chance": 40 }, - { "item": "home_hw", "chance": 50 }, - { "item": "tools_common", "chance": 50 } - ], - "u": [ - { "item": "kitchen", "chance": 70 }, - { "item": "cannedfood", "chance": 65 }, - { "item": "moonshine_brew", "chance": 65 } - ], - "Q": { "item": "farming_tools", "chance": 15 } - }, "place_items": [ ], "place_item": [ { "item": "straw_pile", "x": [ 3, 5 ], "y": [ 5, 7 ], "amount": [ 0, 8 ] }, @@ -135,7 +102,7 @@ "om_terrain": [ [ "farm_2" ] ], "weight": 250, "object": { - "fill_ter": "t_dirt", + "fill_ter": "t_floor", "rows": [ " ", "P ", @@ -149,9 +116,9 @@ " ", " $$$ $$$ ", "###++### --w---+-----w--", - "#EE____# -uSeuu.mm.....-", + "#EE____# -u5e4u.mm.....-", "#E_____# -o...........m-", - "#_1__1_# -u...........m-", + "#_1__1_# -6...........m-", "#__Q___# -u...----+-----", "#______# --+---mm....mm-", "#_1__1_# -...-.........w", @@ -163,8 +130,6 @@ "FFFFFFFFFFFFFFFFFFFFFFFF", ",,,,,,,,,,,,,,,,,,,,,,,," ], - "terrain": { "#": "t_wall_wood", "+": "t_door_c", "5": "t_palisade_pulley", "H": "t_floor", "g": "t_fencegate_c" }, - "toilets": { "T": { } }, "items": { ".": { "item": "trash", "chance": 20 }, "B": [ @@ -208,7 +173,7 @@ "//": "Grain silo copy of silo in ranch_camp_57", "weight": 250, "object": { - "fill_ter": "t_dirt", + "fill_ter": "t_dirtfloor", "rows": [ " ", " |--| ####W###W### ", @@ -217,9 +182,9 @@ "|________A_________s# ", "||______||H________s# ", " |-|__|-|#__________W ", - " |--| #_______5__# ", - " ####====#### ", - " 5 ", + " |--| #_______O__# ", + " ####MMMM#### ", + " O ", " ", " ", " ", @@ -235,7 +200,6 @@ " F DDDDDDDDDDDDDDDD F ", "FF F " ], - "terrain": { "#": "t_wall_wood" }, "items": { "D": { "item": "hydro", "chance": 5 }, "r": { "item": "farming_tools", "chance": 25 } }, "place_item": [ { "item": "wheat", "x": [ 4, 5 ], "y": 2, "chance": 40 }, @@ -254,7 +218,7 @@ "//": "Chicken Coop", "weight": 250, "object": { - "fill_ter": "t_dirt", + "fill_ter": "t_dirtfloor", "rows": [ " ", " ", @@ -281,8 +245,6 @@ " F DDDDDDDDDDDDDDDD F ", "FF F " ], - "terrain": { "#": "t_wall_wood", "+": "t_door_c" }, - "items": { "D": { "item": "hydro", "chance": 5 } }, "monster": { "7": { "monster": "mon_chicken" }, "8": { "monster": "mon_chicken_chick" } }, "place_item": [ { "item": "straw_pile", "x": 12, "y": 3, "chance": 75 }, @@ -312,16 +274,16 @@ "rows": [ " ", " ", - " ################## ", - " #DDDDDDDDDDDDDDDD# ", - " #D_______________# ", - " #D__DDDDDDDDDD__r# ", - " +_______________r# ", - " +_______________r# ", - " #D__DDDDDDDDDD__r# ", - " #D_______________# ", - " #DDDDDDDDDDDDDDDD# ", - " ################## ", + " GGGGGGGGGGGGGGGGGG ", + " GDDDDDDDDDDDDDDDDG ", + " GD_______________G ", + " GD__DDDDDDDDDD__rG ", + " ~_______________rG ", + " ~_______________rG ", + " GD__DDDDDDDDDD__rG ", + " GD_______________G ", + " GDDDDDDDDDDDDDDDDG ", + " GGGGGGGGGGGGGGGGGG ", " ", " ", " FFFFFFFFFFFFFFFFFFFFFF ", @@ -335,8 +297,46 @@ " F DDDDDDDDDDDDDDDD F ", "FF F " ], - "items": { "D": { "item": "hydro", "chance": 5 }, "r": { "item": "tools_earthworking", "chance": 20 } }, + "items": { "r": { "item": "tools_earthworking", "chance": 20 } }, "palettes": [ "farm" ] } + }, + { + "type": "mapgen", + "method": "json", + "om_terrain": [ [ "farm_3_roof", "farm_2_roof" ] ], + "weight": 250, + "object": { + "fill_ter": "t_shingle_flat_roof", + "rows": [ + " ", + " ", + " ", + " ", + " ,,,,,,,,,,,,,,,,,,, ", + " ,,,,,,,,,,,,,,,,,,, ", + " ,,,,,,,,,,,,,,,,,,, ", + " ,,,,,,,,,,,,,,,,,,, ", + " ,,,,,,,,,,,,,,,,,,, ", + " ,,,,,,,,,,,,,,,,,,, ", + " ,,,,,,,,,,,,,,,,,,, ... ", + " ,,,,,,,,,,,,,,,,,,, ,,,,,,,, 22222...2222222", + " ,,,,,,,,,,,,,,,,,,, ,,,,,,,, ...............", + " ,,,,,,,,,,,,,,,,,,, ,,,,,,,, ...............", + " ,,,,,,,,,,,,,,,,,,, ,,,,,,,, ..&..........:.", + " ,,,,,,,,,,,,,,,,,,, ,,,,,,,, ...............", + " ,,,,,,,,,,,,,,,,,,, ,,,,,,,, .............X.", + " ,,,,,,,,,,,,,,,,,,, ,,,,,,,, ...............", + " ,,,,,,,,,,,,,,,,,,, ,,,,,,,, .=.............", + " ,,,,,,,,,,,,,,,,,,, ,,,,,,,, ...............", + " ,,,,,,,,,,,,,,,,,,, ,,,,,,,, ---------------", + " ,,,,,,,,,,,,,,,,,,, ", + " ", + " ", + " " + ], + "palettes": [ "roof_palette" ], + "terrain": { ".": "t_shingle_flat_roof", ",": "t_metal_flat_roof" } + } } ] diff --git a/data/json/mapgen/field_football.json b/data/json/mapgen/field_football.json index 352e9f85cbe83..5e587a0706506 100644 --- a/data/json/mapgen/field_football.json +++ b/data/json/mapgen/field_football.json @@ -2,6 +2,8 @@ { "id": "football_items", "type": "item_group", + "ammo": 75, + "magazine": 100, "items": [ [ "whistle", 10 ], [ "sports_drink", 60 ], diff --git a/data/json/mapgen/gunsmith.json b/data/json/mapgen/gunsmith.json index 3e2a17aa75e54..ad2a5eacca93a 100644 --- a/data/json/mapgen/gunsmith.json +++ b/data/json/mapgen/gunsmith.json @@ -2,9 +2,10 @@ { "type": "mapgen", "method": "json", - "om_terrain": [ "s_gun" ], + "om_terrain": [ "s_gun_4" ], "weight": 300, "object": { + "fill_ter": "t_floor", "rows": [ "__________________sss___", "_,___,___,___,___,sss_%_", @@ -20,13 +21,13 @@ "s8r..rrrrrr...xb.rrrrr|_", "s8r...........#......r|_", "s|r..rrrrrr...#rr....r|_", - "s|---------D--------+-|_", - "s|#######|...|tccEc..^|_", - "s|#.c..c#|...|t.xEc...w_", + "s|----------D-------+-|_", + "s|#######|<|.|tccEc..^|_", + "s|#.c..c#|D|.|t.xEc...w_", "sL...c...L...D........w_", "_|l.###.l|..^|##FCC...|_", "_|l.rrr.l|-L-------D-D|_", - "_|l.rrr.l|ssss____WS|SW_", + "_|l.rrr.l|ssss___4WS|SW_", "_|l.....l|s__,_dd_|T|T|_", "_--WW-WW--s__,_dd_-----_", "__________s__,_dd_______" @@ -40,30 +41,21 @@ "%": "t_shrub", "+": "t_door_metal_pickable", ",": "t_pavement_y", - "-": "t_wall", + "-": "t_wall_w", ".": "t_floor", "5": "t_window_bars_alarm", "8": "t_window_bars_alarm", - "C": "t_floor", "D": "t_door_c", - "E": "t_floor", - "F": "t_floor", "L": "t_door_metal_pickable", - "S": "t_floor", - "T": "t_floor", "W": "t_window_bars_alarm", - "^": "t_floor", "_": "t_pavement", - "b": "t_floor", - "c": "t_floor", "d": "t_pavement", - "l": "t_floor", - "r": "t_floor", "s": "t_sidewalk", - "t": "t_floor", "w": "t_window_bars_alarm", "x": "t_console_broken", - "|": "t_wall" + "|": "t_wall_w", + "<": "t_stairs_up", + "4": "t_gutter_downspout" }, "furniture": { "#": "f_counter", @@ -112,5 +104,89 @@ { "item": "laptop", "x": 17, "y": 15, "chance": 30 } ] } + }, + { + "type": "mapgen", + "method": "json", + "om_terrain": "s_gun_2ndfloor_4", + "object": { + "fill_ter": "t_flat_roof", + "rows": [ + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " |222222222222222222223 ", + " |....................3 ", + " |....................3 ", + " |.....%%%%%%%%%%%%...3 ", + " |.....%;;rrrrrr;;%...3 ", + " |.....%;;;;;;;;;;%...3 ", + " |.....%;;;;;;C;C;%...3 ", + " |.VVVV%%+%%;;;CC;%...3 ", + " |.VAA.+;;>%;;C;;;%4..3 ", + " |.V...%;;;%;;;;W;%...3 ", + " |.V^VV%%%%%%%%%%%%...3 ", + " |....................3 ", + " |.......3--------5...3 ", + " |.X.....3 |.=.3 ", + " |.....:.3 |...3 ", + " |-------3 |---3 ", + " " + ], + "palettes": [ "roof_palette" ], + "terrain": { + ";": "t_floor", + "r": "t_floor", + "C": "t_floor", + "W": "t_floor", + "%": "t_wall_w", + "V": "t_chainfence", + "^": "t_chaingate_l", + ">": "t_stairs_down", + "+": "t_door_locked" + }, + "furniture": { "W": "f_water_heater" }, + "liquids": { "W": { "liquid": "water_clean", "amount": [ 0, 100 ] } }, + "items": { "C": { "item": "ammo_common", "chance": 30 }, "r": { "item": "tools_blacksmith", "chance": 30 } } + } + }, + { + "type": "mapgen", + "method": "json", + "om_terrain": "s_gun_roof_4", + "object": { + "fill_ter": "t_flat_roof", + "rows": [ + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " |22222222223 ", + " |..........3 ", + " |..........3 ", + " |.......&..3 ", + " |..........3 ", + " |..........5 ", + " |..........3 ", + " |----------3 ", + " ", + " ", + " ", + " ", + " ", + " " + ], + "palettes": [ "roof_palette" ] + } } ] diff --git a/data/json/mapgen/headshop.json b/data/json/mapgen/headshop.json index a8e86a4f213c7..1681b93c8d340 100644 --- a/data/json/mapgen/headshop.json +++ b/data/json/mapgen/headshop.json @@ -1,108 +1,221 @@ -{ - "method": "json", - "object": { - "place_item": [ - { "item": "rolling_paper", "repeat": 1, "x": 13, "y": 3 }, - { "item": "rolling_paper", "repeat": 1, "x": 3, "y": 6 }, - { "item": "pipe_tobacco", "repeat": 1, "x": 18, "y": 6 }, - { "item": "pipe_glass", "repeat": 1, "x": 21, "y": 7 }, - { "item": "crackpipe", "repeat": 1, "x": 18, "y": 8 }, - { "item": "pipe_glass", "repeat": 1, "x": 21, "y": 8 }, - { "item": "crackpipe", "repeat": 1, "x": 4, "y": 10 }, - { "item": "pipe_glass", "repeat": 1, "x": 4, "y": 10 }, - { "item": "pipe_glass", "repeat": 1, "x": 7, "y": 10 }, - { "item": "pipe_glass", "repeat": 1, "x": 18, "y": 10 }, - { "item": "crackpipe", "repeat": 1, "x": 21, "y": 10 } - ], - "furniture": { - "#": "f_displaycase", - "&": "f_trashcan", - "+": "f_null", - "-": "f_null", - ".": "f_null", - "4": "f_null", - "D": "f_dumpster", - "H": "f_armchair", - "S": "f_sofa", - "^": "f_indoor_plant", - "_": "f_null", - "a": "f_null", - "b": "f_bench", - "c": "f_counter", - "d": "f_null", - "l": "f_locker", - "p": "f_null", - "s": "f_null", - "t": "f_table", - "{": "f_rack", - "|": "f_null" - }, - "place_items": [ - { "chance": 35, "item": "clothing_outdoor_torso", "x": [ 13, 14 ], "y": 20 }, - { "chance": 45, "item": "stoner", "x": 14, "y": 17 }, - { "chance": 45, "item": "stoner", "x": 13, "y": [ 16, 17 ] }, - { "chance": 45, "item": "stoner", "x": [ 3, 5 ], "y": 13 }, - { "chance": 45, "item": "stoner", "x": 14, "y": 11 }, - { "chance": 45, "item": "stoner", "x": 8, "y": 10 }, - { "chance": 45, "item": "stoner", "x": [ 4, 5 ], "y": 10 }, - { "chance": 45, "item": "stoner", "x": 14, "y": [ 8, 9 ] }, - { "chance": 65, "item": "misc_smoking", "x": 15, "y": 17 }, - { "chance": 65, "item": "misc_smoking", "x": 13, "y": 15 }, - { "chance": 65, "item": "misc_smoking", "x": 9, "y": 10 }, - { "chance": 65, "item": "misc_smoking", "x": 3, "y": 10 }, - { "chance": 65, "item": "misc_smoking", "x": 14, "y": [ 6, 7 ] } - ], - "rows": [ - "__d_____sssdd___d___d___", - "________sss_____________", - "__|----|sss|----|4|-|4_d", - "d_-S..H-sss-HttH|-|^|-|_", - "__-S..^|++||..........|_", - "__-S......bb..........|d", - "__|t.H........#...{..{|_", - "__|...........#...{..{|_", - "d_|...........#...{..{|_", - "d_|...........#...{..{|_", - "__|##ccc##....c...{..{|d", - "__|&.....c....c...{..{|_", - "d_|...................|_", - "__|{{{{{..............|d", - "d_|||||||||||-+--|....|d", - "____d___DDps|{...-....|d", - "___d____ppps|{...+....|_", - "________ppps|{{##-....|d", - "d___d___ppps||||||....|_", - "________pppsa.........|_", - "__d_____ppps|ll..|....|_", - "d_____d_ppps|||||||||||_", - "______________d_________", - "___d______dddd_____d__d_" - ], - "terrain": { - "#": "t_floor", - "&": "t_floor", - "+": "t_door_glass_c", - "-": "t_wall_glass", - ".": "t_floor", - "4": "t_tree_pine", - "D": "t_pavement", - "H": "t_floor", - "S": "t_floor", - "^": "t_floor", - "_": "t_grass", - "a": "t_door_c", - "b": "t_floor", - "c": "t_floor", - "d": "t_dirt", - "l": "t_floor", - "p": "t_pavement", - "s": "t_sidewalk", - "t": "t_floor", - "{": "t_floor", - "|": "t_wall" +[ + { + "method": "json", + "om_terrain": "headshop", + "type": "mapgen", + "weight": 100, + "object": { + "fill_ter": "t_floor", + "rows": [ + "__d_____sssdd___d___d___", + "________sss_____________", + "__|----|sss|----|4|-|4_d", + "d_-S..H-sss-HttH|-|^|-|_", + "__-S..^|++||..........|_", + "__-S......bb..........|d", + "__|t.H........#...{..{|_", + "__|...........#...{..{|_", + "d_|...........#...{..{|_", + "d_|...........#...{..{|_", + "__|##ccc##....c...{..{|d", + "__|&.u...c....c...{..{|_", + "d_|...................|_", + "__|{{{{{.............H|d", + "d_|||||||||||-+--|...t|d", + "__U_d___DD5s|{..u-...H|d", + "___d____ppps|{...+...^|_", + "________ppps|{{##-..|||d", + "d___d___ppps|||||||%|L|_", + "________pppsa....%..a.|_", + "__d_____ppps|ll|<|ll|R|_", + "d_____d_ppps|||||||||||_", + "______________d_________", + "___d______dddd_____d__d_" + ], + "terrain": { + "+": "t_door_glass_c", + "-": "t_wall_glass", + ".": "t_floor", + "4": "t_tree_pine", + "D": "t_pavement", + "_": "t_grass", + "a": "t_door_c", + "d": "t_dirt", + "p": "t_pavement", + "s": "t_sidewalk", + "|": "t_wall_p", + "<": "t_stairs_up", + "5": "t_gutter_downspout", + "U": "t_grass" + }, + "furniture": { + "#": "f_displaycase", + "&": "f_trashcan", + "D": [ "f_dumpster", "f_recycle_bin" ], + "H": "f_armchair", + "S": "f_sofa", + "^": [ "f_indoor_plant_y", "f_indoor_plant" ], + "b": "f_bench", + "c": "f_counter", + "l": "f_locker", + "t": "f_table", + "{": "f_rack", + "R": "f_sink", + "%": "f_beaded_door", + "u": "f_stool" + }, + "nested": { + "U": { + "chunks": [ + [ "roof_6x6_greenhouse_1", 25 ], + [ "roof_6x6_garden_4", 25 ], + [ "roof_6x6_garden_1", 25 ], + [ "roof_6x6_garden_2", 25 ] + ] + } + }, + "toilets": { "L": { } }, + "place_nested": [ { "chunks": [ [ "null", 2 ], [ "headshop_graffiti_snippet", 98 ] ], "x": 22, "y": 19 } ], + "place_item": [ + { "item": "rolling_paper", "repeat": 1, "x": 13, "y": 3 }, + { "item": "rolling_paper", "repeat": 1, "x": 3, "y": 6 }, + { "item": "pipe_tobacco", "repeat": 1, "x": 18, "y": 6 }, + { "item": "pipe_glass", "repeat": 1, "x": 21, "y": 7 }, + { "item": "crackpipe", "repeat": 1, "x": 18, "y": 8 }, + { "item": "pipe_glass", "repeat": 1, "x": 21, "y": 8 }, + { "item": "crackpipe", "repeat": 1, "x": 4, "y": 10 }, + { "item": "pipe_glass", "repeat": 1, "x": 4, "y": 10 }, + { "item": "pipe_glass", "repeat": 1, "x": 7, "y": 10 }, + { "item": "pipe_glass", "repeat": 1, "x": 18, "y": 10 }, + { "item": "crackpipe", "repeat": 1, "x": 21, "y": 10 } + ], + "place_items": [ + { "chance": 35, "item": "clothing_outdoor_torso", "x": [ 13, 14 ], "y": 20 }, + { "chance": 45, "item": "stoner", "x": 14, "y": 17 }, + { "chance": 45, "item": "jar_weed", "x": 13, "y": [ 16, 17 ] }, + { "chance": 45, "item": "jar_weed", "x": [ 3, 5 ], "y": 13, "repeat": [ 2, 4 ] }, + { "chance": 45, "item": "stoner", "x": 14, "y": 11 }, + { "chance": 45, "item": "stoner", "x": 8, "y": 10 }, + { "chance": 45, "item": "stoner", "x": [ 4, 5 ], "y": 10 }, + { "chance": 45, "item": "stoner", "x": 14, "y": [ 8, 9 ] }, + { "chance": 65, "item": "misc_smoking", "x": 15, "y": 17 }, + { "chance": 65, "item": "misc_smoking", "x": 13, "y": 15 }, + { "chance": 65, "item": "misc_smoking", "x": 9, "y": 10 }, + { "chance": 65, "item": "misc_smoking", "x": 3, "y": 10 }, + { "chance": 65, "item": "misc_smoking", "x": 14, "y": [ 6, 7 ] } + ] } }, - "om_terrain": "headshop", - "type": "mapgen", - "weight": 100 -} + { + "type": "mapgen", + "method": "json", + "om_terrain": "headshop_roof", + "object": { + "fill_ter": "t_floor", + "rows": [ + " ", + " ", + " |22222222222222222223 ", + " |...................3 ", + " |...................3 ", + " |...................3 ", + " |...................3 ", + " |...................3 ", + " |...................3 ", + " |...................3 ", + " |...................3 ", + " |...................3 ", + " |...................3 ", + " |...................3 ", + " |-------5-|........43 ", + " %%%+%0%%%%% ", + " %r*****%II% ", + " %r**C%%%*h% ", + " %r*C*%y***0 ", + " %r***+****% ", + " %r**>%ffyB% ", + " %%0%%%%%0%% ", + " ", + " " + ], + "palettes": [ "roof_palette" ], + "terrain": { "*": "t_floor", "%": "t_wall_p", "+": "t_door_locked", ">": "t_stairs_down", "0": "t_window_domestic" }, + "furniture": { + "B": "f_bookcase", + "f": "f_filing_cabinet", + "I": "f_desk", + "h": "f_chair", + "y": [ "f_indoor_plant_y", "f_indoor_plant" ] + }, + "items": { + "I": { "item": "office", "chance": 30 }, + "f": { "item": "office_paper", "chance": 30 }, + "y": { "item": "trash", "chance": 20, "repeat": [ 2, 4 ] }, + "C": { "item": "stoner", "chance": 20, "repeat": [ 2, 4 ] }, + "r": { "item": "jar_weed", "chance": 20, "repeat": [ 2, 4 ] } + }, + "place_nested": [ + { + "chunks": [ + [ "null", 20 ], + [ "roof_2x2_utilities_b", 15 ], + [ "roof_2x2_utilities_c", 5 ], + [ "roof_2x2_utilities_d", 40 ], + [ "roof_2x2_utilities", 50 ], + [ "roof_2x2_golf", 20 ], + [ "roof_3x3_wine", 30 ] + ], + "x": [ 13, 18 ], + "y": [ 9, 11 ] + }, + { + "chunks": [ [ "roof_4x4_party", 5 ], [ "roof_4x4_utility", 10 ], [ "roof_4x4_utility_1", 10 ], [ "roof_6x6_greenhouse_3", 80 ] ], + "x": [ 4, 5 ], + "y": 8 + }, + { "chunks": [ [ "roof_16x16_help", 20 ], [ "null", 80 ] ], "x": 4, "y": 3 } + ] + } + }, + { + "type": "mapgen", + "method": "json", + "om_terrain": "headshop_upper_roof", + "object": { + "fill_ter": "t_flat_roof", + "rows": [ + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " |--------53 ", + " |.........3 ", + " |......:..3 ", + " |.........3 ", + " |..&......3 ", + " |.......=.3 ", + " |.........3 ", + " ", + " " + ], + "palettes": [ "roof_palette" ] + } + }, + { + "type": "mapgen", + "method": "json", + "nested_mapgen_id": "headshop_graffiti_snippet", + "object": { "mapgensize": [ 1, 1 ], "place_graffiti": [ { "snippet": "headshop_graffiti", "x": 0, "y": 0 } ] } + } +] diff --git a/data/json/mapgen/homeimprovement.json b/data/json/mapgen/homeimprovement.json index ce994dbe79e51..da500a37234cf 100644 --- a/data/json/mapgen/homeimprovement.json +++ b/data/json/mapgen/homeimprovement.json @@ -5,49 +5,69 @@ "om_terrain": [ "home_improvement" ], "weight": 10000, "object": { + "fill_ter": "t_floor", "rows": [ ",,,,,,,,,,,,,,,,,,,,,,,,", ",,,,,,,,,,,,,,,,,,,,,,,,", ",----------++---------|,", - ",|.@.@.@.@.rr?????????|,", - ",O.........rr.........O,", - ",|.@.@.@.@.rr?????????|,", + ",|.@.@.@.@.rr.#....???|,", + ",O.........rr.#.A....?O,", + ",|.@.@.@.@.rr.#%###..?|,", ",|rrrrrrrrrrrrrrrrrrrr|,", ",|rrrrrrrrrrrrrrrrrrrr|,", ",|:::::::::rryyyyyyyyy|,", ",|.........rr.........|,", - ",|:::::::::rr^^^^^^^^^|,", + ",|111111111rrLLLLLLLLL|,", ",|rrrrrrrrrrrrrrrrrrrr|,", ",|rrrrrrrrrrrrrrrrrrrr|,", - ",O.........rr.........O,", - ",O.........rr.........O,", + ",OSSSSSSSSSrr333333333O,", + ",O222222222rr333333333O,", ",|rrrrrrrrrrrrrrrrrrrr|,", - ",|rrrrrrrrrrrrrrrrrrrr|,", - ",|#########rr#########|,", - ",O.........rr.........O,", - ",|#########rr#########|,", - ",O.........rr.........O,", - ",|#########rr#########|,", + ",||+|||rrrrrrrrrrrrrrr|,", + ",|y.ll|####rr#########|,", + ",OI...|#...rr.........O,", + ",|Ih.S|####rr#########|,", + ",O--+-|#...rr.........O,", + ",|6..&|####rr#########|,", ",---------------------|,", - ",,,,,,,,,,,,,,,,,,,,,,,," + ",,,,,,,,,U## " + ], + "palettes": [ "roof_palette" ], + "terrain": { ">": "t_ladder_down" }, + "place_nested": [ + { + "chunks": [ + [ "null", 20 ], + [ "roof_2x2_utilities_b", 15 ], + [ "roof_2x2_utilities_c", 5 ], + [ "roof_2x2_utilities_d", 40 ], + [ "roof_2x2_utilities", 50 ], + [ "roof_2x2_golf", 20 ], + [ "roof_3x3_wine", 30 ] + ], + "x": [ 3, 17 ], + "y": [ 4, 7 ] + }, + { + "chunks": [ + [ "null", 20 ], + [ "roof_4x4_party", 15 ], + [ "roof_4x4_utility", 40 ], + [ "roof_4x4_utility_1", 30 ], + [ "roof_6x6_utility", 20 ] + ], + "x": [ 3, 15 ], + "y": [ 10, 14 ] + } + ] + } } ] diff --git a/data/json/mapgen/irradiator_1.json b/data/json/mapgen/irradiator_1.json index dfc9a8a891edf..f006889b5781c 100644 --- a/data/json/mapgen/irradiator_1.json +++ b/data/json/mapgen/irradiator_1.json @@ -326,7 +326,7 @@ { "group": "prison_armor", "x": 39, "y": 26, "prob": 50, "repeat": [ 1, 2 ] } ], "liquids": { "T": { "liquid": "water_clean", "amount": [ 200, 600 ] } }, - "fields": { "U": { "field": "fd_nuke_gas", "density": 3, "age": 990, "chance": 100 }, "/": { "field": "fd_shock_vent" } }, + "fields": { "U": { "field": "fd_nuke_gas", "intensity": 3, "age": 990, "chance": 100 }, "/": { "field": "fd_shock_vent" } }, "monster": { "(": { "monster": "mon_turret" }, "!": { "monster": "mon_hazmatbot", "chance": 5 } }, "monsters": { "h": { "monster": "GROUP_ZOMBIE", "chance": 50 }, diff --git a/data/json/mapgen/jewel_store.json b/data/json/mapgen/jewel_store.json index 2faa988124305..84fcad93be0ac 100644 --- a/data/json/mapgen/jewel_store.json +++ b/data/json/mapgen/jewel_store.json @@ -5,6 +5,7 @@ "om_terrain": [ "s_jewelry" ], "weight": 500, "object": { + "fill_ter": "t_floor", "rows": [ "....________________....", "....,____,____,____,....", @@ -15,45 +16,62 @@ "....FFFFFFFFFFFFFFFF....", "....|-hhhhh++hhhhh-|....", "....| |....", - "....|hh hh|....", - "....|#v hhhh v#|....", - "....|#v v##v v#|....", - "....|#v v##v v#|....", - "85^5|#v hhhh v#|....", - "8___|hh hh|....", - "8___| r|....", - "8___| r|....", - "8__f|##### r|....", - "8__f| rrrr|....", - "8___|-&------------|....", - "8___& ###### T|....", - "8555| c T|....", - "....|GG |....", - "....|--------------|...." + "....|hh ;;;;;;;; hh|....", + "....|%v ;;hhhh;; v%|....", + "....|%v ;;v##v;; v%|....", + "....|%v ;;v##v;; v%|....", + "85^5|%v ;;hhhh;; v%|....", + "8___|hh ;;;;;;;; hh|....", + "8___| ;;CttC;; r|....", + "8__4| ;;;;;;;; r|||||", + "8__U|%%%?% r|sf9|", + "8__U| c x rrrr| |", + "8___|--&-----------||&||", + "8___& %%%%%% T|a |", + "8555| c a T| L|", + "....|GGf SS & L|", + "....|--------------|||||" ], "terrain": { " ": "t_floor", - "#": "t_floor", + "#": "t_carpet_yellow", + ";": "t_carpet_yellow", + "C": "t_carpet_yellow", + "t": "t_carpet_yellow", "&": "t_door_locked", "+": "t_door_glass_c", ",": "t_pavement_y", - "-": "t_wall", - ".": "t_grass", + "-": "t_wall_b", + ".": [ [ "t_grass", 5 ], [ "t_grass_long", 2 ], "t_dirt", "t_shrub" ], "5": "t_chainfence_h", "8": "t_chainfence_v", "F": "t_sidewalk", - "G": "t_floor", - "T": "t_floor", "^": "t_chaingate_l", "_": "t_pavement", - "c": "t_floor", - "f": "t_pavement", - "h": "t_wall_glass", - "r": "t_floor", - "v": "t_wall_glass", - "|": "t_wall" + "h": "t_wall_glass_alarm", + "v": "t_wall_glass_alarm", + "?": "t_console_broken", + "4": "t_gutter_downspout", + "|": "t_wall_b" }, - "furniture": { "#": "f_counter", "G": "f_desk", "T": "f_safe_l", "c": "f_chair", "f": "f_trashcan", "r": "f_rack" }, + "furniture": { + "#": "f_counter", + "%": "f_counter", + "G": "f_desk", + "T": "f_safe_l", + "c": "f_chair", + "f": "f_trashcan", + "U": [ "f_dumpster", "f_recycle_bin" ], + "r": "f_displaycase", + "a": "f_stool", + "S": "f_filing_cabinet", + "s": "f_sink", + "L": "f_locker", + "C": "f_armchair", + "t": "f_table", + "x": "f_counter_gate_c" + }, + "toilets": { "9": { } }, "place_items": [ { "item": "jewelry_front", "x": [ 5, 5 ], "y": [ 10, 13 ], "chance": 75 }, { "item": "jewelry_front", "x": [ 18, 18 ], "y": [ 10, 13 ], "chance": 75 }, @@ -64,7 +82,56 @@ { "item": "jewelry_safe", "x": [ 18, 18 ], "y": [ 20, 21 ], "chance": 95 }, { "item": "trash", "x": [ 3, 3 ], "y": [ 17, 18 ], "chance": 50 } ], + "items": { + "G": { "item": "office", "chance": 30 }, + "S": { "item": "office_paper", "chance": 30 }, + "L": { "item": "jackets", "chance": 20 }, + "9": { "item": "softdrugs", "chance": 20 } + }, "place_vehicles": [ { "vehicle": "security_van", "x": 11, "y": 2, "chance": 20, "fuel": 20, "status": 0, "rotation": 0 } ] } + }, + { + "type": "mapgen", + "method": "json", + "om_terrain": "s_jewelry_roof", + "object": { + "fill_ter": "t_flat_roof", + "rows": [ + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " |222222222222223 ", + " |..............3 ", + " |..............3 ", + " |...Z..........3 ", + " |..............3 ", + " |..............3 ", + " |..............3 ", + " |..............3 ", + " |..............3 ", + " 5..............32223", + " |..................3", + " |..................3", + " |.............U....3", + " |..R...............3", + " |..................3", + " |..................3", + " |------------------3" + ], + "palettes": [ "roof_palette" ], + "terrain": { ".": "t_flat_roof" }, + "furniture": { "&": "f_roof_turbine_vent" }, + "place_items": [ { "item": "roof_trash", "x": [ 5, 17 ], "y": [ 9, 23 ], "chance": 50, "repeat": [ 1, 3 ] } ], + "nested": { + "U": { "chunks": [ "roof_2x2_infrastructure" ] }, + "R": { "chunks": [ "roof_2x2_infrastructure_1" ] }, + "Z": { "chunks": [ "roof_2x2_infrastructure_2" ] } + } + } } ] diff --git a/data/json/mapgen/lan_center.json b/data/json/mapgen/lan_center.json index a7230111536ed..e5fd19f5c1abb 100644 --- a/data/json/mapgen/lan_center.json +++ b/data/json/mapgen/lan_center.json @@ -1,46 +1,20 @@ [ { "method": "json", + "om_terrain": "lancenter", + "type": "mapgen", + "weight": 100, "object": { - "furniture": { - "#": "f_table", - "&": "f_trashcan", - "+": "f_null", - ".": "f_null", - "6": "f_null", - "C": "f_counter", - "H": "f_armchair", - "_": "f_null", - "a": "f_null", - "c": "f_chair", - "d": "f_null", - "s": "f_null", - "v": "f_vending_c", - "w": "f_null", - "Y": "f_rack_coat", - "{": "f_fridge", - "|": "f_null" - }, - "items": { "Y": { "item": "coat_rack", "chance": 40, "repeat": 2 } }, - "place_items": [ - { "chance": 75, "item": "vending_drink_items", "x": 12, "y": 9 }, - { "chance": 75, "item": "fridge", "x": 10, "y": 9 }, - { "chance": 75, "item": "fridge", "x": 11, "y": 9 }, - { "chance": 15, "repeat": [ 1, 2 ], "item": "trash", "x": 4, "y": 9 }, - { "chance": 25, "item": "fridge", "x": 2, "y": 9 }, - { "chance": 75, "item": "vending_food_items", "x": 13, "y": 9 } - ], + "fill_ter": "t_floor", "rows": [ "ssssssssssssssssssssssss", "ssssssssssssssssssssssss", - "ssssssssssssssssssssssss", - "ssssssssssssssssssssssss", - "_______s______d_________", - "d_d____s_______________d", - "______ds___d_______d____", - "_______s______d_________", + "______dsd_____d_________", + "d9d___dsd__9___9___9___d", + "___9__dsd__d_9___9_d_9__", + "______dsd_____d_________", "_||w|||+|w||||w||||w|||_", - "_|{.&C....{{vv.......Y|_", + "_|{.&C...y{{vW.......Y|_", "_|..H6..........##...#|_", "_|.CCC.........c66c.c6|_", "_|.........##...##...#|_", @@ -52,70 +26,139 @@ "_|#...##...##...##...#|_", "_|6c.c66c.c66c.c66c.c6|d", "d|#...##...##...##...#|_", - "_|Y..................Y|_", - "_||||||||||||||||||||||_", - "_______________d________" + "_|Y......y....y......Y|_", + "_||=|||=|||=|w||=||w|||_", + "__sss4|..|..|@....S..I|_", + "__sUss|RT|RT|@@@y...cI|_", + "__ssUU|||||||||||||||||_" ], "terrain": { - "#": "t_floor", - "&": "t_floor", "+": "t_reinforced_door_glass_c", ".": "t_floor", "6": "t_console", - "C": "t_floor", - "Y": "t_floor", - "H": "t_floor", - "_": "t_grass", + "_": [ [ "t_grass", 5 ], [ "t_grass_long", 2 ], "t_dirt", "t_shrub" ], "a": "t_console_broken", - "c": "t_floor", - "d": "t_dirt", + "d": "t_grass_long", "s": "t_sidewalk", - "v": "t_floor", "w": "t_window", - "{": "t_floor", - "|": "t_wall" - } - }, - "om_terrain": "lancenter", - "type": "mapgen", - "weight": 100 - }, - { - "method": "json", - "object": { + "|": "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" + ] + }, "furniture": { "#": "f_table", "&": "f_trashcan", - "+": "f_null", - "-": "f_null", - ".": "f_null", - "6": "f_null", "C": "f_counter", - "D": "f_null", "H": "f_armchair", - "P": "f_sign", - "S": "f_sink", - "_": "f_null", "c": "f_chair", - "d": "f_null", - "f": "f_fridge", - "p": "f_null", - "s": "f_null", - "Y": "f_rack_coat", - "t": "f_toilet", "v": "f_vending_c", - "{": "f_glass_fridge", - "|": "f_null" + "W": "f_vending_c", + "Y": "f_rack_coat", + "{": "f_fridge", + "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" ], + "y": [ "f_indoor_plant_y", "f_indoor_plant" ], + "R": "f_sink", + "@": "f_sofa" }, - "items": { "Y": { "item": "coat_rack", "chance": 40, "repeat": 2 } }, - "place_items": [ - { "chance": 45, "item": "fridge", "x": 20, "y": 20 }, - { "chance": 50, "item": "vending_food_items", "x": 14, "y": 20 }, - { "chance": 15, "repeat": [ 1, 3 ], "item": "trash", "x": 19, "y": 15 }, - { "chance": 50, "item": "vending_drink_items", "x": 15, "y": 20 }, - { "chance": 50, "item": "vending_drink_items", "x": 16, "y": 20 } + "toilets": { "T": { } }, + "items": { + "Y": { "item": "coat_rack", "chance": 40, "repeat": 2 }, + "I": { "item": "office", "chance": 30 }, + "S": { "item": "office_paper", "chance": 30 }, + "R": { "item": "softdrugs", "chance": 30 }, + "U": { "item": "trash", "chance": 20, "repeat": [ 2, 4 ] }, + "{": { "item": "fridge", "chance": 20, "repeat": [ 2, 4 ] }, + "v": { "item": "vending_drink_items", "chance": 20, "repeat": [ 2, 4 ] }, + "W": { "item": "vending_food_items", "chance": 20, "repeat": [ 2, 4 ] } + } + } + }, + { + "type": "mapgen", + "method": "json", + "om_terrain": "lancenter_roof", + "object": { + "fill_ter": "t_flat_roof", + "rows": [ + " ", + " ", + " ", + " ", + " ", + " ", + " |--------------------3 ", + " |....................3 ", + " |....................3 ", + " |....................3 ", + " |....................3 ", + " |....................3 ", + " |....................3 ", + " |....................3 ", + " |....................3 ", + " |....................3 ", + " |....................3 ", + " |....................3 ", + " |.R..................3 ", + " |....................3 ", + " |----5...............3 ", + " |..Z........U...3 ", + " |...............3 ", + " |---------------3 " ], - "place_toilets": [ { "x": 3, "y": 20 } ], + "palettes": [ "roof_palette" ], + "place_items": [ { "item": "roof_trash", "x": [ 0, 23 ], "y": [ 0, 23 ], "chance": 50, "repeat": [ 1, 3 ] } ], + "nested": { + "U": { "chunks": [ "roof_2x2_infrastructure" ] }, + "R": { "chunks": [ "roof_2x2_infrastructure_1" ] }, + "Z": { "chunks": [ "roof_2x2_infrastructure_2" ] } + }, + "place_nested": [ + { "chunks": [ [ "null", 20 ], [ "roof_2x2_utilities_d", 40 ], [ "roof_2x2_utilities", 50 ] ], "x": [ 7, 17 ], "y": 17 }, + { + "chunks": [ [ "null", 20 ], [ "roof_4x4_utility", 40 ], [ "roof_6x6_utility", 20 ] ], + "x": [ 3, 15 ], + "y": [ 8, 10 ] + } + ] + } + }, + { + "method": "json", + "om_terrain": "lancenter_1", + "type": "mapgen", + "weight": 100, + "object": { + "fill_ter": "t_floor", "rows": [ "ssssssssssssssssssssssss", "ssssssssssssssssssssssss", @@ -137,38 +180,88 @@ "__|Y.....c.c......C..|__", "__|||||...........C..|__", "__|...D..c.c......C..|__", - "__|tCS|.#6#6#.v{{...f|__", + "__|tCS|.#6#6#.v{{...f|4_", "_d||||||||||||||||||||__", "______________d_________", "______d_d_____________d_" ], "terrain": { - "#": "t_floor", - "&": "t_floor", "+": "t_reinforced_door_glass_c", "-": "t_wall_glass", ".": "t_floor", "6": "t_console", - "C": "t_floor", "D": "t_door_c", - "H": "t_floor", - "Y": "t_floor", "P": "t_wall_glass", - "S": "t_floor", - "_": "t_grass", - "c": "t_floor", + "_": [ [ "t_grass", 5 ], [ "t_grass_long", 2 ], "t_dirt", "t_shrub" ], "d": "t_dirt", - "f": "t_floor", "p": "t_pavement", "s": "t_sidewalk", - "t": "t_floor", - "v": "t_floor", - "{": "t_floor", - "|": "t_brick_wall" - } - }, - "om_terrain": "lancenter", + "|": "t_brick_wall", + "4": "t_gutter_downspout" + }, + "furniture": { + "#": "f_table", + "&": "f_trashcan", + "C": "f_counter", + "H": "f_armchair", + "P": "f_sign", + "S": "f_sink", + "c": "f_chair", + "f": "f_fridge", + "Y": "f_rack_coat", + "t": "f_toilet", + "v": "f_vending_c", + "{": "f_glass_fridge" + }, + "items": { "Y": { "item": "coat_rack", "chance": 40, "repeat": 2 } }, + "place_items": [ + { "chance": 45, "item": "fridge", "x": 20, "y": 20 }, + { "chance": 50, "item": "vending_food_items", "x": 14, "y": 20 }, + { "chance": 15, "repeat": [ 1, 3 ], "item": "trash", "x": 19, "y": 15 }, + { "chance": 50, "item": "vending_drink_items", "x": 15, "y": 20 }, + { "chance": 50, "item": "vending_drink_items", "x": 16, "y": 20 } + ], + "place_toilets": [ { "x": 3, "y": 20 } ] + } + }, + { "type": "mapgen", - "weight": 100 + "method": "json", + "om_terrain": "lancenter_roof_1", + "object": { + "fill_ter": "t_flat_roof", + "rows": [ + " ", + " ", + " |222222222223 ", + " |...........3 ", + " |...........3 ", + " |........R..3 ", + " |...........3 ", + " |...........3 ", + " |...........3 ", + " |...........3 ", + " |...........3 ", + " |...........3 ", + " |...........3 ", + " |...........3 ", + " |...........3------3 ", + " |....ZA............3 ", + " |.....A............3 ", + " |.............U....3 ", + " |..................3 ", + " |..................3 ", + " |..................5 ", + " |------------------3 ", + " ", + " " + ], + "palettes": [ "roof_palette" ], + "nested": { + "U": { "chunks": [ "roof_2x2_infrastructure" ] }, + "R": { "chunks": [ "roof_2x2_infrastructure_1" ] }, + "Z": { "chunks": [ "roof_2x2_infrastructure_2" ] } + } + } } ] diff --git a/data/json/mapgen/landscaping_supply.json b/data/json/mapgen/landscaping_supply.json index 7be5f0db88925..03cde62125d04 100644 --- a/data/json/mapgen/landscaping_supply.json +++ b/data/json/mapgen/landscaping_supply.json @@ -145,7 +145,8 @@ "s": "f_sign", "w": "f_null", "{": "f_rack", - "|": "f_null" + "|": "f_null", + "S": "f_sink" }, "place_items": [ { "chance": 25, "repeat": 2, "item": "clothing_work_gloves", "x": [ 14, 15 ], "y": [ 15, 16 ] }, @@ -172,9 +173,9 @@ "......._-&f#ffffffff-_|_", "......._-fl#ff{{f{{f-_|_", "o_....._-ff#ff{{f{{f-_|_", - "o_....._-ff#ffffffff-_|_", - "cs_...._-fffff{{{{{f-_|_", - "n_....._-fffffffffff-_|_", + "o_....._-fffffffffff-_|_", + "cs_...._--+--f{{{{{f-_|_", + "n_.....4-TfS-fffffff-_|_", "n_....._-------------_|_", "______________________|_", "|||||||||||||||||||||||_", @@ -184,6 +185,8 @@ "#": "t_floor", "&": "t_floor", "l": "t_floor", + "S": "t_floor", + "T": "t_floor", "+": "t_door_c", "-": "t_brick_wall", ".": "t_dirt", @@ -197,8 +200,11 @@ "s": "t_grass", "w": "t_window", "{": "t_floor", + "4": "t_gutter_downspout", "|": "t_chainfence" }, + "place_loot": [ { "item": "stepladder", "x": 9, "y": 17, "chance": 100 } ], + "toilets": { "T": { } }, "place_signs": [ { "signage": "CEMENT", "x": 4, "y": 5 }, { "signage": "FERTILIZER", "x": 8, "y": 5 }, @@ -209,5 +215,41 @@ "om_terrain": "landscapingsupplyco_1b", "type": "mapgen", "weight": 100 + }, + { + "type": "mapgen", + "method": "json", + "om_terrain": "landscapingsupplyco_1b_roof", + "object": { + "fill_ter": "t_tar_flat_roof", + "rows": [ + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " |222222222223 ", + " |...........3 ", + " |.......&...3 ", + " |...........3 ", + " |...........3 ", + " |...........3 ", + " 5.=.........3 ", + " |-----------3 ", + " ", + " ", + " " + ], + "palettes": [ "roof_palette" ], + "terrain": { ".": "t_tar_flat_roof" } + } } ] diff --git a/data/json/mapgen/laundromat.json b/data/json/mapgen/laundromat.json index b2b057c77868c..bd45dfd7d684c 100644 --- a/data/json/mapgen/laundromat.json +++ b/data/json/mapgen/laundromat.json @@ -1,20 +1,11 @@ [ - { - "id": "laundromat_bleach", - "type": "item_group", - "items": [ [ "bleach", 50 ] ] - }, - { - "id": "laundromat_containers", - "type": "item_group", - "items": [ [ "duffelbag", 5 ], [ "backpack", 5 ], [ "bag_plastic", 30 ], [ "basket_laundry", 30 ] ] - }, { "type": "mapgen", "method": "json", "om_terrain": [ "s_laundromat" ], "weight": 400, "object": { + "fill_ter": "t_linoleum_white", "rows": [ "s______________________s", "s______________________s", @@ -25,13 +16,13 @@ "s|t..#.............&|sss", "s|C.Bt.............D|sss", "s|ttt#....rrrr.....D|sss", - "s|WWWWWWWWWWWt.....D|sss", - "s|.................D|%ss", "s|WWWWWWWWWWWt.....D|%ss", - "s|.................D|sss", + "s|.................D|%ss", "s|WWWWWWWWWWWt.....D|sss", - "s|t................D|sss", - "s|c...DDD####t.....D|sss", + "s|.................D|LLs", + "s|WWWWWWWWWWWt.....D|ass", + "s|t................D|oss", + "s|c...DDD####t.....D|4ss", "s|c...-------......|--|s", "s|c...WWWWWWWt.....|lS|s", "s|6................+lT|s", @@ -42,39 +33,26 @@ "ssssssssssssssssssssssss" ], "terrain": { - "#": "t_linoleum_white", "%": "t_sidewalk", - "&": "t_linoleum_white", "+": "t_door_c", - "-": "t_wall", + "-": "t_wall_w", ".": "t_linoleum_white", - "6": "t_linoleum_white", "=": "t_wall_glass", "A": "t_atm", - "B": "t_linoleum_white", "C": "t_console_broken", - "D": "t_linoleum_white", - "S": "t_linoleum_white", - "T": "t_linoleum_white", - "V": "t_linoleum_white", - "W": "t_linoleum_white", "[": "t_door_glass_c", - "]": "t_linoleum_white", - "^": "t_linoleum_white", "_": "t_pavement", - "c": "t_linoleum_white", "l": "t_linoleum_gray", - "r": "t_linoleum_white", "s": "t_sidewalk", - "t": "t_linoleum_white", - "w": "t_linoleum_white", - "y": "t_linoleum_white", - "|": "t_wall", - "~": "t_linoleum_white" + "L": "t_sidewalk", + "a": "t_sidewalk", + "o": "t_sidewalk", + "|": "t_wall_w", + "4": "t_gutter_downspout" }, "furniture": { "#": "f_counter", - "%": "f_trashcan", + "%": [ "f_dumpster", "f_recycle_bin" ], "&": "f_trashcan", "6": "f_arcade_machine", "B": "f_stool", @@ -86,7 +64,10 @@ "^": "f_indoor_plant", "c": "f_chair", "r": "f_rack", - "t": "f_table" + "t": "f_table", + "o": "f_water_heater", + "a": "f_water_purifier", + "L": "f_standing_tank" }, "toilets": { "T": { } }, "place_items": [ @@ -116,14 +97,52 @@ { "type": "mapgen", "method": "json", - "om_terrain": [ "s_laundromat" ], + "om_terrain": "s_laundromat_roof", + "object": { + "fill_ter": "t_flat_roof", + "rows": [ + " ", + " ", + " ", + " ", + " |2222222222222222223 ", + " |..................3 ", + " |..................3 ", + " |..................3 ", + " |..................3 ", + " |..................3 ", + " |..................3 ", + " |....R.............3 ", + " |..................3 ", + " |..................3 ", + " |..................3 ", + " |..................3 ", + " |..................523 ", + " |....................3 ", + " |....................3 ", + " |.................U..3 ", + " |....................3 ", + " |....................3 ", + " |....................3 ", + " " + ], + "palettes": [ "roof_palette" ], + "nested": { "U": { "chunks": [ "roof_2x2_infrastructure" ] }, "R": { "chunks": [ "roof_2x2_infrastructure_1" ] } }, + "place_items": [ { "item": "roof_trash", "x": [ 6, 20 ], "y": [ 4, 17 ], "chance": 50, "repeat": [ 1, 3 ] } ] + } + }, + { + "type": "mapgen", + "method": "json", + "om_terrain": [ "s_laundromat_1" ], "weight": 400, "object": { + "fill_ter": "t_linoleum_white", "rows": [ "________________ssssssss", "________________sssddsss", "________________ss ss", - "________________sd ds", + "________________sd H ds", "-----______-----sd ds", "________________ss ss", "________________sssddsss", @@ -143,45 +162,29 @@ "s|D.D|+|+|+|+|.|,,,,,}|s", "s|DDD|T|T|T|T|.+,p,P,}|s", "s|||||||||||||+|,p,Pp}|s", - "sssssssssssssss||||||||s" + "sss4sssssssssss||||||||s" ], "terrain": { " ": [ "t_grass", "t_grass", "t_dirt", "t_grass", "t_shrub", "t_tree_young" ], - "#": "t_linoleum_white", "P": "t_floor", "p": "t_floor", ",": "t_floor", "}": "t_floor", "%": "t_pavement", - "&": "t_linoleum_white", "+": "t_door_c", ".": "t_linoleum_white", - "6": "t_linoleum_white", "=": "t_wall_glass", "A": "t_atm", - "B": "t_linoleum_white", - "b": "t_linoleum_white", "C": "t_console_broken", - "D": "t_linoleum_white", - "S": "t_linoleum_white", - "T": "t_linoleum_white", - "V": "t_linoleum_white", - "W": "t_linoleum_white", "[": "t_door_glass_c", - "]": "t_linoleum_white", - "^": "t_linoleum_white", "_": "t_pavement", "-": "t_pavement_y", - "c": "t_linoleum_white", "l": "t_linoleum_gray", - "r": "t_linoleum_white", "d": "t_sidewalk", "s": "t_sidewalk", - "t": "t_linoleum_white", - "w": "t_linoleum_white", - "y": "t_linoleum_white", - "|": "t_wall", - "~": "t_linoleum_white" + "|": "t_wall_w", + "H": "t_grass", + "4": "t_gutter_downspout" }, "furniture": { "#": "f_counter", @@ -201,7 +204,8 @@ "^": "f_indoor_plant", "c": "f_chair", "r": "f_rack", - "t": "f_table" + "t": "f_table", + "H": "f_birdbath" }, "toilets": { "T": { } }, "items": { @@ -223,5 +227,42 @@ { "vehicle": "car", "x": [ 3, 10 ], "y": [ 2, 3 ], "chance": 20 } ] } + }, + { + "type": "mapgen", + "method": "json", + "om_terrain": "s_laundromat_roof_1", + "object": { + "fill_ter": "t_flat_roof", + "rows": [ + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " |22223 ", + " |222222222222222|....3 ", + " |....................3 ", + " |....................3 ", + " |...U................3 ", + " |....................3 ", + " |....................3 ", + " |....................3 ", + " |....................3 ", + " |.............R......3 ", + " |....................3 ", + " |....................3 ", + " |....................3 ", + " |....................3 ", + " |-5-----------|......3 ", + " |------3 " + ], + "palettes": [ "roof_palette" ], + "nested": { "U": { "chunks": [ "roof_2x2_infrastructure" ] }, "R": { "chunks": [ "roof_2x2_infrastructure_1" ] } }, + "place_items": [ { "item": "roof_trash", "x": [ 3, 19 ], "y": [ 11, 20 ], "chance": 50, "repeat": [ 1, 3 ] } ] + } } ] diff --git a/data/json/mapgen/library.json b/data/json/mapgen/library.json index 13962e60dd17f..a32e89928d68f 100644 --- a/data/json/mapgen/library.json +++ b/data/json/mapgen/library.json @@ -1,31 +1,11 @@ [ - { - "id": "library_elec", - "type": "item_group", - "items": [ - [ "superglue", 30 ], - [ "processor", 15 ], - [ "RAM", 22 ], - [ "power_supply", 16 ], - [ "amplifier", 8 ], - [ "transponder", 5 ], - [ "receiver", 10 ], - [ "antenna", 18 ], - [ "screwdriver", 40 ], - { "group": "ammo_pocket_batteries_full", "prob": 50 }, - [ "manual_electronics", 20 ], - [ "mobile_memory_card", 20 ], - [ "usb_drive", 5 ], - [ "software_useless", 10 ], - [ "survnote", 1 ] - ] - }, { "type": "mapgen", "method": "json", "om_terrain": [ "s_library" ], "weight": 500, "object": { + "fill_ter": "t_floor", "rows": [ "~~~~~~~~~~~~~~~~~~~~~~~~", "**qq~~~~qq|-O-|---|-O-|*", @@ -49,30 +29,22 @@ "*|.|.|.|.a]aa]]aa]]aa]|*", "*|t|t|t|.............T|*", "*|-----|-O--O---O---O-|*", - "************************", + "*****4******************", "************************" ], "terrain": { - "#": "t_floor", "%": "t_console_broken", "*": "t_grass", "+": "t_door_c", - "-": "t_wall", + "-": "t_wall_w", ".": "t_floor", ":": "t_door_glass_c", "=": "t_wall_glass", "O": "t_window", - "T": "t_floor", - "]": "t_floor", - "a": "t_floor", - "d": "t_floor", - "h": "t_floor", "q": "t_grass", - "s": "t_floor", - "t": "t_floor", - "y": "t_floor", - "|": "t_wall", - "~": "t_sidewalk" + "|": "t_wall_w", + "~": "t_sidewalk", + "4": "t_gutter_downspout" }, "furniture": { "#": "f_counter", @@ -121,9 +93,65 @@ { "type": "mapgen", "method": "json", - "om_terrain": [ "s_library" ], + "om_terrain": "s_library_roof", + "object": { + "fill_ter": "t_flat_roof", + "rows": [ + " ", + " |222222222223 ", + " |...........3 ", + " |.R.........3 ", + " |22222222|........U..3 ", + " |....................3 ", + " |....................3 ", + " |....................3 ", + " |....................3 ", + " |....................3 ", + " |....................3 ", + " |....................3 ", + " |....................3 ", + " |....................3 ", + " |....................3 ", + " |....................3 ", + " |....................3 ", + " |....................3 ", + " |....................3 ", + " |....................3 ", + " |....................3 ", + " |---5----------------3 ", + " ", + " " + ], + "palettes": [ "roof_palette" ], + "place_items": [ { "item": "roof_trash", "x": [ 3, 18 ], "y": [ 6, 19 ], "chance": 50, "repeat": [ 1, 3 ] } ], + "nested": { "U": { "chunks": [ "roof_2x2_infrastructure" ] }, "R": { "chunks": [ "roof_2x2_infrastructure_1" ] } }, + "place_nested": [ + { + "chunks": [ + [ "null", 20 ], + [ "roof_2x2_utilities_b", 15 ], + [ "roof_2x2_utilities_c", 5 ], + [ "roof_2x2_utilities_d", 40 ], + [ "roof_2x2_utilities", 50 ] + ], + "x": [ 3, 15 ], + "y": [ 6, 8 ] + }, + { + "chunks": [ [ "null", 20 ], [ "roof_4x4_utility", 40 ], [ "roof_6x6_utility", 20 ] ], + "x": [ 3, 15 ], + "y": [ 10, 14 ] + } + ] + } + }, + { + "type": "mapgen", + "method": "json", + "om_terrain": [ "s_library_1" ], "weight": 500, "object": { + "fill_ter": "t_floor", "rows": [ "~~~~~~~~~~~~~~~~~~~~~~~~", "~~~~~~~~~~~~~~~~~~~~~~~~", @@ -141,41 +169,37 @@ "*|]aa]]...h%%h...]]aa]|*", "*|]aa]]...h%%h...]]aa]|*", "*|....................|*", - "*|]]]]]]]]]]]]]]]]]]]]|*", - "*|--------------------|*", - "************************", - "************************", - "****4*******************", - "*******************4****", - "************************", - "************************" + "*|]]]]]]]]]]]]]].]]]]]|*", + "*|--------------+-----|*", + "*****5***4|f.##|.|.t|***", + "**********|@...=.+.s|***", + "****5**5**|@...:.||||***", + "**********O..U.=.+.s|***", + "*5*****5**|LLLf|.|.t|***", + "**********||||||O||||***" ], "terrain": { - "#": "t_floor", "%": "t_console_broken", "*": "t_grass", "+": "t_door_c", - "-": "t_wall", + "-": "t_wall_w", ".": "t_floor", - "4": "t_tree_pine", + "5": "t_tree_pine", ":": "t_door_glass_c", ";": "t_door_locked", "=": "t_wall_glass", "O": "t_window", - "T": "t_floor", - "]": "t_floor", - "a": "t_floor", - "b": "t_floor", - "d": "t_floor", - "f": "t_floor", - "h": "t_floor", "q": "t_grass", "r": "t_grass", - "|": "t_wall", + "|": "t_wall_w", + "4": "t_gutter_downspout", "~": "t_sidewalk" }, "furniture": { "#": "f_counter", + "@": "f_sofa", + "U": "f_armchair", + "L": "f_locker", "T": "f_table", "]": "f_bookcase", "a": [ @@ -194,11 +218,13 @@ ], "b": "f_stool", "d": "f_desk", + "s": "f_sink", "f": "f_indoor_plant", "h": "f_chair", "q": "f_bluebell", "r": "f_dahlia" }, + "toilets": { "t": { } }, "place_items": [ { "item": "magazines", "x": 21, "y": [ 10, 14 ], "chance": 80, "repeat": [ 5, 12 ] }, { "item": "novels", "x": [ 2, 21 ], "y": 16, "chance": 95, "repeat": [ 12, 20 ] }, @@ -215,7 +241,65 @@ { "type": "mapgen", "method": "json", - "om_terrain": [ "s_library" ], + "om_terrain": "s_library_roof_1", + "object": { + "fill_ter": "t_flat_roof", + "rows": [ + " ", + " ", + " ", + " |222222222222222222223 ", + " |....................3 ", + " |....................3 ", + " |....................3 ", + " |....................3 ", + " |....................3 ", + " |.....x..............3 ", + " |....................3 ", + " |....................3 ", + " |....................3 ", + " |....................3 ", + " |....................3 ", + " |....................3 ", + " |....................3 ", + " |--------5.........--3 ", + " |......Z..3 ", + " |.........3 ", + " |..R......3 ", + " |.........3 ", + " |......U..3 ", + " |---------3 " + ], + "palettes": [ "roof_palette" ], + "nested": { + "U": { "chunks": [ "roof_2x2_infrastructure" ] }, + "R": { "chunks": [ "roof_2x2_infrastructure_1" ] }, + "Z": { "chunks": [ "roof_2x2_infrastructure_2" ] } + }, + "place_nested": [ + { + "chunks": [ + [ "null", 20 ], + [ "roof_2x2_utilities_b", 15 ], + [ "roof_2x2_utilities_c", 5 ], + [ "roof_2x2_utilities_d", 40 ], + [ "roof_2x2_utilities", 50 ] + ], + "x": [ 5, 15 ], + "y": [ 5, 7 ] + }, + { + "chunks": [ [ "null", 20 ], [ "roof_4x4_utility", 40 ], [ "roof_6x6_utility", 20 ] ], + "x": [ 3, 13 ], + "y": [ 9, 10 ] + } + ] + } + }, + { + "type": "mapgen", + "method": "json", + "om_terrain": [ "s_library_2" ], "weight": 1000, "object": { "fill_ter": "t_floor", @@ -237,25 +321,31 @@ " w....sss.s...CC...b| ", " wsss........ss...sb| ", " |bbbbbbbbbbbbbf...b| ", - " ----------------+--- ", - " ", - " ", - " ", - " ", - " ", - " " + " --------------w+---- ", + " M 4|VVV...+.S| ", + " w.tt...|.&| ", + " wX..t.f|||| ", + " w...t..|.t| ", + " |ftt...+.&| ", + " ||||||||||| " ], + "nested": { "M": { "chunks": [ "roof_6x6_garden_1" ] } }, "terrain": { " ": [ "t_grass", "t_grass", "t_grass", "t_dirt" ], + "M": "t_grass", "+": "t_door_c", - "-": "t_wall", + "-": "t_wall_b", ".": "t_floor", "w": "t_window_domestic", - "|": "t_wall" + "|": "t_wall_b", + "4": "t_gutter_downspout" }, "furniture": { "b": "f_bookcase", + "V": "f_bookcase", "B": "f_trashcan", + "X": "f_armchair", + "S": "f_sink", "c": "f_counter", "C": [ "f_chair", "f_null", "f_null" ], "d": "f_table", @@ -263,6 +353,8 @@ "s": [ "f_stool", "f_null", "f_null", "f_null", "f_null", "f_null", "f_null" ], "t": "f_stool" }, + "toilets": { "&": { } }, + "items": { "S": { "item": "softdrugs", "chance": 30 }, "V": { "item": "textbooks", "chance": 30 } }, "place_items": [ { "item": "magazines", "x": [ 3, 9 ], "y": 4, "chance": 90, "repeat": [ 5, 10 ] }, { "item": "magazines", "x": 20, "y": [ 8, 16 ], "chance": 90, "repeat": [ 5, 10 ] }, @@ -277,5 +369,63 @@ ], "place_monsters": [ { "monster": "GROUP_ZOMBIE", "x": [ 0, 0 ], "y": [ 23, 23 ], "chance": 2, "repeat": [ 2, 3 ] } ] } + }, + { + "type": "mapgen", + "method": "json", + "om_terrain": "s_library_roof_2", + "object": { + "fill_ter": "t_flat_roof", + "rows": [ + " ", + " ", + " |2222222222222222223 ", + " |..................3 ", + " |..................3 ", + " |..................3 ", + " |..................3 ", + " |..................3 ", + " |..................3 ", + " |..................3 ", + " |..................3 ", + " |..................3 ", + " |..................3 ", + " |..................3 ", + " |..................3 ", + " |..................3 ", + " |..................3 ", + " |--------5.........3 ", + " |......Z..3 ", + " |.U.......3 ", + " |.....R...3 ", + " |.........3 ", + " |.........3 ", + " |---------3 " + ], + "palettes": [ "roof_palette" ], + "nested": { + "U": { "chunks": [ "roof_2x2_infrastructure" ] }, + "R": { "chunks": [ "roof_2x2_infrastructure_1" ] }, + "Z": { "chunks": [ "roof_2x2_infrastructure_2" ] } + }, + "place_nested": [ + { + "chunks": [ + [ "null", 20 ], + [ "roof_2x2_utilities_b", 15 ], + [ "roof_2x2_utilities_c", 5 ], + [ "roof_2x2_utilities_d", 40 ], + [ "roof_2x2_utilities", 50 ] + ], + "x": [ 5, 15 ], + "y": [ 13, 14 ] + }, + { + "chunks": [ [ "null", 20 ], [ "roof_4x4_utility", 40 ], [ "roof_6x6_utility", 20 ] ], + "x": [ 4, 10 ], + "y": [ 4, 6 ] + } + ] + } } ] diff --git a/data/json/mapgen/lmoe.json b/data/json/mapgen/lmoe.json index d18a51c226cbb..dec22389704b9 100644 --- a/data/json/mapgen/lmoe.json +++ b/data/json/mapgen/lmoe.json @@ -7,130 +7,187 @@ "weight": 100, "object": { "rows": [ - " ", - " ", - " ", - " ", - " ", - " ", - " ", - " $$$$$$$$ ", - " $TTTTTT$ ", - " $$T####T$$ ", - " $$T#>>#T$$ ", - " $$T#..#T$$ ", - " $$T#+##T$$ ", - " $$$ $$$$ ", - " $$$ $$$$ ", - " ", - " ", - " ", - " ", - " ", - " ", - " ", - " ", - " " + " S S S", + " S S S ", + " S S S ", + " S ", + " S S SSSSS S ", + " SSSSSSSSSSSS ", + " SS$$$$$$$$$$SS ", + " S$$TTTTTTTT$$S S ", + " SS$$T))))))T$$S ", + " S SS$$T)####)T$$SS ", + " SS$$T)#>>#)T$$SS ", + " SS$$T)#..#)T$$SS ", + " SS$$T)#+##)T$$SS S", + " S S$$T))_)))T$$SS ", + " S$$$$$_$$$$$$S ", + " SS$$$$_$$$$$SS S ", + " SSSSS_SSSSSS ", + "S S S SS S ", + " S S ", + " S S ", + " S S ", + " S", + " S S ", + " S " ], - "terrain": { - " ": [ "t_dirt", "t_dirt", "t_grass" ], - "#": "t_rock", - "$": [ "t_tree", "t_tree_young", "t_tree_young", "t_shrub", "t_shrub", "t_shrub" ], - "+": "t_door_metal_c", - ".": "t_rock_floor", - ">": "t_stairs_down", - "T": "t_tree" - } + "palettes": [ "bunker_ext" ] } }, { "type": "mapgen", "method": "json", - "om_terrain": [ "lmoe_under" ], - "//": "Below ground", + "om_terrain": [ "lmoe_roof" ], + "//": "Above ground", "weight": 100, "object": { + "rows": [ + "vvvvvvvvvvvvvvvvvvvvvvvv", + "vvvvvvvvvvvvvvvvvvvvvvvv", + "vvvvvvvvvvvvvvvvvvvvvvvv", + "vvvvvvvvvvvvvvvvvvvvvvvv", + "vvvvvvvvvvvvvvvvvvvvvvvv", + "vvvvvvvvvvvvvvvvvvvvvvvv", + "vvvvvvvvvvvvvvvvvvvvvvvv", + "vvvvvvvvvvvvvvvvvvvvvvvv", + "vvvvvvvvv((((((vvvvvvvvv", + "vvvvvvvvv( (vvvvvvvvv", + "vvvvvvvvv( (vvvvvvvvv", + "vvvvvvvvv( (vvvvvvvvv", + "vvvvvvvvv( (vvvvvvvvv", + "vvvvvvvvv((v(((vvvvvvvvv", + "vvvvvvvvvvvvvvvvvvvvvvvv", + "vvvvvvvvvvvvvvvvvvvvvvvv", + "vvvvvvvvvvvvvvvvvvvvvvvv", + "vvvvvvvvvvvvvvvvvvvvvvvv", + "vvvvvvvvvvvvvvvvvvvvvvvv", + "vvvvvvvvvvvvvvvvvvvvvvvv", + "vvvvvvvvvvvvvvvvvvvvvvvv", + "vvvvvvvvvvvvvvvvvvvvvvvv", + "vvvvvvvvvvvvvvvvvvvvvvvv", + "vvvvvvvvvvvvvvvvvvvvvvvv" + ], + "palettes": [ "bunker_ext" ] + } + }, + { + "type": "mapgen", + "method": "json", + "om_terrain": [ "lmoe_under_empty" ], + "//": "Empty LMOE shelter that has been looted or used.", + "//2": "This particular 2-bed shelter is a more professionally done, all metal bomb shelter with kitchen, secret safe room / gun locker, and workshop.", + "weight": 100, + "object": { + "fill_ter": "t_metal_floor", "rows": [ "########################", "########################", + "##||||||||||||||||||||##", + "##|{{{{{|UUUUUU|w__BB|##", + "##|u____|U____U|d__BB|##", + "##|u___h|U_UU_U|A,,,_|##", + "##|u___D|=*==*=|_,,,}|##", + "##|A____:______+_,,,}|##", + "##|||||||_1,,1_|S__hD|##", + "##|VVVVV=_e,,P_|||||||##", + "##|_____*__,,____|s_K|##", + "##|vvvvv=_E,,f___+__t|##", + "##|||||||||++|||||||||##", + "##|c_bbbbA|,,|CSCCKCC|##", + "##|c______|,,|u_____C|##", + "##|c_TT___|,,|u_hLh_F|##", + "##|c_TTh__+__+_______|##", + "##|c_TT___|__|rrrr__~|##", + "##|c______|__|||||+|||##", + "##|c______|__*__a|__A|##", + "##|ccccccc|<<=G_a|HlW|##", + "##||||||||||||||||||||##", "########################", - "###{{{{].......|}..BB###", - "###....].......|}..BB###", - "###....].......|}....###", - "###==*=].......+.....###", - "###.......1..1.|...CD###", - "###............|.....###", - "###{{{{{.......------###", - "###............^^|.K.###", - "###{{{{{.........+..t###", - "###--------++--------###", - "###c.}}}}.|..|C..XXXX###", - "###c......|..|....XXX###", - "###c.TT...|..|.....X~###", - "###c.TTC..+..+...S.~^###", - "###c.TT...|..|....~^^###", - "###c......|..|C..~^^^###", - "###c......|..|..~^^^^###", - "###ccccccc|<<|.~^^^^^###", + "########################" + ], + "palettes": [ "bunker", "empty_bunker_items" ] + } + }, + { + "type": "mapgen", + "method": "json", + "om_terrain": [ "lmoe_under_empty" ], + "//": "Empty LMOE shelter that has been looted or used.", + "//2": "This particular 4-bed shelter is definitely homemade, mostly carved out of bare rock, and seems to be incomplete.", + "weight": 100, + "object": { + "fill_ter": "t_rock_floor", + "rows": [ "########################", "########################", + "##<<..=...^#############", + "##....*....^############", + "##....=....^############", + "##===###Y...^###########", + "##G.R###-+|||####||||||#", + "##a.l###A.|UUVVvv|{{{{|#", + "##=*=###..|U.....:....|#", + "##c..ll-..|Uuuu.u||||||#", + "##c....+..|||||+||Dh..d#", + "##c.h..-r.+......+...BB#", + "##c.TTT-r.-r..h..------#", + "#######--+-r.hLh.+...BB#", + "#######-F.Sr..h..-Dh..d#", + "#######-C.......-------#", + "#######-CCKC.uu.+...hD-#", + "#######-----.--+-}....-#", + "#########W.~.-s.-}.BBS-#", + "#########H...-&.-w.BBr-#", + "#########l..A-Kt-------#", + "#########--------#######", + "########################", "########################" ], - "terrain": { - "#": "t_rock", - "*": "t_chaingate_c", - "+": "t_door_metal_c", - "-": "t_wall_metal", - ".": "t_rock_floor", - "1": "t_column", - "<": "t_stairs_up", - "=": "t_chainfence_h", - "B": "t_rock_floor", - "C": "t_rock_floor", - "D": "t_rock_floor", - "K": "t_rock_floor", - "S": "t_rock_floor", - "T": "t_rock_floor", - "X": "t_rock_floor", - "]": "t_chainfence_v", - "^": "t_rock_floor", - "c": "t_rock_floor", - "t": "t_rock_floor", - "{": "t_rock_floor", - "|": "t_wall_metal", - "}": "t_rock_floor", - "~": "t_water_sh" - }, - "furniture": { - "B": "f_bed", - "C": "f_chair", - "D": "f_desk", - "K": "f_sink", - "S": "f_woodstove", - "T": "f_table", - "X": "f_crate_c", - "^": "f_rubble", - "c": "f_counter", - "{": "f_rack", - "}": "f_bookcase" - }, - "toilets": { "t": { } }, - "place_items": [ - { "item": "lmoe_guns", "x": [ 3, 6 ], "y": [ 3, 3 ], "chance": 80 }, - { "item": "ammo", "x": [ 3, 6 ], "y": [ 3, 3 ], "chance": 80 }, - { "item": "cannedfood", "x": [ 3, 7 ], "y": [ 9, 9 ], "chance": 90 }, - { "item": "gear_survival", "x": [ 3, 7 ], "y": [ 11, 11 ], "chance": 80 }, - { "item": "bags", "x": [ 3, 7 ], "y": [ 11, 11 ], "chance": 50 }, - { "item": "softdrugs", "x": [ 3, 7 ], "y": [ 11, 11 ], "chance": 50 }, - { "item": "manuals", "x": [ 5, 8 ], "y": [ 13, 13 ], "chance": 60 }, - { "item": "textbooks", "x": [ 5, 8 ], "y": [ 13, 13 ], "chance": 60 }, - { "item": "tools_common", "x": [ 5, 6 ], "y": [ 15, 17 ], "chance": 90 }, - { "item": "hardware", "x": [ 3, 3 ], "y": [ 13, 20 ], "chance": 70 }, - { "item": "stash_wood", "x": [ 3, 9 ], "y": [ 20, 20 ], "chance": 70 }, - { "item": "shelter", "x": [ 18, 20 ], "y": [ 13, 14 ], "chance": 70 }, - { "item": "novels", "x": [ 16, 16 ], "y": [ 3, 5 ], "chance": 70 }, - { "item": "office", "x": [ 20, 20 ], "y": [ 7, 7 ], "chance": 50 }, - { "item": "bed", "x": [ 19, 20 ], "y": [ 3, 4 ], "chance": 60 } + "palettes": [ "bunker", "empty_bunker_items" ] + } + }, + { + "type": "mapgen", + "method": "json", + "om_terrain": [ "lmoe_under_empty" ], + "//": "Empty LMOE shelter that has been looted or used.", + "//2": "This is a commercially built 4-bed LMOE shelter based on IRL plans.", + "//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", + "rows": [ + "##|||||#################", + "##|,,<|||||||###########", + "##|Y,<|w,BBd|###########", + "||||+||},BB,|###########", + "|A,,,E|,,,,,|###########", + "|f,,,,|+|||||||||||#####", + "|f,,,e|,,,,b|_____|#####", + "|f,,,,|,,h,,|_____|#####", + "|Dh,,P|,hLh,|_____|#####", + "|,,,,,|,hLh,|_____|#####", + "|,,,,,+,,h,,|_____|#####", + "|,|||||~,,,u|_____|#####", + "|,+,,B|K,,,u:_____|#####", + "|,|d,B|COC,u|_____|#####", + "|,||||||||+||_____|#####", + "|,+,,B|t,,,K|_____|#####", + "|}|d,B|WAv,s|_____|#####", + "|;|||||||||:|||+||||||||", + "|__|_____|__|_______=__|", + "|__|_____||+|_______*__|", + "|__|________|_______=__|", + "|__|________+_______=__|", + "|__+________|_______=__|", + "||||||||||||||||||||||||" + ], + "palettes": [ "bunker", "empty_bunker_items" ], + "place_nested": [ + { "chunks": [ "lmoe3_storage_11x11" ], "x": 13, "y": 6 }, + { "chunks": [ "lmoe3_tankroom_11x11" ], "x": 1, "y": 18 }, + { "chunks": [ "lmoe3_crafting_11x11" ], "x": 13, "y": 18 } ] } }, @@ -138,94 +195,39 @@ "type": "mapgen", "method": "json", "om_terrain": [ "lmoe_under" ], - "//": "Below ground", - "weight": 100, + "//": "Stocked up LMOE shelter.", + "//2": "This particular 2-bed shelter is a more professionally done, all metal bomb shelter with kitchen, secret safe room / gun locker, and workshop.", + "//3": "For now this is just filler terrain, it shouldn't spawn in game.", + "weight": 50, "object": { + "fill_ter": "t_metal_floor", "rows": [ "########################", "########################", - "##<<..].........^^^^####", - "##....*............^^^##", - "##....]..............^##", - "##===###.........#######", - "##...###-+------########", - "##===###..|{{{{{{#######", - "##.....|..+...........##", - "##.....|..|.{{...{{{{.##", - "##.....+..|----+------##", - "##.....|..+..+..ccccc{##", - "##{{{{{|..|..|.......{##", - "##------+----|}.CTTT.{##", - "##XXXX.......|}......{##", - "##...........|..------##", - "##....S......|..+...CD##", - "##......~~~..--+|.....##", - "##....~~~~~~~|K.|}.BBS##", - "###..~~~~~~~~|..|}.BB###", - "####.~~~~~~~~|t.|#######", - "#######~~~##############", + "##||||||||||||||||||||##", + "##|{{{{{|UUUUUU|w__BB|##", + "##|u____|U____U|d__BB|##", + "##|u___h|U_UU_U|A,,,_|##", + "##|u___D|=*==*=|_,,,}|##", + "##|A____:______+_,,,}|##", + "##|||||||_1,,1_|S__hD|##", + "##|VVVVV=_e,,P_|||||||##", + "##|_____*__,,____|s_K|##", + "##|vvvvv=_E,,f___+__t|##", + "##|||||||||++|||||||||##", + "##|c_bbbbA|,,|CSCCKCC|##", + "##|c______|,,|u_____C|##", + "##|c_TT___|,,|u_hLh_F|##", + "##|c_TTh__+__+_______|##", + "##|c_TT___|__|rrrr__~|##", + "##|c______|__|||||+|||##", + "##|c______|__*__a|__A|##", + "##|ccccccc|<<=G_a|HlW|##", + "##||||||||||||||||||||##", "########################", "########################" ], - "terrain": { - "#": "t_rock", - "*": "t_chaingate_c", - "+": "t_door_metal_c", - "-": "t_wall_metal", - ".": "t_rock_floor", - "<": "t_stairs_up", - "=": "t_chainfence_h", - "B": "t_rock_floor", - "C": "t_rock_floor", - "D": "t_rock_floor", - "K": "t_rock_floor", - "S": "t_rock_floor", - "T": "t_rock_floor", - "X": "t_rock_floor", - "]": "t_chainfence_v", - "^": "t_rock_floor", - "c": "t_rock_floor", - "t": "t_rock_floor", - "{": "t_rock_floor", - "|": "t_wall_metal", - "}": "t_rock_floor", - "~": "t_water_sh" - }, - "furniture": { - "B": "f_bed", - "C": "f_chair", - "D": "f_desk", - "K": "f_sink", - "S": "f_woodstove", - "T": "f_table", - "X": "f_crate_c", - "^": "f_rubble", - "c": "f_counter", - "{": "f_rack", - "}": "f_bookcase" - }, - "toilets": { "t": { } }, - "place_items": [ - { "item": "lmoe_guns", "x": [ 2, 6 ], "y": [ 12, 12 ], "chance": 80 }, - { "item": "ammo", "x": [ 2, 6 ], "y": [ 12, 12 ], "chance": 80 }, - { "item": "cannedfood", "x": [ 17, 20 ], "y": [ 9, 9 ], "chance": 90 }, - { "item": "cannedfood", "x": [ 12, 13 ], "y": [ 9, 9 ], "chance": 90 }, - { "item": "cannedfood", "x": [ 11, 16 ], "y": [ 7, 7 ], "chance": 90 }, - { "item": "gear_survival", "x": [ 21, 21 ], "y": [ 11, 14 ], "chance": 80 }, - { "item": "bags", "x": [ 21, 21 ], "y": [ 11, 14 ], "chance": 50 }, - { "item": "shelter", "x": [ 21, 21 ], "y": [ 11, 14 ], "chance": 70 }, - { "item": "tools_common", "x": [ 17, 19 ], "y": [ 13, 13 ], "chance": 90 }, - { "item": "hardware", "x": [ 16, 20 ], "y": [ 11, 11 ], "chance": 70 }, - { "item": "softdrugs", "x": [ 21, 21 ], "y": [ 16, 16 ], "chance": 50 }, - { "item": "office", "x": [ 21, 21 ], "y": [ 16, 16 ], "chance": 50 }, - { "item": "manuals", "x": [ 14, 14 ], "y": [ 13, 14 ], "chance": 60 }, - { "item": "textbooks", "x": [ 14, 14 ], "y": [ 13, 14 ], "chance": 60 }, - { "item": "stash_wood", "x": [ 10, 12 ], "y": [ 14, 16 ], "chance": 90 }, - { "item": "stash_wood", "x": [ 6, 6 ], "y": [ 16, 16 ], "chance": 90 }, - { "item": "stash_wood", "x": [ 21, 21 ], "y": [ 18, 18 ], "chance": 60 }, - { "item": "novels", "x": [ 17, 17 ], "y": [ 18, 19 ], "chance": 70 }, - { "item": "bed", "x": [ 19, 20 ], "y": [ 18, 19 ], "chance": 70 } - ] + "palettes": [ "bunker", "empty_bunker_items" ] } } ] diff --git a/data/json/mapgen/mapgen-test.json b/data/json/mapgen/mapgen-test.json index e5b7772083c91..ffa3f3da92313 100644 --- a/data/json/mapgen/mapgen-test.json +++ b/data/json/mapgen/mapgen-test.json @@ -71,8 +71,8 @@ "place_furniture": [ { "furn": "f_rack", "x": 9, "y": 3 } ], "place_traps": [ { "trap": "tr_funnel", "x": 7, "y": 3 } ], "traps": { "F": "tr_cot", "f": { "trap": "tr_funnel" }, "g": { "trap": "tr_funnel" } }, - "fields": { "B": { "field": "fd_blood", "density": 1, "age": 10 } }, - "place_fields": [ { "field": "fd_bile", "x": 5, "y": 1, "density": 2, "age": 20 } ], + "fields": { "B": { "field": "fd_blood", "intensity": 1, "age": 10 } }, + "place_fields": [ { "field": "fd_bile", "x": 5, "y": 1, "intensity": 2, "age": 20 } ], "place_signs": [ { "signage": "it works again.", "x": 7, "y": 1 }, { "signage": " owned at ", "x": 7, "y": 2 }, diff --git a/data/json/mapgen/mil_surplus.json b/data/json/mapgen/mil_surplus.json index afabdd2516087..51c1614f5e232 100644 --- a/data/json/mapgen/mil_surplus.json +++ b/data/json/mapgen/mil_surplus.json @@ -5,15 +5,16 @@ "om_terrain": [ "mil_surplus" ], "weight": 300, "object": { + "fill_ter": "t_floor", "rows": [ "...........~~...........", "...........~~...........", "..-''''''--++--''''''--.", - "..| |.", - "..| # |.", - "..| # |.", - "..| # |.", - "..| # |.", + "..| QrQd |.", + "..| # b b |.", + "..| # *]* |.", + "..| # d *8* |.", + "..| # *** |.", "..| |.", "..| R R R R R R R R R |.", "..| R R R R R R R R R |.", @@ -27,9 +28,9 @@ "..| R R R R R R R R R |.", "..| R R R R R R R R R |.", "..| |.", - "..---------------------.", - "........................", - "........................" + "..|-+-----+--------+- |.", + "..|& %|4YYYUUYUU<|LL|d|.", + "..|----YYYYYYYYYY-----|." ], "palettes": [ "mil_surplus" ], "place_loot": [ @@ -42,15 +43,89 @@ { "group": "mil_food_nodrugs", "x": 16, "y": [ 9, 19 ], "chance": 70 }, { "group": "mil_food_nodrugs", "x": 18, "y": [ 9, 19 ], "chance": 70 }, { "group": "mil_food_nodrugs", "x": 20, "y": [ 9, 19 ], "chance": 70 } + ], + "items": { + "%": { "item": "softdrugs", "chance": 30 }, + "L": { "item": "cleaning", "chance": 30 }, + "U": { "item": "trash", "chance": 20, "repeat": [ 2, 4 ] }, + "d": [ + { "item": "mil_armor", "chance": 40 }, + { "item": "mil_armor_pants", "chance": 100 }, + { "item": "mil_armor_torso", "chance": 100 }, + { "item": "mil_armor_helmet", "chance": 10 }, + { "item": "shoestore_shoes", "chance": 20 } + ] + } + } + }, + { + "type": "mapgen", + "method": "json", + "om_terrain": "mil_surplus_roof", + "object": { + "fill_ter": "t_flat_roof", + "rows": [ + " ", + " ", + " |22222222222222222223 ", + " |...................3 ", + " |...................3 ", + " |...................3 ", + " |...................3 ", + " |...................3 ", + " |...................3 ", + " |...................3 ", + " |...................3 ", + " |...................3 ", + " |...................3 ", + " |...................3 ", + " |...................3 ", + " |...................3 ", + " |...................3 ", + " |...................3 ", + " |...................3 ", + " |...................3 ", + " |...................3 ", + " |.R.5-------####..U.3 ", + " |...3 ####>#....3 ", + " |---3 |----3 " + ], + "palettes": [ "roof_palette" ], + "terrain": { ">": "t_ladder_down" }, + "nested": { "U": { "chunks": [ "roof_2x2_infrastructure" ] }, "R": { "chunks": [ "roof_2x2_infrastructure_1" ] } }, + "place_nested": [ + { + "chunks": [ + [ "null", 20 ], + [ "roof_2x2_utilities_b", 15 ], + [ "roof_2x2_utilities_c", 5 ], + [ "roof_2x2_utilities_d", 40 ], + [ "roof_2x2_utilities", 40 ] + ], + "x": [ 4, 18 ], + "y": [ 5, 6 ] + }, + { + "chunks": [ + [ "null", 20 ], + [ "roof_4x4_utility", 40 ], + [ "roof_6x6_survivor", 20 ], + [ "roof_4x4_holdout", 5 ], + [ "roof_6x6_utility", 20 ] + ], + "x": [ 3, 13 ], + "y": [ 8, 14 ] + } ] } }, { "type": "mapgen", "method": "json", - "om_terrain": [ "mil_surplus" ], + "om_terrain": [ "mil_surplus_1" ], "weight": 300, "object": { + "fill_ter": "t_floor", "rows": [ "...........~~...........", "...........~~...........", @@ -73,12 +148,20 @@ ".| |.", ".| CCCCCCC CCCCCCC |.", ".| |.", - ".| CCCCCCC CCCCCCC |.", + ".| CCCCCCC CCCCCCC |4", ".----------------------.", "........................" ], "palettes": [ "mil_surplus" ], "items": { "R": { "item": "mil_armor", "chance": 50 } }, + "%": { "item": "softdrugs", "chance": 30 }, + "@": [ + { "item": "mil_armor", "chance": 40 }, + { "item": "mil_armor_pants", "chance": 100 }, + { "item": "mil_armor_torso", "chance": 100 }, + { "item": "mil_armor_helmet", "chance": 10 }, + { "item": "shoestore_shoes", "chance": 20 } + ], "place_loot": [ { "group": "mil_armor", "x": 8, "y": [ 7, 11 ], "chance": 70 }, { "group": "mil_armor", "x": 11, "y": [ 7, 11 ], "chance": 70 }, @@ -98,46 +181,70 @@ } }, { + "type": "mapgen", "method": "json", + "om_terrain": "mil_surplus_roof_1", "object": { - "furniture": { - "#": "f_counter", - "+": "f_null", - "-": "f_null", - ".": "f_null", - "D": "f_null", - "S": "f_null", - "^": "f_indoor_plant", - "_": "f_null", - "b": "f_bench", - "c": "f_chair", - "d": "f_null", - "l": "f_locker", - "r": "f_null", - "s": "f_null", - "t": "f_table", - "u": "f_null", - "{": "f_rack", - "|": "f_null" - }, - "place_items": [ - { "chance": 25, "item": "mil_armor_pants", "x": [ 3, 5 ], "y": 11 }, - { "chance": 25, "item": "mil_armor_pants", "x": [ 3, 5 ], "y": 8 }, - { "chance": 25, "item": "jackets", "x": [ 8, 9 ], "y": 18 }, - { "chance": 55, "item": "winter", "x": [ 4, 5 ], "y": 13 }, - { "chance": 55, "item": "winter", "x": [ 3, 6 ], "y": 6 }, - { "chance": 55, "item": "winter", "x": [ 3, 6 ], "y": 2 }, - { "chance": 25, "item": "mil_accessories", "x": 3, "y": [ 13, 16 ] }, - { "chance": 35, "item": "magazines", "x": [ 10, 11 ], "y": 18 }, - { "chance": 45, "item": "knife_shop", "x": [ 4, 6 ], "y": 4 }, - { "chance": 35, "item": "antique_guns", "x": 20, "y": 5 }, - { "chance": 35, "item": "antique_guns", "x": 18, "y": 5 }, - { "chance": 35, "item": "mil_surplus", "x": [ 9, 10 ], "y": [ 13, 14 ] }, - { "chance": 35, "item": "mil_surplus", "x": 21, "y": [ 11, 19 ] }, - { "chance": 35, "item": "mil_surplus", "x": [ 17, 18 ], "y": [ 11, 18 ] }, - { "chance": 35, "item": "mil_surplus", "x": [ 14, 15 ], "y": [ 11, 18 ] }, - { "chance": 35, "item": "mil_surplus", "x": [ 9, 10 ], "y": [ 9, 10 ] } + "fill_ter": "t_flat_roof", + "rows": [ + " ", + " ", + " |222222222222222222223 ", + " |....................3 ", + " |....................3 ", + " |....................3 ", + " |....................3 ", + " |....................3 ", + " |....................3 ", + " |....................3 ", + " |....................3 ", + " |....................3 ", + " |....................3 ", + " |....................3 ", + " |....................3 ", + " |....................3 ", + " |....................3 ", + " |....................3 ", + " |....................3 ", + " |..U...............Z.3 ", + " |..........R.........3 ", + " |................... 5 ", + " |--------------------3 ", + " " ], + "palettes": [ "roof_palette" ], + "nested": { + "U": { "chunks": [ "roof_2x2_infrastructure" ] }, + "R": { "chunks": [ "roof_2x2_infrastructure_1" ] }, + "Z": { "chunks": [ "roof_2x2_infrastructure_2" ] } + }, + "place_nested": [ + { + "chunks": [ + [ "null", 20 ], + [ "roof_2x2_utilities_b", 15 ], + [ "roof_2x2_utilities_c", 5 ], + [ "roof_2x2_utilities_d", 40 ], + [ "roof_2x2_utilities", 50 ] + ], + "x": [ 4, 18 ], + "y": [ 4, 6 ] + }, + { + "chunks": [ [ "null", 20 ], [ "roof_4x4_utility", 40 ], [ "roof_6x6_utility", 20 ] ], + "x": [ 5, 13 ], + "y": [ 8, 11 ] + } + ] + } + }, + { + "method": "json", + "om_terrain": "mil_surplus_2", + "type": "mapgen", + "weight": 100, + "object": { + "fill_ter": "t_floor", "rows": [ "___d___ud___________ss__", "__||||||||||||------ssr_", @@ -156,37 +263,112 @@ "__|#.....tt...{{.{{..{|_", "__|#..........{{.{{..{|_", "__|#..........{{.{{..{|d", - "_u|....||||||.{{.{{..{|u", + "_u|b...||||||.{{.{{..{|u", "__|b...|llll|.{{.{{..{|_", - "__|b...|....|........{|_", - "__|b...+....|||||||||||_", - "d_|^...|tc..+ss____duS__", + "__||||.|....|........{|_", + "__|&.+.+....|||||||||||4", + "d_|%.|y|tc..+ss____duS__", "__|||||||||||ss_________", "____u_u_______________d_" ], "terrain": { - "#": "t_floor", "+": "t_door_c", "-": "t_railing_h", ".": "t_floor", "D": "t_door_glass_c", "S": "t_shrub", - "^": "t_floor", "_": "t_grass", - "b": "t_floor", - "c": "t_floor", "d": "t_dirt", - "l": "t_floor", "r": "t_railing_v", "s": "t_sidewalk", - "t": "t_floor", "u": "t_underbrush", - "{": "t_floor", - "|": "t_wall" - } - }, - "om_terrain": "mil_surplus", + "|": "t_wall_g", + "4": "t_gutter_downspout" + }, + "furniture": { + "#": "f_counter", + "^": "f_indoor_plant", + "b": "f_bench", + "c": "f_chair", + "l": "f_locker", + "t": "f_table", + "{": "f_rack", + "%": "f_sink", + "y": [ "f_indoor_plant_y", "f_indoor_plant" ] + }, + "toilets": { "&": { } }, + "place_items": [ + { "chance": 25, "item": "mil_armor_pants", "x": [ 3, 5 ], "y": 11 }, + { "chance": 25, "item": "mil_armor_pants", "x": [ 3, 5 ], "y": 8 }, + { "chance": 25, "item": "jackets", "x": [ 8, 9 ], "y": 18 }, + { "chance": 55, "item": "winter", "x": [ 4, 5 ], "y": 13 }, + { "chance": 55, "item": "winter", "x": [ 3, 6 ], "y": 6 }, + { "chance": 55, "item": "winter", "x": [ 3, 6 ], "y": 2 }, + { "chance": 25, "item": "mil_accessories", "x": 3, "y": [ 13, 16 ] }, + { "chance": 35, "item": "magazines", "x": [ 10, 11 ], "y": 18 }, + { "chance": 45, "item": "knife_shop", "x": [ 4, 6 ], "y": 4 }, + { "chance": 35, "item": "antique_guns", "x": 20, "y": 5 }, + { "chance": 35, "item": "antique_guns", "x": 18, "y": 5 }, + { "chance": 35, "item": "mil_surplus", "x": [ 9, 10 ], "y": [ 13, 14 ] }, + { "chance": 35, "item": "mil_surplus", "x": 21, "y": [ 11, 19 ] }, + { "chance": 35, "item": "mil_surplus", "x": [ 17, 18 ], "y": [ 11, 18 ] }, + { "chance": 35, "item": "mil_surplus", "x": [ 14, 15 ], "y": [ 11, 18 ] }, + { "chance": 35, "item": "mil_surplus", "x": [ 9, 10 ], "y": [ 9, 10 ] } + ] + } + }, + { "type": "mapgen", - "weight": 100 + "method": "json", + "om_terrain": "mil_surplus_roof_2", + "object": { + "fill_ter": "t_flat_roof", + "rows": [ + " ", + " |22222222222222222223 ", + " |...................3 ", + " |...................3 ", + " |...................3 ", + " |...................3 ", + " |...................3 ", + " |...................3 ", + " |...................3 ", + " |...................3 ", + " |...................3 ", + " |...................3 ", + " |...................3 ", + " |...................3 ", + " |...................3 ", + " |...................3 ", + " |...................3 ", + " |...................3 ", + " |...................3 ", + " |...................3 ", + " |..R...U..3---------5 ", + " |.........3 ", + " |---------3 ", + " " + ], + "palettes": [ "roof_palette" ], + "nested": { "U": { "chunks": [ "roof_2x2_infrastructure" ] }, "R": { "chunks": [ "roof_2x2_infrastructure_1" ] } }, + "place_nested": [ + { + "chunks": [ + [ "null", 20 ], + [ "roof_2x2_utilities_b", 15 ], + [ "roof_2x2_utilities_c", 5 ], + [ "roof_2x2_utilities_d", 40 ], + [ "roof_2x2_utilities", 50 ] + ], + "x": [ 5, 18 ], + "y": [ 3, 6 ] + }, + { + "chunks": [ [ "null", 20 ], [ "roof_4x4_utility", 40 ], [ "roof_6x6_utility", 20 ] ], + "x": [ 3, 13 ], + "y": [ 8, 13 ] + } + ] + } } ] diff --git a/data/json/mapgen/music_venue.json b/data/json/mapgen/music_venue.json index b9ea69b59df04..d01acaa775191 100644 --- a/data/json/mapgen/music_venue.json +++ b/data/json/mapgen/music_venue.json @@ -30,7 +30,8 @@ "u": "f_null", "w": "f_null", "{": "f_glass_fridge", - "|": "f_null" + "|": "f_null", + "7": "f_speaker_cabinet" }, "place_items": [ { "chance": 45, "item": "bar_table", "x": 15, "y": 15 }, @@ -59,32 +60,42 @@ { "chance": 75, "item": "music_shop", "x": 6, "y": 8 }, { "chance": 75, "item": "mussto_stringinst", "x": 5, "y": 6 } ], + "place_loot": [ + { "chance": 20, "item": "tshirt_tour", "x": [ 8, 19 ], "y": [ 6, 12 ], "repeat": [ 1, 5 ] }, + { "item": "amplifier_head", "x": 3, "y": 10 }, + { "chance": 10, "item": "amplifier_head", "x": 2, "y": [ 5, 12 ], "repeat": [ 1, 2 ] }, + { "chance": 5, "item": "amplifier_head", "x": [ 3, 4 ], "y": [ 5, 12 ], "repeat": [ 1, 4 ] } + ], + "place_furniture": [ + { "chance": 20, "furn": "f_speaker_cabinet", "x": 2, "y": [ 5, 12 ], "repeat": [ 1, 2 ] }, + { "chance": 10, "furn": "f_speaker_cabinet", "x": [ 3, 4 ], "y": [ 5, 12 ], "repeat": [ 1, 4 ] } + ], "place_toilets": [ { "x": 2, "y": 14 }, { "x": 4, "y": 14 }, { "x": 6, "y": 14 } ], "rows": [ - "____d___ss________d_____", + "________ss______________", "_______rss-----|||W||___", - "_d____ursssssssW...#|d__", + "______ursssssssW...#|___", "____dufrsssssss+....|___", "_||||||||||||||||..||||_", - "_|cccccc.............^|_", + "_|ccccc7.............^|_", "_|cecccc...#...#......|_", - "d|cccccc..#t#.#t#....#|_", - "_|cccccc...#...#.....t|d", + "_|cccccc..#t#.#t#....#|_", + "_|cccccc...#...#.....t|_", "_|cccccc.....#.......#|_", - "_|cccccc..#.#t#.......|_", + "_|c7cccc..#.#t#.......|_", "_|cccccc..t..#..#t#..H|_", - "_|cceccc..#..........H|u", + "_|ccecc7..#..........H|_", "_|||||||.............H|_", "_|&|&|&|...#####......|_", "_|g|D|D|..aaaaaaa.....|_", - "d|.....+..a.....a.....|_", - "_|SaSah|.....{{{a....^|d", + "_|.....+..a.....a.....|_", + "_|SaSah|.....{{{a....^|_", "_||||||||www|www||+||||_", - "_____uu|bCCCTCCCCCCCbb|_", - "____d_urTCCCCCCCCCCCCCr_", - "d______rbCCCCCCCCCCCCCr_", + "_____u<|bCCCTCCCCCCCbb|_", + "______urTCCCCCCCCCCCCCr_", + "_______rbCCCCCCCCCCCCCr_", "_______----------------_", - "___d______d__________d__" + "________________________" ], "terrain": { "#": "t_floor", @@ -99,7 +110,7 @@ "T": "t_concrete", "W": "t_window_no_curtains", "^": "t_floor", - "_": "t_grass", + "_": [ [ "t_grass", 6 ], [ "t_dirt", 2 ], [ "t_grass_long", 4 ], [ "t_underbrush", 2 ] ], "a": "t_floor", "b": "t_concrete", "c": "t_carpet_red", @@ -114,13 +125,68 @@ "u": "t_underbrush", "w": "t_wall_glass", "{": "t_floor", - "|": "t_wall" + "|": "t_wall", + "<": "t_gutter_downspout", + "7": "t_carpet_red" } }, "om_terrain": "music_venue", "type": "mapgen", "weight": 100 }, + { + "method": "json", + "object": { + "fill_ter": "t_flat_roof", + "rows": [ + " ", + " wnnnne ", + " w....e ", + " w....e ", + " wnnnnnnnnnnnnnw....ene ", + " w....................e ", + " w....................e ", + " w.&..................e ", + " w....................e ", + " w....................e ", + " w....................e ", + " w....................e ", + " w....................e ", + " w....................e ", + " w....................e ", + " w....................e ", + " w....................e ", + " w....................e ", + " wsssssw..............e ", + " d e ", + " ", + " ", + " ", + " " + ], + "terrain": { + " ": "t_open_air", + ".": "t_flat_roof", + "n": "t_gutter_north", + "e": "t_gutter_east", + "s": "t_gutter_south", + "w": "t_gutter_west", + "d": "t_gutter_downspout" + }, + "furniture": { "&": "f_roof_turbine_vent" }, + "place_items": [ { "item": "roof_trash", "x": [ 2, 21 ], "y": [ 5, 17 ], "chance": 50, "repeat": [ 1, 3 ] } ], + "place_nested": [ + { + "chunks": [ [ "null", 5 ], [ "roof_2x2_utilities_d", 30 ], [ "roof_2x2_utilities", 50 ], [ "roof_6x6_survivor", 5 ] ], + "x": [ 4, 19 ], + "y": [ 7, 15 ] + } + ] + }, + "om_terrain": "music_venue_roof", + "type": "mapgen", + "weight": 100 + }, { "method": "json", "object": { @@ -151,7 +217,8 @@ "t": "f_table", "v": "f_vending_c", "{": "f_glass_fridge", - "|": "f_null" + "|": "f_null", + "7": "f_speaker_cabinet" }, "place_items": [ { "chance": 65, "item": "bar_trash", "x": [ 13, 14 ], "y": 20 }, @@ -180,39 +247,45 @@ { "chance": 25, "item": "hatstore_hats", "x": 11, "y": 10 }, { "chance": 75, "item": "bar_alcohol", "x": [ 6, 8 ], "y": 18 } ], + "place_loot": [ + { "chance": 20, "item": "tshirt_tour", "x": [ 10, 18 ], "y": [ 5, 15 ], "repeat": [ 1, 5 ] }, + { "item": "amplifier_head", "x": 6, "y": 9 }, + { "chance": 5, "item": "amplifier_head", "x": 5, "y": [ 7, 12 ], "repeat": [ 1, 2 ] } + ], + "place_furniture": [ { "chance": 10, "furn": "f_speaker_cabinet", "x": 5, "y": [ 7, 12 ], "repeat": [ 1, 2 ] } ], "place_toilets": [ { "x": 4, "y": 2 }, { "x": 6, "y": 2 }, { "x": 8, "y": 2 } ], "rows": [ - ".......d.......sss..d...", + ".......d.......sss......", "...||||||||--||TTT||||..", - "d..|&|&|&|___^|TTT|vv|..", - "...|D|D|f|____|a-a|__|d.", + "...|&|&|&|___^|TTT|vv|..", + "...|D|D|f|____|a-a|__|..", "...|_____+___________|..", "...|SCSCg|___________|..", "...|||||||___________|..", - "..d|cccccc_____#_____|..", + "...|ccccc7_____#_____|..", "...|ccbccc____#t#___t|..", - "...|cccccc__#__#____H|.d", - "..d|bccccc_#t#______H|..", + "...|cc7ccc__#__#____H|..", + "...|bccccc_#t#______H|..", "...|cccccc__#__#____H|..", - "...|cccccc____#t#___t|..", + "...|ccccc7____#t#___t|..", "...|________#__#____H|d.", "...|_______#t#______H|..", - "d..|________#_______H|..", + "...|________#_______H|..", "...|CCCC||__________t|..", - "...|_____h___________|..", - "...|rr{{{|___HHH_____|..", + "...|_____h_________|+|..", + "...|rr{{{|___HHH___|<|..", "...|||||||||||||||+|||..", - "..........d..eeps|_|....", - "......d......ppps+_|d...", + ".....!....d..eeps|_|....", + ".............ppps+_|....", ".............ppps|||....", - "..d.....d.......d......d" + "................d......." ], "terrain": { "#": "t_floor", "&": "t_floor", "+": "t_door_c", "-": "t_wall_glass", - ".": "t_grass", + ".": [ [ "t_grass", 20 ], [ "t_dirt", 2 ], [ "t_underbrush", 1 ] ], "C": "t_floor", "D": "t_door_metal_c", "H": "t_floor", @@ -234,10 +307,102 @@ "t": "t_floor", "v": "t_floor", "{": "t_floor", - "|": "t_wall" + "|": "t_wall", + "<": "t_stairs_up", + "!": "t_gutter_downspout", + "7": "t_carpet_green" } }, - "om_terrain": "music_venue", + "om_terrain": "music_venue_1", + "type": "mapgen", + "weight": 100 + }, + { + "method": "json", + "object": { + "fill_ter": "t_flat_roof", + "rows": [ + " ", + " wnnnnnnnnnnn...nnne ", + " w.................e ", + " w.................e ", + " w.................e ", + " w.&...............e ", + " w.................e ", + " w.&...............e ", + " w.................e ", + " w.................e ", + " w.................e ", + " w.................e ", + " w.................e ", + " w.................e ", + " w.................e ", + " w.................e ", + " w.................e ", + " w...............|+| ", + " w...............|>| ", + " wsdsssssssssssw.||| ", + " w.e ", + " w.e ", + " wse ", + " " + ], + "terrain": { + " ": "t_open_air", + ".": "t_flat_roof", + "n": "t_gutter_north", + "e": "t_gutter_east", + "s": "t_gutter_south", + "w": "t_gutter_west", + "|": "t_wall", + "+": "t_door_c", + ">": "t_stairs_down", + "d": "t_gutter_downspout" + }, + "furniture": { "&": "f_roof_turbine_vent" }, + "place_items": [ { "item": "roof_trash", "x": [ 4, 18 ], "y": [ 2, 17 ], "chance": 50, "repeat": [ 1, 3 ] } ], + "place_nested": [ + { "chunks": [ [ "roof_2x2_utilities", 50 ] ], "x": 17, "y": 3 }, + { "chunks": [ [ "null", 70 ], [ "roof_6x6_survivor", 5 ] ], "x": [ 6, 17 ], "y": 8 } + ] + }, + "om_terrain": "music_venue_1_roof", + "type": "mapgen", + "weight": 100 + }, + { + "method": "json", + "object": { + "fill_ter": "t_flat_roof", + "rows": [ + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ... ", + " ... ", + " ... ", + " ", + " ", + " ", + " " + ], + "terrain": { " ": "t_open_air", ".": "t_flat_roof" } + }, + "om_terrain": "music_venue_1_roof_top", "type": "mapgen", "weight": 100 } diff --git a/data/json/mapgen/musicstore.json b/data/json/mapgen/musicstore.json index e3515779a04e7..913085b5bd675 100644 --- a/data/json/mapgen/musicstore.json +++ b/data/json/mapgen/musicstore.json @@ -19,6 +19,7 @@ { "item": "tuba", "prob": 25 }, { "item": "ukulele", "prob": 50 }, { "item": "violin", "prob": 90 }, + { "item": "guitar_electric", "prob": 90 }, { "collection": [ { "item": "case_violin" }, { "item": "tommygun" }, { "item": "grip" }, { "item": "thompson_drum" } ], "prob": 15 @@ -45,7 +46,7 @@ { "id": "mussto_stringinst", "type": "item_group", - "items": [ [ "acoustic_guitar", 100 ], [ "violin", 80 ], [ "ukulele", 90 ], [ "banjo", 100 ] ] + "items": [ [ "acoustic_guitar", 100 ], [ "violin", 80 ], [ "ukulele", 90 ], [ "banjo", 100 ], [ "guitar_electric", 100 ] ] }, { "id": "light_reading", @@ -85,12 +86,12 @@ "_|...######..........C|_", "_|...######...........|_", "_8...........|+-|+-|+-|_", - "_8E..rrrrrr..|..|..|..8_", - "_8c..rrrrrr..|..|..|..8_", - "_|...........|Ec|Ec|Ec|_", + "_8E..rrrrrr..|g7|gg|gg8_", + "_8c..rrrrrr..|gg|gg|gg8_", + "_|...........|Kh|Kh|Kh|_", "_|D---D|D-55----------|_", "_|.S|S.|sssssss12_z_____", - "_|T#|#T|________________", + "_|T#|#T|<_______________", "_-H---H-________________", "________________________" ], @@ -124,6 +125,11 @@ "w": "t_linoleum_gray", "y": "t_linoleum_gray", "z": "t_shrub", + "g": "t_carpet_green", + "h": "t_carpet_green", + "K": "t_carpet_green", + "7": "t_carpet_green", + "<": "t_gutter_downspout", "|": "t_wall" }, "furniture": { @@ -134,6 +140,9 @@ "^": "f_indoor_plant", "c": "f_chair", "d": "f_dumpster", + "h": "f_chair", + "K": "f_desk", + "7": "f_speaker_cabinet", "r": "f_rack" }, "vendingmachines": { "1": { "item_group": "vending_drink" }, "2": { "item_group": "vending_food" } }, @@ -146,7 +155,68 @@ { "group": "mussto_stringinst", "x": [ 5, 10 ], "y": 16, "chance": 30, "repeat": [ 1, 2 ] }, { "group": "mussto_windinst", "x": [ 5, 10 ], "y": 17, "chance": 40, "repeat": [ 1, 2 ] }, { "group": "light_reading", "x": [ 13, 14 ], "y": [ 10, 12 ], "chance": 70, "repeat": [ 2, 4 ] }, - { "group": "musicstore_showpiece", "x": 21, "y": 8, "chance": 95 } + { "group": "musicstore_showpiece", "x": 21, "y": 8, "chance": 95 }, + { "item": "amplifier_head", "x": 15, "y": [ 16, 17 ], "chance": 50 }, + { "item": "amplifier_head", "x": 18, "y": [ 16, 17 ], "chance": 10 }, + { "item": "amplifier_head", "x": 21, "y": [ 16, 17 ], "chance": 10 } + ], + "place_furniture": [ + { "furn": "f_speaker_cabinet", "x": 15, "y": 17, "chance": 5 }, + { "furn": "f_speaker_cabinet", "x": 18, "y": [ 16, 17 ], "chance": 10 }, + { "furn": "f_speaker_cabinet", "x": 21, "y": [ 16, 17 ], "chance": 10 } + ] + } + }, + { + "type": "mapgen", + "method": "json", + "om_terrain": [ "s_music_roof" ], + "weight": 180, + "object": { + "fill_ter": "t_flat_roof", + "rows": [ + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " wnnnnnnnnnnnnnnnnnnnne ", + " w....................e ", + " w....................e ", + " w....................e ", + " w....................e ", + " w....................e ", + " w....................e ", + " w....................e ", + " w....................e ", + " w....................e ", + " w....................e ", + " w.&..................e ", + " w.....esssssssssssssse ", + " w.....e ", + " w.....d ", + " wssssse ", + " " + ], + "terrain": { + " ": "t_open_air", + ".": "t_flat_roof", + "n": "t_gutter_north", + "e": "t_gutter_east", + "s": "t_gutter_south", + "w": "t_gutter_west", + "d": "t_gutter_downspout" + }, + "furniture": { "&": "f_roof_turbine_vent" }, + "place_items": [ { "item": "roof_trash", "x": [ 2, 21 ], "y": [ 9, 18 ], "chance": 50, "repeat": [ 1, 3 ] } ], + "place_nested": [ + { + "chunks": [ [ "null", 5 ], [ "roof_2x2_utilities_d", 30 ], [ "roof_2x2_utilities", 50 ], [ "roof_6x6_survivor", 5 ] ], + "x": [ 3, 20 ], + "y": [ 10, 17 ] + } ] } } diff --git a/data/json/mapgen/nested/city_npc_nested_spawns.json b/data/json/mapgen/nested/city_npc_nested_spawns.json index 5b1b09af17681..61b0a4f6c3b95 100644 --- a/data/json/mapgen/nested/city_npc_nested_spawns.json +++ b/data/json/mapgen/nested/city_npc_nested_spawns.json @@ -71,5 +71,66 @@ "t": { "item": "cannedfood", "chance": 100, "repeat": [ 2, 3 ] } } } + }, + { + "type": "mapgen", + "method": "json", + "nested_mapgen_id": "foodperson_break_room", + "object": { + "mapgensize": [ 9, 9 ], + "rows": [ + "WWWWWWWWW", + ",,sWh,,sW", + ",,,WT,,,W", + "WDWWWWDWW", + ",,bWl,,bW", + ",,bWl,,bW", + "WDWWWWDWW", + ",,,M@,,,W", + ",,,,,,,aW" + ], + "terrain": { "W": "t_wall_p", "D": "t_door_c", ",": "t_floor" }, + "toilets": { "T": { } }, + "furniture": { + "l": "f_locker", + "b": "f_bench", + "h": "f_shower", + "s": "f_sink", + "M": "f_bigmirror", + "@": "f_mannequin", + "a": "f_armchair" + }, + "place_nested": [ { "chunks": [ [ "foodperson_barred_bathroom", 20 ], [ "null", 80 ] ], "x": 3, "y": 1 } ], + "place_npcs": [ { "chance": 100, "class": "true_foodperson", "x": 4, "y": 8 } ] + } + }, + { + "type": "mapgen", + "method": "json", + "nested_mapgen_id": "foodperson_barred_bathroom", + "object": { + "mapgensize": [ 6, 6 ], + "rows": [ + "Wh,,sW", + "WT,,,W", + "WWWDWW", + "Wl,,bW", + "Wl,,bW", + "WWWXWW" + ], + "terrain": { "W": "t_wall_p", "D": "t_door_c", "X": "t_rdoor_boarded", ",": "t_floor" }, + "toilets": { "T": { } }, + "furniture": { "l": "f_locker", "b": "f_bench", "h": "f_shower", "s": "f_sink" }, + "place_loot": [ + { "item": "corpse", "x": 0, "y": [ 0, 1 ], "repeat": 3, "chance": 100 }, + { "item": "foodperson_mask", "x": 0, "y": [ 0, 1 ], "repeat": 3, "chance": 100 }, + { "item": "cape_fp", "x": 0, "y": [ 0, 1 ], "repeat": 3, "chance": 100 }, + { "item": "chestguard_hard", "x": 0, "y": [ 0, 1 ], "repeat": 3, "chance": 100 }, + { "item": "legguard_hard", "x": 0, "y": [ 0, 1 ], "repeat": 3, "chance": 100 }, + { "item": "armguard_hard", "x": 0, "y": [ 0, 1 ], "repeat": 3, "chance": 100 }, + { "item": "gloves_rubber", "x": 0, "y": [ 0, 1 ], "repeat": 3, "chance": 100 }, + { "item": "boots_rubber", "x": 0, "y": [ 0, 1 ], "repeat": 3, "chance": 100 } + ] + } } ] diff --git a/data/json/mapgen/nested/lmoe_nested.json b/data/json/mapgen/nested/lmoe_nested.json new file mode 100644 index 0000000000000..86c687df753bb --- /dev/null +++ b/data/json/mapgen/nested/lmoe_nested.json @@ -0,0 +1,73 @@ +[ + { + "type": "mapgen", + "method": "json", + "nested_mapgen_id": "lmoe3_storage_11x11", + "//": "This is done in a nested map to make the flooring under the furniture look right, nothing much else.", + "object": { + "mapgensize": [ 11, 11 ], + "fill_ter": "t_metal_floor", + "rows": [ + "lllll|#####", + "u___U|#####", + "u_u_U|#####", + "u_u_U|#####", + "u_u_U|#####", + "u_u_U|#####", + "__v_U|#####", + "u_v_U|#####", + "u_v_U|#####", + "u___U|#####", + "AV_VU|#####" + ], + "palettes": [ "bunker", "empty_bunker_items" ] + } + }, + { + "type": "mapgen", + "method": "json", + "nested_mapgen_id": "lmoe3_tankroom_11x11", + "//": "This is done in a nested map to make the flooring under the furniture look right, nothing much else.", + "object": { + "mapgensize": [ 11, 11 ], + "fill_ter": "t_metal_floor", + "rows": [ + "_{|l__aa|{_", + "_{|l__aa||+", + "_{|l____ll_", + "_{|l_______", + "__+________", + "|||||||||||", + "###########", + "###########", + "###########", + "###########", + "###########" + ], + "palettes": [ "bunker", "empty_bunker_items" ] + } + }, + { + "type": "mapgen", + "method": "json", + "nested_mapgen_id": "lmoe3_crafting_11x11", + "//": "This is done in a nested map to make the flooring under the furniture look right, nothing much else.", + "object": { + "mapgensize": [ 10, 10 ], + "fill_ter": "t_metal_floor", + "rows": [ + "l__RRRR=_G", + "l______*_a", + "l_____c=_a", + "__h___c=_l", + "TTTcccc=_A", + "||||||||||", + "##########", + "##########", + "##########", + "##########" + ], + "palettes": [ "bunker", "empty_bunker_items" ] + } + } +] diff --git a/data/json/mapgen/nested/nested_chunks_roof.json b/data/json/mapgen/nested/nested_chunks_roof.json index 34eddd450a461..911440f465e10 100644 --- a/data/json/mapgen/nested/nested_chunks_roof.json +++ b/data/json/mapgen/nested/nested_chunks_roof.json @@ -149,7 +149,8 @@ "__ox" ], "terrain": { "_": "t_concrete", "x": "t_sewage_pipe" }, - "furniture": { "o": "f_water_heater", "a": "f_air_conditioner" } + "furniture": { "o": "f_water_heater", "a": "f_air_conditioner" }, + "liquids": { "o": { "liquid": "water_clean", "amount": [ 0, 100 ] } } } }, { @@ -166,7 +167,8 @@ "UUUU" ], "terrain": { "_": "t_null", "c": "t_chaingate_l", "U": "t_chainfence" }, - "furniture": { "o": "f_water_heater", "a": "f_water_purifier", "A": "f_standing_tank" } + "furniture": { "o": "f_water_heater", "a": "f_water_purifier", "A": "f_standing_tank" }, + "liquids": { "o": { "liquid": "water_clean", "amount": [ 0, 100 ] } } } }, { @@ -185,7 +187,8 @@ "xxxxxx" ], "terrain": { "_": "t_null", "x": "t_sewage_pipe" }, - "furniture": { "o": "f_water_heater", "a": "f_water_purifier", "A": "f_standing_tank" } + "furniture": { "o": "f_water_heater", "a": "f_water_purifier", "A": "f_standing_tank" }, + "liquids": { "o": { "liquid": "water_clean", "amount": [ 0, 100 ] } } } }, { @@ -205,6 +208,33 @@ ] } }, + { + "type": "mapgen", + "method": "json", + "nested_mapgen_id": "roof_2x2_infrastructure", + "object": { + "mapgensize": [ 2, 2 ], + "place_furniture": [ { "furn": "f_vent_pipe", "x": 0, "y": 0 }, { "furn": "f_roof_turbine_vent", "x": 0, "y": 1 } ] + } + }, + { + "type": "mapgen", + "method": "json", + "nested_mapgen_id": "roof_2x2_infrastructure_1", + "object": { + "mapgensize": [ 2, 2 ], + "place_furniture": [ { "furn": "f_small_satelitte_dish", "x": 1, "y": 0 }, { "furn": "f_cellphone_booster", "x": 0, "y": 1 } ] + } + }, + { + "type": "mapgen", + "method": "json", + "nested_mapgen_id": "roof_2x2_infrastructure_2", + "object": { + "mapgensize": [ 2, 2 ], + "place_terrain": [ { "ter": "t_switchgear_s", "x": 0, "y": 0 }, { "ter": "t_sai_box", "x": 0, "y": 1 } ] + } + }, { "type": "mapgen", "method": "json", @@ -352,6 +382,36 @@ "furniture": { "S": "f_statue", "b": "f_bench" } } }, + { + "type": "mapgen", + "method": "json", + "nested_mapgen_id": "roof_6x6_greenhouse_3", + "object": { + "mapgensize": [ 6, 6 ], + "rotation": [ 0, 2 ], + "rows": [ + "%#++#%", + "%1__1%", + "#1a_1#", + "#1__1#", + "%1_a1%", + "%#++#%" + ], + "terrain": { + "_": "t_null", + "#": "t_reinforced_glass_shutter_open", + "+": "t_reinforced_door_glass_c", + "%": "t_reinforced_glass_shutter", + "$": "t_wall_glass" + }, + "furniture": { "a": "f_stool" }, + "place_loot": [ + { "item": "stepladder", "x": 3, "y": 5, "chance": 75, "repeat": [ 1, 3 ] }, + { "item": "seed_weed", "x": [ 2, 3 ], "y": [ 2, 3 ], "chance": 75, "repeat": [ 1, 3 ] } + ], + "sealed_item": { "1": { "item": { "item": "seed_weed" }, "furniture": "f_planter_harvest" } } + } + }, { "type": "mapgen", "method": "json", @@ -396,6 +456,7 @@ "type": "mapgen", "method": "json", "nested_mapgen_id": "roof_6x6_garden_3", + "//": "herb garden", "object": { "mapgensize": [ 6, 6 ], "rotation": [ 0, 3 ], @@ -415,5 +476,25 @@ "4": { "item": { "item": "seed_mugwort" }, "furniture": "f_planter_harvest" } } } + }, + { + "type": "mapgen", + "method": "json", + "nested_mapgen_id": "roof_6x6_garden_4", + "//": "zen garden.", + "object": { + "mapgensize": [ 6, 6 ], + "rotation": [ 0, 3 ], + "rows": [ + "bb__bb", + "b2222b", + "_22G2_", + "_2G22_", + "b2222b", + "bb__bb" + ], + "terrain": { "_": "t_railroad_rubble", "b": "t_railroad_rubble", "2": "t_sandbox", "G": "t_sandbox" }, + "furniture": { "G": [ "f_boulder_medium", "f_boulder_large" ], "b": "f_bench" } + } } ] diff --git a/data/json/mapgen/refugee_center/rc_grounds_e.json b/data/json/mapgen/refugee_center/rc_grounds_e.json new file mode 100644 index 0000000000000..37d213cee93d7 --- /dev/null +++ b/data/json/mapgen/refugee_center/rc_grounds_e.json @@ -0,0 +1,260 @@ +[ + { + "type": "mapgen", + "method": "json", + "om_terrain": [ [ "refctr_E1a", "refctr_E2a", "refctr_E3a", "refctr_E4a", "refctr_E5a" ] ], + "weight": 100, + "object": { + "fill_ter": "t_grass", + "rows": [ + "......................................................................................................................|.", + "......................................................................................................................|.", + "......................................................................................................................|.", + "......................................................................................................................|.", + "......................................................................................................................|.", + "......................................................................................................................|.", + "......................................................................................................................|.", + "......................................................................................................................|.", + "......................................................................................................................|.", + "......................................................................................................................|.", + "......................................................................................................................|.", + "......................................................................................................................|.", + "......................................................................................................................|.", + "......................................................................................................................|.", + "......................................................................................................................|.", + "......................................................................................................................|.", + "......................................................................................................................|.", + "......................................................................................................................|.", + "......................................................................................................................|.", + "......................................................................................................................|.", + "......................................................................................................................|.", + "......................................................................................................................|.", + "......................................................................................................................|.", + "......................................................................................................................|." + ], + "palettes": [ "rc_grounds" ] + } + }, + { + "type": "mapgen", + "method": "json", + "om_terrain": [ [ "refctr_E1b", "refctr_E2b", "refctr_E3b", "refctr_E4b", "refctr_E5b" ] ], + "weight": 100, + "object": { + "fill_ter": "t_grass", + "rows": [ + "......................................................................................................................|.", + "......................................................................................................................|.", + "......................................................................................................................|.", + "......................................................................................................................|.", + "......................................................................................................................|.", + "......................................................................................................................|.", + "......................................................................................................................|.", + "......................................................................................................................|.", + "......................................................................................................................|.", + "......................................................................................................................|.", + "......................................................................................................................|.", + "......................................................................................................................|.", + "......................................................................................................................|.", + "......................................................................................................................|.", + "......................................................................................................................|.", + "......................................................................................................................|.", + "......................................................................................................................|.", + "......................................................................................................................|.", + "......................................................................................................................|.", + "......................................................................................................................|.", + "......................................................................................................................|.", + "......................................................................................................................|.", + "......................................................................................................................|.", + "......................................................................................................................|." + ], + "palettes": [ "rc_grounds" ] + } + }, + { + "type": "mapgen", + "method": "json", + "om_terrain": [ [ "refctr_E1c", "refctr_E2c", "refctr_E3c", "refctr_E4c", "refctr_E5c" ] ], + "weight": 100, + "object": { + "fill_ter": "t_grass", + "rows": [ + "......................................................................................................................|.", + "......................................................................................................................|.", + "......................................................................................................................|.", + "......................................................................................................................|.", + "......................................................................................................................|.", + "......................................................................................................................|.", + "......................................................................................................................|.", + "......................................................................................................................|.", + "......................................................................................................................|.", + "......................................................................................................................|.", + "......................................................................................................................|.", + "......................................................................................................................|.", + "......................................................................................................................|.", + "......................................................................................................................|.", + "......................................................................................................................|.", + "......................................................................................................................|.", + "......................................................................................................................|.", + "......................................................................................................................|.", + "......................................................................................................................|.", + "......................................................................................................................|.", + "......................................................................................................................|.", + "......................................................................................................................|.", + "......................................................................................................................|.", + "......................................................................................................................|." + ], + "palettes": [ "rc_grounds" ] + } + }, + { + "type": "mapgen", + "method": "json", + "om_terrain": [ [ "refctr_E1d", "refctr_E2d", "refctr_E3d", "refctr_E4d", "refctr_E5d" ] ], + "weight": 100, + "object": { + "fill_ter": "t_grass", + "rows": [ + "......................................................................................................................|.", + "......................................................................................................................|.", + "......................................................................................................................|.", + "......................................................................................................................|.", + "......................................................................................................................|.", + "......................................................................................................................|.", + "......................................................................................................................|.", + "......................................................................................................................|.", + "......................................................................................................................|.", + "......................................................................................................................|.", + "......................................................................................................................|.", + "......................................................................................................................|.", + "......................................................................................................................|.", + "......................................................................................................................|.", + "......................................................................................................................|.", + "......................................................................................................................|.", + "......................................................................................................................|.", + "......................................................................................................................|.", + "......................................................................................................................|.", + "......................................................................................................................|.", + "......................................................................................................................|.", + "......................................................................................................................|.", + "......................................................................................................................|.", + "......................................................................................................................|." + ], + "palettes": [ "rc_grounds" ] + } + }, + { + "type": "mapgen", + "method": "json", + "om_terrain": [ [ "refctr_E1e", "refctr_E2e", "refctr_E3e", "refctr_E4e", "refctr_E5e" ] ], + "weight": 100, + "object": { + "fill_ter": "t_grass", + "rows": [ + "......................................................................................................................|.", + "......................................................................................................................|.", + "......................................................................................................................|.", + "......................................................................................................................|.", + "......................................................................................................................|.", + "......................................................................................................................|.", + "......................................................................................................................|.", + "......................................................................................................................|.", + "......................................................................................................................|.", + "......................................................................................................................|.", + "......................................................................................................................|.", + "......................................................................................................................|.", + "......................................................................................................................|.", + "......................................................................................................................|.", + "......................................................................................................................|.", + "......................................................................................................................|.", + "......................................................................................................................|.", + "......................................................................................................................|.", + "......................................................................................................................|.", + "......................................................................................................................|.", + "......................................................................................................................|.", + "......................................................................................................................|.", + "......................................................................................................................|.", + "......................................................................................................................|." + ], + "palettes": [ "rc_grounds" ] + } + }, + { + "type": "mapgen", + "method": "json", + "om_terrain": [ + [ "refctr_E1a_z2", "refctr_E2a_z2", "refctr_E3a_z2", "refctr_E4a_z2", "refctr_E5a_z2" ], + [ "refctr_E1b_z2", "refctr_E2b_z2", "refctr_E3b_z2", "refctr_E4b_z2", "refctr_E5b_z2" ], + [ "refctr_E1c_z2", "refctr_E2c_z2", "refctr_E3c_z2", "refctr_E4c_z2", "refctr_E5c_z2" ], + [ "refctr_E1d_z2", "refctr_E2d_z2", "refctr_E3d_z2", "refctr_E4d_z2", "refctr_E5d_z2" ], + [ "refctr_E1e_z2", "refctr_E2e_z2", "refctr_E3e_z2", "refctr_E4e_z2", "refctr_E5e_z2" ] + ], + "weight": 100, + "object": { "fill_ter": "t_open_air" } + }, + { + "type": "mapgen", + "method": "json", + "om_terrain": [ + [ "refctr_E1a_z1", "refctr_E2a_z1", "refctr_E3a_z1", "refctr_E4a_z1", "refctr_E5a_z1" ], + [ "refctr_E1b_z1", "refctr_E2b_z1", "refctr_E3b_z1", "refctr_E4b_z1", "refctr_E5b_z1" ], + [ "refctr_E1c_z1", "refctr_E2c_z1", "refctr_E3c_z1", "refctr_E4c_z1", "refctr_E5c_z1" ], + [ "refctr_E1d_z1", "refctr_E2d_z1", "refctr_E3d_z1", "refctr_E4d_z1", "refctr_E5d_z1" ], + [ "refctr_E1e_z1", "refctr_E2e_z1", "refctr_E3e_z1", "refctr_E4e_z1", "refctr_E5e_z1" ] + ], + "weight": 100, + "object": { "fill_ter": "t_open_air" } + }, + { + "type": "mapgen", + "method": "json", + "om_terrain": [ + [ "refctr_E1a_z-1", "refctr_E2a_z-1", "refctr_E3a_z-1", "refctr_E4a_z-1", "refctr_E5a_z-1" ], + [ "refctr_E1b_z-1", "refctr_E2b_z-1", "refctr_E3b_z-1", "refctr_E4b_z-1", "refctr_E5b_z-1" ], + [ "refctr_E1c_z-1", "refctr_E2c_z-1", "refctr_E3c_z-1", "refctr_E4c_z-1", "refctr_E5c_z-1" ], + [ "refctr_E1d_z-1", "refctr_E2d_z-1", "refctr_E3d_z-1", "refctr_E4d_z-1", "refctr_E5d_z-1" ], + [ "refctr_E1e_z-1", "refctr_E2e_z-1", "refctr_E3e_z-1", "refctr_E4e_z-1", "refctr_E5e_z-1" ] + ], + "weight": 100, + "object": { "fill_ter": "t_rock" } + }, + { + "type": "mapgen", + "method": "json", + "om_terrain": [ + [ "refctr_E1a_z-2", "refctr_E2a_z-2", "refctr_E3a_z-2", "refctr_E4a_z-2", "refctr_E5a_z-2" ], + [ "refctr_E1b_z-2", "refctr_E2b_z-2", "refctr_E3b_z-2", "refctr_E4b_z-2", "refctr_E5b_z-2" ], + [ "refctr_E1c_z-2", "refctr_E2c_z-2", "refctr_E3c_z-2", "refctr_E4c_z-2", "refctr_E5c_z-2" ], + [ "refctr_E1d_z-2", "refctr_E2d_z-2", "refctr_E3d_z-2", "refctr_E4d_z-2", "refctr_E5d_z-2" ], + [ "refctr_E1e_z-2", "refctr_E2e_z-2", "refctr_E3e_z-2", "refctr_E4e_z-2", "refctr_E5e_z-2" ] + ], + "weight": 100, + "object": { "fill_ter": "t_rock" } + }, + { + "type": "mapgen", + "method": "json", + "om_terrain": [ + [ "refctr_E1a_z-3", "refctr_E2a_z-3", "refctr_E3a_z-3", "refctr_E4a_z-3", "refctr_E5a_z-3" ], + [ "refctr_E1b_z-3", "refctr_E2b_z-3", "refctr_E3b_z-3", "refctr_E4b_z-3", "refctr_E5b_z-3" ], + [ "refctr_E1c_z-3", "refctr_E2c_z-3", "refctr_E3c_z-3", "refctr_E4c_z-3", "refctr_E5c_z-3" ], + [ "refctr_E1d_z-3", "refctr_E2d_z-3", "refctr_E3d_z-3", "refctr_E4d_z-3", "refctr_E5d_z-3" ], + [ "refctr_E1e_z-3", "refctr_E2e_z-3", "refctr_E3e_z-3", "refctr_E4e_z-3", "refctr_E5e_z-3" ] + ], + "weight": 100, + "object": { "fill_ter": "t_rock" } + }, + { + "type": "mapgen", + "method": "json", + "om_terrain": [ + [ "refctr_E1a_z-4", "refctr_E2a_z-4", "refctr_E3a_z-4", "refctr_E4a_z-4", "refctr_E5a_z-4" ], + [ "refctr_E1b_z-4", "refctr_E2b_z-4", "refctr_E3b_z-4", "refctr_E4b_z-4", "refctr_E5b_z-4" ], + [ "refctr_E1c_z-4", "refctr_E2c_z-4", "refctr_E3c_z-4", "refctr_E4c_z-4", "refctr_E5c_z-4" ], + [ "refctr_E1d_z-4", "refctr_E2d_z-4", "refctr_E3d_z-4", "refctr_E4d_z-4", "refctr_E5d_z-4" ], + [ "refctr_E1e_z-4", "refctr_E2e_z-4", "refctr_E3e_z-4", "refctr_E4e_z-4", "refctr_E5e_z-4" ] + ], + "weight": 100, + "object": { "fill_ter": "t_rock" } + } +] diff --git a/data/json/mapgen/refugee_center/rc_grounds_n.json b/data/json/mapgen/refugee_center/rc_grounds_n.json new file mode 100644 index 0000000000000..3b3c840969095 --- /dev/null +++ b/data/json/mapgen/refugee_center/rc_grounds_n.json @@ -0,0 +1,260 @@ +[ + { + "type": "mapgen", + "method": "json", + "om_terrain": [ [ "refctr_N1a", "refctr_N2a", "refctr_N3a", "refctr_N4a", "refctr_N5a" ] ], + "weight": 100, + "object": { + "fill_ter": "t_grass", + "rows": [ + "........................................................................................................................", + "||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||", + "........................................................................................................................", + "........................................................................................................................", + "........................................................................................................................", + "........................................................................................................................", + "........................................................................................................................", + "........................................................................................................................", + "........................................................................................................................", + "........................................................................................................................", + "........................................................................................................................", + "........................................................................................................................", + "........................................................................................................................", + "........................................................................................................................", + "........................................................................................................................", + "........................................................................................................................", + "........................................................................................................................", + "........................................................................................................................", + "........................................................................................................................", + "........................................................................................................................", + "........................................................................................................................", + "........................................................................................................................", + "........................................................................................................................", + "........................................................................................................................" + ], + "palettes": [ "rc_grounds" ] + } + }, + { + "type": "mapgen", + "method": "json", + "om_terrain": [ [ "refctr_N1b", "refctr_N2b", "refctr_N3b", "refctr_N4b", "refctr_N5b" ] ], + "weight": 100, + "object": { + "fill_ter": "t_grass", + "rows": [ + "........................................................................................................................", + "........................................................................................................................", + "........................................................................................................................", + "........................................................................................................................", + "........................................................................................................................", + "........................................................................................................................", + "........................................................................................................................", + "........................................................................................................................", + "........................................................................................................................", + "........................................................................................................................", + "........................................................................................................................", + "........................................................................................................................", + "........................................................................................................................", + "........................................................................................................................", + "........................................................................................................................", + "........................................................................................................................", + "........................................................................................................................", + "........................................................................................................................", + "........................................................................................................................", + "........................................................................................................................", + "........................................................................................................................", + "........................................................................................................................", + "........................................................................................................................", + "........................................................................................................................" + ], + "palettes": [ "rc_grounds" ] + } + }, + { + "type": "mapgen", + "method": "json", + "om_terrain": [ [ "refctr_N1c", "refctr_N2c", "refctr_N3c", "refctr_N4c", "refctr_N5c" ] ], + "weight": 100, + "object": { + "fill_ter": "t_grass", + "rows": [ + "........................................................................................................................", + "........................................................................................................................", + "........................................................................................................................", + "........................................................................................................................", + "........................................................................................................................", + "........................................................................................................................", + "........................................................................................................................", + "........................................................................................................................", + "........................................................................................................................", + "........................................................................................................................", + "........................................................................................................................", + "........................................................................................................................", + "........................................................................................................................", + "........................................................................................................................", + "........................................................................................................................", + "........................................................................................................................", + "........................................................................................................................", + "........................................................................................................................", + "........................................................................................................................", + "........................................................................................................................", + "........................................................................................................................", + "........................................................................................................................", + "........................................................................................................................", + "........................................................................................................................" + ], + "palettes": [ "rc_grounds" ] + } + }, + { + "type": "mapgen", + "method": "json", + "om_terrain": [ [ "refctr_N1d", "refctr_N2d", "refctr_N3d", "refctr_N4d", "refctr_N5d" ] ], + "weight": 100, + "object": { + "fill_ter": "t_grass", + "rows": [ + "........................................................................................................................", + "........................................................................................................................", + "........................................................................................................................", + "........................................................................................................................", + "........................................................................................................................", + "........................................................................................................................", + "........................................................................................................................", + "........................................................................................................................", + "........................................................................................................................", + "........................................................................................................................", + "........................................................................................................................", + "........................................................................................................................", + "........................................................................................................................", + "........................................................................................................................", + "........................................................................................................................", + "........................................................................................................................", + "........................................................................................................................", + "........................................................................................................................", + "........................................................................................................................", + "........................................................................................................................", + "........................................................................................................................", + "........................................................................................................................", + "........................................................................................................................", + "........................................................................................................................" + ], + "palettes": [ "rc_grounds" ] + } + }, + { + "type": "mapgen", + "method": "json", + "om_terrain": [ [ "refctr_N1e", "refctr_N2e", "refctr_N3e", "refctr_N4e", "refctr_N5e" ] ], + "weight": 100, + "object": { + "fill_ter": "t_grass", + "rows": [ + "........................................................................................................................", + "........................................................................................................................", + "........................................................................................................................", + "........................................................................................................................", + "........................................................................................................................", + "........................................................................................................................", + "........................................................................................................................", + "........................................................................................................................", + "........................................................................................................................", + "........................................................................................................................", + "........................................................................................................................", + "........................................................................................................................", + "........................................................................................................................", + "........................................................................................................................", + "........................................................................................................................", + "........................................................................................................................", + "........................................................................................................................", + "........................................................................................................................", + "........................................................................................................................", + "........................................................................................................................", + "........................................................................................................................", + "........................................................................................................................", + "........................................................................................................................", + "........................................................................................................................" + ], + "palettes": [ "rc_grounds" ] + } + }, + { + "type": "mapgen", + "method": "json", + "om_terrain": [ + [ "refctr_N1a_z2", "refctr_N2a_z2", "refctr_N3a_z2", "refctr_N4a_z2", "refctr_N5a_z2" ], + [ "refctr_N1b_z2", "refctr_N2b_z2", "refctr_N3b_z2", "refctr_N4b_z2", "refctr_N5b_z2" ], + [ "refctr_N1c_z2", "refctr_N2c_z2", "refctr_N3c_z2", "refctr_N4c_z2", "refctr_N5c_z2" ], + [ "refctr_N1d_z2", "refctr_N2d_z2", "refctr_N3d_z2", "refctr_N4d_z2", "refctr_N5d_z2" ], + [ "refctr_N1e_z2", "refctr_N2e_z2", "refctr_N3e_z2", "refctr_N4e_z2", "refctr_N5e_z2" ] + ], + "weight": 100, + "object": { "fill_ter": "t_open_air" } + }, + { + "type": "mapgen", + "method": "json", + "om_terrain": [ + [ "refctr_N1a_z1", "refctr_N2a_z1", "refctr_N3a_z1", "refctr_N4a_z1", "refctr_N5a_z1" ], + [ "refctr_N1b_z1", "refctr_N2b_z1", "refctr_N3b_z1", "refctr_N4b_z1", "refctr_N5b_z1" ], + [ "refctr_N1c_z1", "refctr_N2c_z1", "refctr_N3c_z1", "refctr_N4c_z1", "refctr_N5c_z1" ], + [ "refctr_N1d_z1", "refctr_N2d_z1", "refctr_N3d_z1", "refctr_N4d_z1", "refctr_N5d_z1" ], + [ "refctr_N1e_z1", "refctr_N2e_z1", "refctr_N3e_z1", "refctr_N4e_z1", "refctr_N5e_z1" ] + ], + "weight": 100, + "object": { "fill_ter": "t_open_air" } + }, + { + "type": "mapgen", + "method": "json", + "om_terrain": [ + [ "refctr_N1a_z-1", "refctr_N2a_z-1", "refctr_N3a_z-1", "refctr_N4a_z-1", "refctr_N5a_z-1" ], + [ "refctr_N1b_z-1", "refctr_N2b_z-1", "refctr_N3b_z-1", "refctr_N4b_z-1", "refctr_N5b_z-1" ], + [ "refctr_N1c_z-1", "refctr_N2c_z-1", "refctr_N3c_z-1", "refctr_N4c_z-1", "refctr_N5c_z-1" ], + [ "refctr_N1d_z-1", "refctr_N2d_z-1", "refctr_N3d_z-1", "refctr_N4d_z-1", "refctr_N5d_z-1" ], + [ "refctr_N1e_z-1", "refctr_N2e_z-1", "refctr_N3e_z-1", "refctr_N4e_z-1", "refctr_N5e_z-1" ] + ], + "weight": 100, + "object": { "fill_ter": "t_rock" } + }, + { + "type": "mapgen", + "method": "json", + "om_terrain": [ + [ "refctr_N1a_z-2", "refctr_N2a_z-2", "refctr_N3a_z-2", "refctr_N4a_z-2", "refctr_N5a_z-2" ], + [ "refctr_N1b_z-2", "refctr_N2b_z-2", "refctr_N3b_z-2", "refctr_N4b_z-2", "refctr_N5b_z-2" ], + [ "refctr_N1c_z-2", "refctr_N2c_z-2", "refctr_N3c_z-2", "refctr_N4c_z-2", "refctr_N5c_z-2" ], + [ "refctr_N1d_z-2", "refctr_N2d_z-2", "refctr_N3d_z-2", "refctr_N4d_z-2", "refctr_N5d_z-2" ], + [ "refctr_N1e_z-2", "refctr_N2e_z-2", "refctr_N3e_z-2", "refctr_N4e_z-2", "refctr_N5e_z-2" ] + ], + "weight": 100, + "object": { "fill_ter": "t_rock" } + }, + { + "type": "mapgen", + "method": "json", + "om_terrain": [ + [ "refctr_N1a_z-3", "refctr_N2a_z-3", "refctr_N3a_z-3", "refctr_N4a_z-3", "refctr_N5a_z-3" ], + [ "refctr_N1b_z-3", "refctr_N2b_z-3", "refctr_N3b_z-3", "refctr_N4b_z-3", "refctr_N5b_z-3" ], + [ "refctr_N1c_z-3", "refctr_N2c_z-3", "refctr_N3c_z-3", "refctr_N4c_z-3", "refctr_N5c_z-3" ], + [ "refctr_N1d_z-3", "refctr_N2d_z-3", "refctr_N3d_z-3", "refctr_N4d_z-3", "refctr_N5d_z-3" ], + [ "refctr_N1e_z-3", "refctr_N2e_z-3", "refctr_N3e_z-3", "refctr_N4e_z-3", "refctr_N5e_z-3" ] + ], + "weight": 100, + "object": { "fill_ter": "t_rock" } + }, + { + "type": "mapgen", + "method": "json", + "om_terrain": [ + [ "refctr_N1a_z-4", "refctr_N2a_z-4", "refctr_N3a_z-4", "refctr_N4a_z-4", "refctr_N5a_z-4" ], + [ "refctr_N1b_z-4", "refctr_N2b_z-4", "refctr_N3b_z-4", "refctr_N4b_z-4", "refctr_N5b_z-4" ], + [ "refctr_N1c_z-4", "refctr_N2c_z-4", "refctr_N3c_z-4", "refctr_N4c_z-4", "refctr_N5c_z-4" ], + [ "refctr_N1d_z-4", "refctr_N2d_z-4", "refctr_N3d_z-4", "refctr_N4d_z-4", "refctr_N5d_z-4" ], + [ "refctr_N1e_z-4", "refctr_N2e_z-4", "refctr_N3e_z-4", "refctr_N4e_z-4", "refctr_N5e_z-4" ] + ], + "weight": 100, + "object": { "fill_ter": "t_rock" } + } +] diff --git a/data/json/mapgen/refugee_center/rc_grounds_ne.json b/data/json/mapgen/refugee_center/rc_grounds_ne.json new file mode 100644 index 0000000000000..206600739fef9 --- /dev/null +++ b/data/json/mapgen/refugee_center/rc_grounds_ne.json @@ -0,0 +1,260 @@ +[ + { + "type": "mapgen", + "method": "json", + "om_terrain": [ [ "refctr_NE1a", "refctr_NE2a", "refctr_NE3a", "refctr_NE4a", "refctr_NE5a" ] ], + "weight": 100, + "object": { + "fill_ter": "t_grass", + "rows": [ + "........................................................................................................................", + "|||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||.", + "......................................................................................................................|.", + "......................................................................................................................|.", + "......................................................................................................................|.", + "......................................................................................................................|.", + "......................................................................................................................|.", + "......................................................................................................................|.", + "......................................................................................................................|.", + "......................................................................................................................|.", + "......................................................................................................................|.", + "......................................................................................................................|.", + "......................................................................................................................|.", + "......................................................................................................................|.", + "......................................................................................................................|.", + "......................................................................................................................|.", + "......................................................................................................................|.", + "......................................................................................................................|.", + "......................................................................................................................|.", + "......................................................................................................................|.", + "......................................................................................................................|.", + "......................................................................................................................|.", + "......................................................................................................................|.", + "......................................................................................................................|." + ], + "palettes": [ "rc_grounds" ] + } + }, + { + "type": "mapgen", + "method": "json", + "om_terrain": [ [ "refctr_NE1b", "refctr_NE2b", "refctr_NE3b", "refctr_NE4b", "refctr_NE5b" ] ], + "weight": 100, + "object": { + "fill_ter": "t_grass", + "rows": [ + "......................................................................................................................|.", + "......................................................................................................................|.", + "......................................................................................................................|.", + "......................................................................................................................|.", + "......................................................................................................................|.", + "......................................................................................................................|.", + "......................................................................................................................|.", + "......................................................................................................................|.", + "......................................................................................................................|.", + "......................................................................................................................|.", + "......................................................................................................................|.", + "......................................................................................................................|.", + "......................................................................................................................|.", + "......................................................................................................................|.", + "......................................................................................................................|.", + "......................................................................................................................|.", + "......................................................................................................................|.", + "......................................................................................................................|.", + "......................................................................................................................|.", + "......................................................................................................................|.", + "......................................................................................................................|.", + "......................................................................................................................|.", + "......................................................................................................................|.", + "......................................................................................................................|." + ], + "palettes": [ "rc_grounds" ] + } + }, + { + "type": "mapgen", + "method": "json", + "om_terrain": [ [ "refctr_NE1c", "refctr_NE2c", "refctr_NE3c", "refctr_NE4c", "refctr_NE5c" ] ], + "weight": 100, + "object": { + "fill_ter": "t_grass", + "rows": [ + "......................................................................................................................|.", + "......................................................................................................................|.", + "......................................................................................................................|.", + "......................................................................................................................|.", + "......................................................................................................................|.", + "......................................................................................................................|.", + "......................................................................................................................|.", + "......................................................................................................................|.", + "......................................................................................................................|.", + "......................................................................................................................|.", + "......................................................................................................................|.", + "......................................................................................................................|.", + "......................................................................................................................|.", + "......................................................................................................................|.", + "......................................................................................................................|.", + "......................................................................................................................|.", + "......................................................................................................................|.", + "......................................................................................................................|.", + "......................................................................................................................|.", + "......................................................................................................................|.", + "......................................................................................................................|.", + "......................................................................................................................|.", + "......................................................................................................................|.", + "......................................................................................................................|." + ], + "palettes": [ "rc_grounds" ] + } + }, + { + "type": "mapgen", + "method": "json", + "om_terrain": [ [ "refctr_NE1d", "refctr_NE2d", "refctr_NE3d", "refctr_NE4d", "refctr_NE5d" ] ], + "weight": 100, + "object": { + "fill_ter": "t_grass", + "rows": [ + "......................................................................................................................|.", + "......................................................................................................................|.", + "......................................................................................................................|.", + "......................................................................................................................|.", + "......................................................................................................................|.", + "......................................................................................................................|.", + "......................................................................................................................|.", + "......................................................................................................................|.", + "......................................................................................................................|.", + "......................................................................................................................|.", + "......................................................................................................................|.", + "......................................................................................................................|.", + "......................................................................................................................|.", + "......................................................................................................................|.", + "......................................................................................................................|.", + "......................................................................................................................|.", + "......................................................................................................................|.", + "......................................................................................................................|.", + "......................................................................................................................|.", + "......................................................................................................................|.", + "......................................................................................................................|.", + "......................................................................................................................|.", + "......................................................................................................................|.", + "......................................................................................................................|." + ], + "palettes": [ "rc_grounds" ] + } + }, + { + "type": "mapgen", + "method": "json", + "om_terrain": [ [ "refctr_NE1e", "refctr_NE2e", "refctr_NE3e", "refctr_NE4e", "refctr_NE5e" ] ], + "weight": 100, + "object": { + "fill_ter": "t_grass", + "rows": [ + "......................................................................................................................|.", + "......................................................................................................................|.", + "......................................................................................................................|.", + "......................................................................................................................|.", + "......................................................................................................................|.", + "......................................................................................................................|.", + "......................................................................................................................|.", + "......................................................................................................................|.", + "......................................................................................................................|.", + "......................................................................................................................|.", + "......................................................................................................................|.", + "......................................................................................................................|.", + "......................................................................................................................|.", + "......................................................................................................................|.", + "......................................................................................................................|.", + "......................................................................................................................|.", + "......................................................................................................................|.", + "......................................................................................................................|.", + "......................................................................................................................|.", + "......................................................................................................................|.", + "......................................................................................................................|.", + "......................................................................................................................|.", + "......................................................................................................................|.", + "......................................................................................................................|." + ], + "palettes": [ "rc_grounds" ] + } + }, + { + "type": "mapgen", + "method": "json", + "om_terrain": [ + [ "refctr_NE1a_z2", "refctr_NE2a_z2", "refctr_NE3a_z2", "refctr_NE4a_z2", "refctr_NE5a_z2" ], + [ "refctr_NE1b_z2", "refctr_NE2b_z2", "refctr_NE3b_z2", "refctr_NE4b_z2", "refctr_NE5b_z2" ], + [ "refctr_NE1c_z2", "refctr_NE2c_z2", "refctr_NE3c_z2", "refctr_NE4c_z2", "refctr_NE5c_z2" ], + [ "refctr_NE1d_z2", "refctr_NE2d_z2", "refctr_NE3d_z2", "refctr_NE4d_z2", "refctr_NE5d_z2" ], + [ "refctr_NE1e_z2", "refctr_NE2e_z2", "refctr_NE3e_z2", "refctr_NE4e_z2", "refctr_NE5e_z2" ] + ], + "weight": 100, + "object": { "fill_ter": "t_open_air" } + }, + { + "type": "mapgen", + "method": "json", + "om_terrain": [ + [ "refctr_NE1a_z1", "refctr_NE2a_z1", "refctr_NE3a_z1", "refctr_NE4a_z1", "refctr_NE5a_z1" ], + [ "refctr_NE1b_z1", "refctr_NE2b_z1", "refctr_NE3b_z1", "refctr_NE4b_z1", "refctr_NE5b_z1" ], + [ "refctr_NE1c_z1", "refctr_NE2c_z1", "refctr_NE3c_z1", "refctr_NE4c_z1", "refctr_NE5c_z1" ], + [ "refctr_NE1d_z1", "refctr_NE2d_z1", "refctr_NE3d_z1", "refctr_NE4d_z1", "refctr_NE5d_z1" ], + [ "refctr_NE1e_z1", "refctr_NE2e_z1", "refctr_NE3e_z1", "refctr_NE4e_z1", "refctr_NE5e_z1" ] + ], + "weight": 100, + "object": { "fill_ter": "t_open_air" } + }, + { + "type": "mapgen", + "method": "json", + "om_terrain": [ + [ "refctr_NE1a_z-1", "refctr_NE2a_z-1", "refctr_NE3a_z-1", "refctr_NE4a_z-1", "refctr_NE5a_z-1" ], + [ "refctr_NE1b_z-1", "refctr_NE2b_z-1", "refctr_NE3b_z-1", "refctr_NE4b_z-1", "refctr_NE5b_z-1" ], + [ "refctr_NE1c_z-1", "refctr_NE2c_z-1", "refctr_NE3c_z-1", "refctr_NE4c_z-1", "refctr_NE5c_z-1" ], + [ "refctr_NE1d_z-1", "refctr_NE2d_z-1", "refctr_NE3d_z-1", "refctr_NE4d_z-1", "refctr_NE5d_z-1" ], + [ "refctr_NE1e_z-1", "refctr_NE2e_z-1", "refctr_NE3e_z-1", "refctr_NE4e_z-1", "refctr_NE5e_z-1" ] + ], + "weight": 100, + "object": { "fill_ter": "t_rock" } + }, + { + "type": "mapgen", + "method": "json", + "om_terrain": [ + [ "refctr_NE1a_z-2", "refctr_NE2a_z-2", "refctr_NE3a_z-2", "refctr_NE4a_z-2", "refctr_NE5a_z-2" ], + [ "refctr_NE1b_z-2", "refctr_NE2b_z-2", "refctr_NE3b_z-2", "refctr_NE4b_z-2", "refctr_NE5b_z-2" ], + [ "refctr_NE1c_z-2", "refctr_NE2c_z-2", "refctr_NE3c_z-2", "refctr_NE4c_z-2", "refctr_NE5c_z-2" ], + [ "refctr_NE1d_z-2", "refctr_NE2d_z-2", "refctr_NE3d_z-2", "refctr_NE4d_z-2", "refctr_NE5d_z-2" ], + [ "refctr_NE1e_z-2", "refctr_NE2e_z-2", "refctr_NE3e_z-2", "refctr_NE4e_z-2", "refctr_NE5e_z-2" ] + ], + "weight": 100, + "object": { "fill_ter": "t_rock" } + }, + { + "type": "mapgen", + "method": "json", + "om_terrain": [ + [ "refctr_NE1a_z-3", "refctr_NE2a_z-3", "refctr_NE3a_z-3", "refctr_NE4a_z-3", "refctr_NE5a_z-3" ], + [ "refctr_NE1b_z-3", "refctr_NE2b_z-3", "refctr_NE3b_z-3", "refctr_NE4b_z-3", "refctr_NE5b_z-3" ], + [ "refctr_NE1c_z-3", "refctr_NE2c_z-3", "refctr_NE3c_z-3", "refctr_NE4c_z-3", "refctr_NE5c_z-3" ], + [ "refctr_NE1d_z-3", "refctr_NE2d_z-3", "refctr_NE3d_z-3", "refctr_NE4d_z-3", "refctr_NE5d_z-3" ], + [ "refctr_NE1e_z-3", "refctr_NE2e_z-3", "refctr_NE3e_z-3", "refctr_NE4e_z-3", "refctr_NE5e_z-3" ] + ], + "weight": 100, + "object": { "fill_ter": "t_rock" } + }, + { + "type": "mapgen", + "method": "json", + "om_terrain": [ + [ "refctr_NE1a_z-4", "refctr_NE2a_z-4", "refctr_NE3a_z-4", "refctr_NE4a_z-4", "refctr_NE5a_z-4" ], + [ "refctr_NE1b_z-4", "refctr_NE2b_z-4", "refctr_NE3b_z-4", "refctr_NE4b_z-4", "refctr_NE5b_z-4" ], + [ "refctr_NE1c_z-4", "refctr_NE2c_z-4", "refctr_NE3c_z-4", "refctr_NE4c_z-4", "refctr_NE5c_z-4" ], + [ "refctr_NE1d_z-4", "refctr_NE2d_z-4", "refctr_NE3d_z-4", "refctr_NE4d_z-4", "refctr_NE5d_z-4" ], + [ "refctr_NE1e_z-4", "refctr_NE2e_z-4", "refctr_NE3e_z-4", "refctr_NE4e_z-4", "refctr_NE5e_z-4" ] + ], + "weight": 100, + "object": { "fill_ter": "t_rock" } + } +] diff --git a/data/json/mapgen/refugee_center/rc_grounds_nw.json b/data/json/mapgen/refugee_center/rc_grounds_nw.json new file mode 100644 index 0000000000000..f2f1cd4c1003d --- /dev/null +++ b/data/json/mapgen/refugee_center/rc_grounds_nw.json @@ -0,0 +1,260 @@ +[ + { + "type": "mapgen", + "method": "json", + "om_terrain": [ [ "refctr_NW1a", "refctr_NW2a", "refctr_NW3a", "refctr_NW4a", "refctr_NW5a" ] ], + "weight": 100, + "object": { + "fill_ter": "t_grass", + "rows": [ + "........................................................................................................................", + ".|||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||", + ".|......................................................................................................................", + ".|......................................................................................................................", + ".|......................................................................................................................", + ".|......................................................................................................................", + ".|......................................................................................................................", + ".|......................................................................................................................", + ".|......................................................................................................................", + ".|......................................................................................................................", + ".|......................................................................................................................", + ".|......................................................................................................................", + ".|......................................................................................................................", + ".|......................................................................................................................", + ".|......................................................................................................................", + ".|......................................................................................................................", + ".|......................................................................................................................", + ".|......................................................................................................................", + ".|......................................................................................................................", + ".|......................................................................................................................", + ".|......................................................................................................................", + ".|......................................................................................................................", + ".|......................................................................................................................", + ".|......................................................................................................................" + ], + "palettes": [ "rc_grounds" ] + } + }, + { + "type": "mapgen", + "method": "json", + "om_terrain": [ [ "refctr_NW1b", "refctr_NW2b", "refctr_NW3b", "refctr_NW4b", "refctr_NW5b" ] ], + "weight": 100, + "object": { + "fill_ter": "t_grass", + "rows": [ + ".|......................................................................................................................", + ".|......................................................................................................................", + ".|......................................................................................................................", + ".|......................................................................................................................", + ".|......................................................................................................................", + ".|......................................................................................................................", + ".|......................................................................................................................", + ".|......................................................................................................................", + ".|......................................................................................................................", + ".|......................................................................................................................", + ".|......................................................................................................................", + ".|......................................................................................................................", + ".|......................................................................................................................", + ".|......................................................................................................................", + ".|......................................................................................................................", + ".|......................................................................................................................", + ".|......................................................................................................................", + ".|......................................................................................................................", + ".|......................................................................................................................", + ".|......................................................................................................................", + ".|......................................................................................................................", + ".|......................................................................................................................", + ".|......................................................................................................................", + ".|......................................................................................................................" + ], + "palettes": [ "rc_grounds" ] + } + }, + { + "type": "mapgen", + "method": "json", + "om_terrain": [ [ "refctr_NW1c", "refctr_NW2c", "refctr_NW3c", "refctr_NW4c", "refctr_NW5c" ] ], + "weight": 100, + "object": { + "fill_ter": "t_grass", + "rows": [ + ".|......................................................................................................................", + ".|......................................................................................................................", + ".|......................................................................................................................", + ".|......................................................................................................................", + ".|......................................................................................................................", + ".|......................................................................................................................", + ".|......................................................................................................................", + ".|......................................................................................................................", + ".|......................................................................................................................", + ".|......................................................................................................................", + ".|......................................................................................................................", + ".|......................................................................................................................", + ".|......................................................................................................................", + ".|......................................................................................................................", + ".|......................................................................................................................", + ".|......................................................................................................................", + ".|......................................................................................................................", + ".|......................................................................................................................", + ".|......................................................................................................................", + ".|......................................................................................................................", + ".|......................................................................................................................", + ".|......................................................................................................................", + ".|......................................................................................................................", + ".|......................................................................................................................" + ], + "palettes": [ "rc_grounds" ] + } + }, + { + "type": "mapgen", + "method": "json", + "om_terrain": [ [ "refctr_NW1d", "refctr_NW2d", "refctr_NW3d", "refctr_NW4d", "refctr_NW5d" ] ], + "weight": 100, + "object": { + "fill_ter": "t_grass", + "rows": [ + ".|......................................................................................................................", + ".|......................................................................................................................", + ".|......................................................................................................................", + ".|......................................................................................................................", + ".|......................................................................................................................", + ".|......................................................................................................................", + ".|......................................................................................................................", + ".|......................................................................................................................", + ".|......................................................................................................................", + ".|......................................................................................................................", + ".|......................................................................................................................", + ".|......................................................................................................................", + ".|......................................................................................................................", + ".|......................................................................................................................", + ".|......................................................................................................................", + ".|......................................................................................................................", + ".|......................................................................................................................", + ".|......................................................................................................................", + ".|......................................................................................................................", + ".|......................................................................................................................", + ".|......................................................................................................................", + ".|......................................................................................................................", + ".|......................................................................................................................", + ".|......................................................................................................................" + ], + "palettes": [ "rc_grounds" ] + } + }, + { + "type": "mapgen", + "method": "json", + "om_terrain": [ [ "refctr_NW1e", "refctr_NW2e", "refctr_NW3e", "refctr_NW4e", "refctr_NW5e" ] ], + "weight": 100, + "object": { + "fill_ter": "t_grass", + "rows": [ + ".|......................................................................................................................", + ".|......................................................................................................................", + ".|......................................................................................................................", + ".|......................................................................................................................", + ".|......................................................................................................................", + ".|......................................................................................................................", + ".|......................................................................................................................", + ".|......................................................................................................................", + ".|......................................................................................................................", + ".|......................................................................................................................", + ".|......................................................................................................................", + ".|......................................................................................................................", + ".|......................................................................................................................", + ".|......................................................................................................................", + ".|......................................................................................................................", + ".|......................................................................................................................", + ".|......................................................................................................................", + ".|......................................................................................................................", + ".|......................................................................................................................", + ".|......................................................................................................................", + ".|......................................................................................................................", + ".|......................................................................................................................", + ".|......................................................................................................................", + ".|......................................................................................................................" + ], + "palettes": [ "rc_grounds" ] + } + }, + { + "type": "mapgen", + "method": "json", + "om_terrain": [ + [ "refctr_NW1a_z2", "refctr_NW2a_z2", "refctr_NW3a_z2", "refctr_NW4a_z2", "refctr_NW5a_z2" ], + [ "refctr_NW1b_z2", "refctr_NW2b_z2", "refctr_NW3b_z2", "refctr_NW4b_z2", "refctr_NW5b_z2" ], + [ "refctr_NW1c_z2", "refctr_NW2c_z2", "refctr_NW3c_z2", "refctr_NW4c_z2", "refctr_NW5c_z2" ], + [ "refctr_NW1d_z2", "refctr_NW2d_z2", "refctr_NW3d_z2", "refctr_NW4d_z2", "refctr_NW5d_z2" ], + [ "refctr_NW1e_z2", "refctr_NW2e_z2", "refctr_NW3e_z2", "refctr_NW4e_z2", "refctr_NW5e_z2" ] + ], + "weight": 100, + "object": { "fill_ter": "t_open_air" } + }, + { + "type": "mapgen", + "method": "json", + "om_terrain": [ + [ "refctr_NW1a_z1", "refctr_NW2a_z1", "refctr_NW3a_z1", "refctr_NW4a_z1", "refctr_NW5a_z1" ], + [ "refctr_NW1b_z1", "refctr_NW2b_z1", "refctr_NW3b_z1", "refctr_NW4b_z1", "refctr_NW5b_z1" ], + [ "refctr_NW1c_z1", "refctr_NW2c_z1", "refctr_NW3c_z1", "refctr_NW4c_z1", "refctr_NW5c_z1" ], + [ "refctr_NW1d_z1", "refctr_NW2d_z1", "refctr_NW3d_z1", "refctr_NW4d_z1", "refctr_NW5d_z1" ], + [ "refctr_NW1e_z1", "refctr_NW2e_z1", "refctr_NW3e_z1", "refctr_NW4e_z1", "refctr_NW5e_z1" ] + ], + "weight": 100, + "object": { "fill_ter": "t_open_air" } + }, + { + "type": "mapgen", + "method": "json", + "om_terrain": [ + [ "refctr_NW1a_z-1", "refctr_NW2a_z-1", "refctr_NW3a_z-1", "refctr_NW4a_z-1", "refctr_NW5a_z-1" ], + [ "refctr_NW1b_z-1", "refctr_NW2b_z-1", "refctr_NW3b_z-1", "refctr_NW4b_z-1", "refctr_NW5b_z-1" ], + [ "refctr_NW1c_z-1", "refctr_NW2c_z-1", "refctr_NW3c_z-1", "refctr_NW4c_z-1", "refctr_NW5c_z-1" ], + [ "refctr_NW1d_z-1", "refctr_NW2d_z-1", "refctr_NW3d_z-1", "refctr_NW4d_z-1", "refctr_NW5d_z-1" ], + [ "refctr_NW1e_z-1", "refctr_NW2e_z-1", "refctr_NW3e_z-1", "refctr_NW4e_z-1", "refctr_NW5e_z-1" ] + ], + "weight": 100, + "object": { "fill_ter": "t_rock" } + }, + { + "type": "mapgen", + "method": "json", + "om_terrain": [ + [ "refctr_NW1a_z-2", "refctr_NW2a_z-2", "refctr_NW3a_z-2", "refctr_NW4a_z-2", "refctr_NW5a_z-2" ], + [ "refctr_NW1b_z-2", "refctr_NW2b_z-2", "refctr_NW3b_z-2", "refctr_NW4b_z-2", "refctr_NW5b_z-2" ], + [ "refctr_NW1c_z-2", "refctr_NW2c_z-2", "refctr_NW3c_z-2", "refctr_NW4c_z-2", "refctr_NW5c_z-2" ], + [ "refctr_NW1d_z-2", "refctr_NW2d_z-2", "refctr_NW3d_z-2", "refctr_NW4d_z-2", "refctr_NW5d_z-2" ], + [ "refctr_NW1e_z-2", "refctr_NW2e_z-2", "refctr_NW3e_z-2", "refctr_NW4e_z-2", "refctr_NW5e_z-2" ] + ], + "weight": 100, + "object": { "fill_ter": "t_rock" } + }, + { + "type": "mapgen", + "method": "json", + "om_terrain": [ + [ "refctr_NW1a_z-3", "refctr_NW2a_z-3", "refctr_NW3a_z-3", "refctr_NW4a_z-3", "refctr_NW5a_z-3" ], + [ "refctr_NW1b_z-3", "refctr_NW2b_z-3", "refctr_NW3b_z-3", "refctr_NW4b_z-3", "refctr_NW5b_z-3" ], + [ "refctr_NW1c_z-3", "refctr_NW2c_z-3", "refctr_NW3c_z-3", "refctr_NW4c_z-3", "refctr_NW5c_z-3" ], + [ "refctr_NW1d_z-3", "refctr_NW2d_z-3", "refctr_NW3d_z-3", "refctr_NW4d_z-3", "refctr_NW5d_z-3" ], + [ "refctr_NW1e_z-3", "refctr_NW2e_z-3", "refctr_NW3e_z-3", "refctr_NW4e_z-3", "refctr_NW5e_z-3" ] + ], + "weight": 100, + "object": { "fill_ter": "t_rock" } + }, + { + "type": "mapgen", + "method": "json", + "om_terrain": [ + [ "refctr_NW1a_z-4", "refctr_NW2a_z-4", "refctr_NW3a_z-4", "refctr_NW4a_z-4", "refctr_NW5a_z-4" ], + [ "refctr_NW1b_z-4", "refctr_NW2b_z-4", "refctr_NW3b_z-4", "refctr_NW4b_z-4", "refctr_NW5b_z-4" ], + [ "refctr_NW1c_z-4", "refctr_NW2c_z-4", "refctr_NW3c_z-4", "refctr_NW4c_z-4", "refctr_NW5c_z-4" ], + [ "refctr_NW1d_z-4", "refctr_NW2d_z-4", "refctr_NW3d_z-4", "refctr_NW4d_z-4", "refctr_NW5d_z-4" ], + [ "refctr_NW1e_z-4", "refctr_NW2e_z-4", "refctr_NW3e_z-4", "refctr_NW4e_z-4", "refctr_NW5e_z-4" ] + ], + "weight": 100, + "object": { "fill_ter": "t_rock" } + } +] diff --git a/data/json/mapgen/refugee_center/rc_grounds_s.json b/data/json/mapgen/refugee_center/rc_grounds_s.json new file mode 100644 index 0000000000000..3383fd936d8f3 --- /dev/null +++ b/data/json/mapgen/refugee_center/rc_grounds_s.json @@ -0,0 +1,260 @@ +[ + { + "type": "mapgen", + "method": "json", + "om_terrain": [ [ "refctr_S1a", "refctr_S2a", "refctr_S3a", "refctr_S4a", "refctr_S5a" ] ], + "weight": 100, + "object": { + "fill_ter": "t_grass", + "rows": [ + "................................................''''________________''''................................................", + "................................................''''_______,,_______''''................................................", + "................................................''''_______,,_______''''................................................", + "................................................''''_______,,_______''''................................................", + "................................................''''________________''''................................................", + "................................................''''_______,,_______''''................................................", + "................................................''''_______,,_______''''................................................", + "................................................''''_______,,_______''''................................................", + "................................................''''________________''''................................................", + "................................................''''_______,,_______''''................................................", + "................................................''''_______,,_______''''................................................", + "................................................''''_______,,_______''''................................................", + "................................................''''________________''''................................................", + "................................................''''_______,,_______''''................................................", + "................................................''''_______,,_______''''................................................", + "................................................''''_______,,_______''''................................................", + "................................................''''________________''''................................................", + "................................................''''_______,,_______''''................................................", + "................................................''''_______,,_______''''................................................", + "................................................''''_______,,_______''''................................................", + "................................................''''________________''''................................................", + "................................................''''_______,,_______''''................................................", + "................................................''''_______,,_______''''................................................", + "................................................''''_______,,_______''''................................................" + ], + "palettes": [ "rc_grounds" ] + } + }, + { + "type": "mapgen", + "method": "json", + "om_terrain": [ [ "refctr_S1b", "refctr_S2b", "refctr_S3b", "refctr_S4b", "refctr_S5b" ] ], + "weight": 100, + "object": { + "fill_ter": "t_grass", + "rows": [ + "................................................''''________________''''................................................", + "................................................''''_______,,_______''''................................................", + "................................................''''_______,,_______''''................................................", + "................................................''''_______,,_______''''................................................", + "................................................''''________________''''................................................", + "................................................''''_______,,_______''''................................................", + "................................................''''_______,,_______''''................................................", + "................................................''''_______,,_______''''................................................", + "................................................''''________________''''................................................", + "................................................''''_______,,_______''''................................................", + "................................................''''_______,,_______''''................................................", + "................................................''''_______,,_______''''................................................", + "................................................''''________________''''................................................", + "................................................''''_______,,_______''''................................................", + "................................................''''_______,,_______''''................................................", + "................................................''''_______,,_______''''................................................", + "................................................''''________________''''................................................", + "................................................''''_______,,_______''''................................................", + "................................................''''_______,,_______''''................................................", + "................................................''''_______,,_______''''................................................", + "................................................''''________________''''................................................", + "................................................''''_______,,_______''''................................................", + "................................................''''_______,,_______''''................................................", + "................................................''''_______,,_______''''................................................" + ], + "palettes": [ "rc_grounds" ] + } + }, + { + "type": "mapgen", + "method": "json", + "om_terrain": [ [ "refctr_S1c", "refctr_S2c", "refctr_S3c", "refctr_S4c", "refctr_S5c" ] ], + "weight": 100, + "object": { + "fill_ter": "t_grass", + "rows": [ + "................................................''''________________''''................................................", + "................................................''''_______,,_______''''................................................", + "................................................''''_______,,_______''''................................................", + "................................................''''_______,,_______''''................................................", + "................................................''''________________''''................................................", + "................................................''''_______,,_______''''................................................", + "................................................''''_______,,_______''''................................................", + "................................................''''_______,,_______''''................................................", + "................................................''''________________''''................................................", + "................................................''''_______,,_______''''................................................", + "................................................''''_______,,_______''''................................................", + "................................................''''_______,,_______''''................................................", + "................................................''''________________''''................................................", + "................................................''''_______,,_______''''................................................", + "................................................''''_______,,_______''''................................................", + "................................................''''_______,,_______''''................................................", + "................................................''''________________''''................................................", + "................................................''''_______,,_______''''................................................", + "................................................''''_______,,_______''''................................................", + "................................................''''_______,,_______''''................................................", + "................................................''''________________''''................................................", + "................................................''''_______,,_______''''................................................", + "................................................''''_______,,_______''''................................................", + "................................................''''_______,,_______''''................................................" + ], + "palettes": [ "rc_grounds" ] + } + }, + { + "type": "mapgen", + "method": "json", + "om_terrain": [ [ "refctr_S1d", "refctr_S2d", "refctr_S3d", "refctr_S4d", "refctr_S5d" ] ], + "weight": 100, + "object": { + "fill_ter": "t_grass", + "rows": [ + "................................................''''________________''''................................................", + "................................................''''_______,,_______''''................................................", + "................................................''''_______,,_______''''................................................", + "................................................''''_______,,_______''''................................................", + "................................................''''________________''''................................................", + "................................................''''_______,,_______''''................................................", + "................................................''''_______,,_______''''................................................", + "................................................''''_______,,_______''''................................................", + "................................................''''________________''''................................................", + "................................................''''_______,,_______''''................................................", + "................................................''''_______,,_______''''................................................", + "................................................''''_______,,_______''''................................................", + "................................................''''________________''''................................................", + "................................................''''_______,,_______''''................................................", + "................................................''''_______,,_______''''................................................", + "................................................''''_______,,_______''''................................................", + "................................................''''________________''''................................................", + "................................................''''_______,,_______''''................................................", + "................................................''''_______,,_______''''................................................", + "................................................''''_______,,_______''''................................................", + "................................................''''________________''''................................................", + "................................................''''_______,,_______''''................................................", + "................................................''''_______,,_______''''................................................", + "................................................''''_______,,_______''''................................................" + ], + "palettes": [ "rc_grounds" ] + } + }, + { + "type": "mapgen", + "method": "json", + "om_terrain": [ [ "refctr_S1e", "refctr_S2e", "refctr_S3e", "refctr_S4e", "refctr_S5e" ] ], + "weight": 100, + "object": { + "fill_ter": "t_grass", + "rows": [ + "................................................''''________________''''................................................", + "................................................''''_______,,_______''''................................................", + "................................................''''_______,,_______''''................................................", + "................................................''''_______,,_______''''................................................", + "................................................''''________________''''................................................", + "................................................''''_______,,_______''''................................................", + "................................................''''_______,,_______''''................................................", + "................................................''''_______,,_______''''................................................", + "................................................''''________________''''................................................", + "................................................''''_______,,_______''''................................................", + "................................................''''_______,,_______''''................................................", + "................................................''''_______,,_______''''................................................", + "................................................''''________________''''................................................", + "................................................''''_______,,_______''''................................................", + "................................................''''_______,,_______''''................................................", + "................................................''''_______,,_______''''................................................", + "................................................''''________________''''................................................", + "||||||||||||||||||||||||||||||||||||............''''_______,,_______''''............||||||||||||||||||||||||||||||||||||", + "................................................''''_______,,_______''''................................................", + "................................................''''_______,,_______''''................................................", + "................................................''''________________''''................................................", + "................................................''''_______,,_______''''................................................", + "................................................''''_______,,_______''''................................................", + "................................................''''_______,,_______''''................................................" + ], + "palettes": [ "rc_grounds" ] + } + }, + { + "type": "mapgen", + "method": "json", + "om_terrain": [ + [ "refctr_S1a_z2", "refctr_S2a_z2", "refctr_S3a_z2", "refctr_S4a_z2", "refctr_S5a_z2" ], + [ "refctr_S1b_z2", "refctr_S2b_z2", "refctr_S3b_z2", "refctr_S4b_z2", "refctr_S5b_z2" ], + [ "refctr_S1c_z2", "refctr_S2c_z2", "refctr_S3c_z2", "refctr_S4c_z2", "refctr_S5c_z2" ], + [ "refctr_S1d_z2", "refctr_S2d_z2", "refctr_S3d_z2", "refctr_S4d_z2", "refctr_S5d_z2" ], + [ "refctr_S1e_z2", "refctr_S2e_z2", "refctr_S3e_z2", "refctr_S4e_z2", "refctr_S5e_z2" ] + ], + "weight": 100, + "object": { "fill_ter": "t_open_air" } + }, + { + "type": "mapgen", + "method": "json", + "om_terrain": [ + [ "refctr_S1a_z1", "refctr_S2a_z1", "refctr_S3a_z1", "refctr_S4a_z1", "refctr_S5a_z1" ], + [ "refctr_S1b_z1", "refctr_S2b_z1", "refctr_S3b_z1", "refctr_S4b_z1", "refctr_S5b_z1" ], + [ "refctr_S1c_z1", "refctr_S2c_z1", "refctr_S3c_z1", "refctr_S4c_z1", "refctr_S5c_z1" ], + [ "refctr_S1d_z1", "refctr_S2d_z1", "refctr_S3d_z1", "refctr_S4d_z1", "refctr_S5d_z1" ], + [ "refctr_S1e_z1", "refctr_S2e_z1", "refctr_S3e_z1", "refctr_S4e_z1", "refctr_S5e_z1" ] + ], + "weight": 100, + "object": { "fill_ter": "t_open_air" } + }, + { + "type": "mapgen", + "method": "json", + "om_terrain": [ + [ "refctr_S1a_z-1", "refctr_S2a_z-1", "refctr_S3a_z-1", "refctr_S4a_z-1", "refctr_S5a_z-1" ], + [ "refctr_S1b_z-1", "refctr_S2b_z-1", "refctr_S3b_z-1", "refctr_S4b_z-1", "refctr_S5b_z-1" ], + [ "refctr_S1c_z-1", "refctr_S2c_z-1", "refctr_S3c_z-1", "refctr_S4c_z-1", "refctr_S5c_z-1" ], + [ "refctr_S1d_z-1", "refctr_S2d_z-1", "refctr_S3d_z-1", "refctr_S4d_z-1", "refctr_S5d_z-1" ], + [ "refctr_S1e_z-1", "refctr_S2e_z-1", "refctr_S3e_z-1", "refctr_S4e_z-1", "refctr_S5e_z-1" ] + ], + "weight": 100, + "object": { "fill_ter": "t_rock" } + }, + { + "type": "mapgen", + "method": "json", + "om_terrain": [ + [ "refctr_S1a_z-2", "refctr_S2a_z-2", "refctr_S3a_z-2", "refctr_S4a_z-2", "refctr_S5a_z-2" ], + [ "refctr_S1b_z-2", "refctr_S2b_z-2", "refctr_S3b_z-2", "refctr_S4b_z-2", "refctr_S5b_z-2" ], + [ "refctr_S1c_z-2", "refctr_S2c_z-2", "refctr_S3c_z-2", "refctr_S4c_z-2", "refctr_S5c_z-2" ], + [ "refctr_S1d_z-2", "refctr_S2d_z-2", "refctr_S3d_z-2", "refctr_S4d_z-2", "refctr_S5d_z-2" ], + [ "refctr_S1e_z-2", "refctr_S2e_z-2", "refctr_S3e_z-2", "refctr_S4e_z-2", "refctr_S5e_z-2" ] + ], + "weight": 100, + "object": { "fill_ter": "t_rock" } + }, + { + "type": "mapgen", + "method": "json", + "om_terrain": [ + [ "refctr_S1a_z-3", "refctr_S2a_z-3", "refctr_S3a_z-3", "refctr_S4a_z-3", "refctr_S5a_z-3" ], + [ "refctr_S1b_z-3", "refctr_S2b_z-3", "refctr_S3b_z-3", "refctr_S4b_z-3", "refctr_S5b_z-3" ], + [ "refctr_S1c_z-3", "refctr_S2c_z-3", "refctr_S3c_z-3", "refctr_S4c_z-3", "refctr_S5c_z-3" ], + [ "refctr_S1d_z-3", "refctr_S2d_z-3", "refctr_S3d_z-3", "refctr_S4d_z-3", "refctr_S5d_z-3" ], + [ "refctr_S1e_z-3", "refctr_S2e_z-3", "refctr_S3e_z-3", "refctr_S4e_z-3", "refctr_S5e_z-3" ] + ], + "weight": 100, + "object": { "fill_ter": "t_rock" } + }, + { + "type": "mapgen", + "method": "json", + "om_terrain": [ + [ "refctr_S1a_z-4", "refctr_S2a_z-4", "refctr_S3a_z-4", "refctr_S4a_z-4", "refctr_S5a_z-4" ], + [ "refctr_S1b_z-4", "refctr_S2b_z-4", "refctr_S3b_z-4", "refctr_S4b_z-4", "refctr_S5b_z-4" ], + [ "refctr_S1c_z-4", "refctr_S2c_z-4", "refctr_S3c_z-4", "refctr_S4c_z-4", "refctr_S5c_z-4" ], + [ "refctr_S1d_z-4", "refctr_S2d_z-4", "refctr_S3d_z-4", "refctr_S4d_z-4", "refctr_S5d_z-4" ], + [ "refctr_S1e_z-4", "refctr_S2e_z-4", "refctr_S3e_z-4", "refctr_S4e_z-4", "refctr_S5e_z-4" ] + ], + "weight": 100, + "object": { "fill_ter": "t_rock" } + } +] diff --git a/data/json/mapgen/refugee_center/rc_grounds_se.json b/data/json/mapgen/refugee_center/rc_grounds_se.json new file mode 100644 index 0000000000000..b95f136ff8c22 --- /dev/null +++ b/data/json/mapgen/refugee_center/rc_grounds_se.json @@ -0,0 +1,260 @@ +[ + { + "type": "mapgen", + "method": "json", + "om_terrain": [ [ "refctr_SE1a", "refctr_SE2a", "refctr_SE3a", "refctr_SE4a", "refctr_SE5a" ] ], + "weight": 100, + "object": { + "fill_ter": "t_grass", + "rows": [ + "......................................................................................................................|.", + "......................................................................................................................|.", + "......................................................................................................................|.", + "......................................................................................................................|.", + "......................................................................................................................|.", + "......................................................................................................................|.", + "......................................................................................................................|.", + "......................................................................................................................|.", + "......................................................................................................................|.", + "......................................................................................................................|.", + "......................................................................................................................|.", + "......................................................................................................................|.", + "......................................................................................................................|.", + "......................................................................................................................|.", + "......................................................................................................................|.", + "......................................................................................................................|.", + "......................................................................................................................|.", + "......................................................................................................................|.", + "......................................................................................................................|.", + "......................................................................................................................|.", + "......................................................................................................................|.", + "......................................................................................................................|.", + "......................................................................................................................|.", + "......................................................................................................................|." + ], + "palettes": [ "rc_grounds" ] + } + }, + { + "type": "mapgen", + "method": "json", + "om_terrain": [ [ "refctr_SE1b", "refctr_SE2b", "refctr_SE3b", "refctr_SE4b", "refctr_SE5b" ] ], + "weight": 100, + "object": { + "fill_ter": "t_grass", + "rows": [ + "......................................................................................................................|.", + "......................................................................................................................|.", + "......................................................................................................................|.", + "......................................................................................................................|.", + "......................................................................................................................|.", + "......................................................................................................................|.", + "......................................................................................................................|.", + "......................................................................................................................|.", + "......................................................................................................................|.", + "......................................................................................................................|.", + "......................................................................................................................|.", + "......................................................................................................................|.", + "......................................................................................................................|.", + "......................................................................................................................|.", + "......................................................................................................................|.", + "......................................................................................................................|.", + "......................................................................................................................|.", + "......................................................................................................................|.", + "......................................................................................................................|.", + "......................................................................................................................|.", + "......................................................................................................................|.", + "......................................................................................................................|.", + "......................................................................................................................|.", + "......................................................................................................................|." + ], + "palettes": [ "rc_grounds" ] + } + }, + { + "type": "mapgen", + "method": "json", + "om_terrain": [ [ "refctr_SE1c", "refctr_SE2c", "refctr_SE3c", "refctr_SE4c", "refctr_SE5c" ] ], + "weight": 100, + "object": { + "fill_ter": "t_grass", + "rows": [ + "......................................................................................................................|.", + "......................................................................................................................|.", + "......................................................................................................................|.", + "......................................................................................................................|.", + "......................................................................................................................|.", + "......................................................................................................................|.", + "......................................................................................................................|.", + "......................................................................................................................|.", + "......................................................................................................................|.", + "......................................................................................................................|.", + "......................................................................................................................|.", + "......................................................................................................................|.", + "......................................................................................................................|.", + "......................................................................................................................|.", + "......................................................................................................................|.", + "......................................................................................................................|.", + "......................................................................................................................|.", + "......................................................................................................................|.", + "......................................................................................................................|.", + "......................................................................................................................|.", + "......................................................................................................................|.", + "......................................................................................................................|.", + "......................................................................................................................|.", + "......................................................................................................................|." + ], + "palettes": [ "rc_grounds" ] + } + }, + { + "type": "mapgen", + "method": "json", + "om_terrain": [ [ "refctr_SE1d", "refctr_SE2d", "refctr_SE3d", "refctr_SE4d", "refctr_SE5d" ] ], + "weight": 100, + "object": { + "fill_ter": "t_grass", + "rows": [ + "......................................................................................................................|.", + "......................................................................................................................|.", + "......................................................................................................................|.", + "......................................................................................................................|.", + "......................................................................................................................|.", + "......................................................................................................................|.", + "......................................................................................................................|.", + "......................................................................................................................|.", + "......................................................................................................................|.", + "......................................................................................................................|.", + "......................................................................................................................|.", + "......................................................................................................................|.", + "......................................................................................................................|.", + "......................................................................................................................|.", + "......................................................................................................................|.", + "......................................................................................................................|.", + "......................................................................................................................|.", + "......................................................................................................................|.", + "......................................................................................................................|.", + "......................................................................................................................|.", + "......................................................................................................................|.", + "......................................................................................................................|.", + "......................................................................................................................|.", + "......................................................................................................................|." + ], + "palettes": [ "rc_grounds" ] + } + }, + { + "type": "mapgen", + "method": "json", + "om_terrain": [ [ "refctr_SE1e", "refctr_SE2e", "refctr_SE3e", "refctr_SE4e", "refctr_SE5e" ] ], + "weight": 100, + "object": { + "fill_ter": "t_grass", + "rows": [ + "......................................................................................................................|.", + "......................................................................................................................|.", + "......................................................................................................................|.", + "......................................................................................................................|.", + "......................................................................................................................|.", + "......................................................................................................................|.", + "......................................................................................................................|.", + "......................................................................................................................|.", + "......................................................................................................................|.", + "......................................................................................................................|.", + "......................................................................................................................|.", + "......................................................................................................................|.", + "......................................................................................................................|.", + "......................................................................................................................|.", + "......................................................................................................................|.", + "......................................................................................................................|.", + "......................................................................................................................|.", + "|||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||.", + "........................................................................................................................", + "........................................................................................................................", + "........................................................................................................................", + "........................................................................................................................", + "........................................................................................................................", + "........................................................................................................................" + ], + "palettes": [ "rc_grounds" ] + } + }, + { + "type": "mapgen", + "method": "json", + "om_terrain": [ + [ "refctr_SE1a_z2", "refctr_SE2a_z2", "refctr_SE3a_z2", "refctr_SE4a_z2", "refctr_SE5a_z2" ], + [ "refctr_SE1b_z2", "refctr_SE2b_z2", "refctr_SE3b_z2", "refctr_SE4b_z2", "refctr_SE5b_z2" ], + [ "refctr_SE1c_z2", "refctr_SE2c_z2", "refctr_SE3c_z2", "refctr_SE4c_z2", "refctr_SE5c_z2" ], + [ "refctr_SE1d_z2", "refctr_SE2d_z2", "refctr_SE3d_z2", "refctr_SE4d_z2", "refctr_SE5d_z2" ], + [ "refctr_SE1e_z2", "refctr_SE2e_z2", "refctr_SE3e_z2", "refctr_SE4e_z2", "refctr_SE5e_z2" ] + ], + "weight": 100, + "object": { "fill_ter": "t_open_air" } + }, + { + "type": "mapgen", + "method": "json", + "om_terrain": [ + [ "refctr_SE1a_z1", "refctr_SE2a_z1", "refctr_SE3a_z1", "refctr_SE4a_z1", "refctr_SE5a_z1" ], + [ "refctr_SE1b_z1", "refctr_SE2b_z1", "refctr_SE3b_z1", "refctr_SE4b_z1", "refctr_SE5b_z1" ], + [ "refctr_SE1c_z1", "refctr_SE2c_z1", "refctr_SE3c_z1", "refctr_SE4c_z1", "refctr_SE5c_z1" ], + [ "refctr_SE1d_z1", "refctr_SE2d_z1", "refctr_SE3d_z1", "refctr_SE4d_z1", "refctr_SE5d_z1" ], + [ "refctr_SE1e_z1", "refctr_SE2e_z1", "refctr_SE3e_z1", "refctr_SE4e_z1", "refctr_SE5e_z1" ] + ], + "weight": 100, + "object": { "fill_ter": "t_open_air" } + }, + { + "type": "mapgen", + "method": "json", + "om_terrain": [ + [ "refctr_SE1a_z-1", "refctr_SE2a_z-1", "refctr_SE3a_z-1", "refctr_SE4a_z-1", "refctr_SE5a_z-1" ], + [ "refctr_SE1b_z-1", "refctr_SE2b_z-1", "refctr_SE3b_z-1", "refctr_SE4b_z-1", "refctr_SE5b_z-1" ], + [ "refctr_SE1c_z-1", "refctr_SE2c_z-1", "refctr_SE3c_z-1", "refctr_SE4c_z-1", "refctr_SE5c_z-1" ], + [ "refctr_SE1d_z-1", "refctr_SE2d_z-1", "refctr_SE3d_z-1", "refctr_SE4d_z-1", "refctr_SE5d_z-1" ], + [ "refctr_SE1e_z-1", "refctr_SE2e_z-1", "refctr_SE3e_z-1", "refctr_SE4e_z-1", "refctr_SE5e_z-1" ] + ], + "weight": 100, + "object": { "fill_ter": "t_rock" } + }, + { + "type": "mapgen", + "method": "json", + "om_terrain": [ + [ "refctr_SE1a_z-2", "refctr_SE2a_z-2", "refctr_SE3a_z-2", "refctr_SE4a_z-2", "refctr_SE5a_z-2" ], + [ "refctr_SE1b_z-2", "refctr_SE2b_z-2", "refctr_SE3b_z-2", "refctr_SE4b_z-2", "refctr_SE5b_z-2" ], + [ "refctr_SE1c_z-2", "refctr_SE2c_z-2", "refctr_SE3c_z-2", "refctr_SE4c_z-2", "refctr_SE5c_z-2" ], + [ "refctr_SE1d_z-2", "refctr_SE2d_z-2", "refctr_SE3d_z-2", "refctr_SE4d_z-2", "refctr_SE5d_z-2" ], + [ "refctr_SE1e_z-2", "refctr_SE2e_z-2", "refctr_SE3e_z-2", "refctr_SE4e_z-2", "refctr_SE5e_z-2" ] + ], + "weight": 100, + "object": { "fill_ter": "t_rock" } + }, + { + "type": "mapgen", + "method": "json", + "om_terrain": [ + [ "refctr_SE1a_z-3", "refctr_SE2a_z-3", "refctr_SE3a_z-3", "refctr_SE4a_z-3", "refctr_SE5a_z-3" ], + [ "refctr_SE1b_z-3", "refctr_SE2b_z-3", "refctr_SE3b_z-3", "refctr_SE4b_z-3", "refctr_SE5b_z-3" ], + [ "refctr_SE1c_z-3", "refctr_SE2c_z-3", "refctr_SE3c_z-3", "refctr_SE4c_z-3", "refctr_SE5c_z-3" ], + [ "refctr_SE1d_z-3", "refctr_SE2d_z-3", "refctr_SE3d_z-3", "refctr_SE4d_z-3", "refctr_SE5d_z-3" ], + [ "refctr_SE1e_z-3", "refctr_SE2e_z-3", "refctr_SE3e_z-3", "refctr_SE4e_z-3", "refctr_SE5e_z-3" ] + ], + "weight": 100, + "object": { "fill_ter": "t_rock" } + }, + { + "type": "mapgen", + "method": "json", + "om_terrain": [ + [ "refctr_SE1a_z-4", "refctr_SE2a_z-4", "refctr_SE3a_z-4", "refctr_SE4a_z-4", "refctr_SE5a_z-4" ], + [ "refctr_SE1b_z-4", "refctr_SE2b_z-4", "refctr_SE3b_z-4", "refctr_SE4b_z-4", "refctr_SE5b_z-4" ], + [ "refctr_SE1c_z-4", "refctr_SE2c_z-4", "refctr_SE3c_z-4", "refctr_SE4c_z-4", "refctr_SE5c_z-4" ], + [ "refctr_SE1d_z-4", "refctr_SE2d_z-4", "refctr_SE3d_z-4", "refctr_SE4d_z-4", "refctr_SE5d_z-4" ], + [ "refctr_SE1e_z-4", "refctr_SE2e_z-4", "refctr_SE3e_z-4", "refctr_SE4e_z-4", "refctr_SE5e_z-4" ] + ], + "weight": 100, + "object": { "fill_ter": "t_rock" } + } +] diff --git a/data/json/mapgen/refugee_center/rc_grounds_sw.json b/data/json/mapgen/refugee_center/rc_grounds_sw.json new file mode 100644 index 0000000000000..6dcadb1fceb22 --- /dev/null +++ b/data/json/mapgen/refugee_center/rc_grounds_sw.json @@ -0,0 +1,260 @@ +[ + { + "type": "mapgen", + "method": "json", + "om_terrain": [ [ "refctr_SW1a", "refctr_SW2a", "refctr_SW3a", "refctr_SW4a", "refctr_SW5a" ] ], + "weight": 100, + "object": { + "fill_ter": "t_grass", + "rows": [ + ".|......................................................................................................................", + ".|......................................................................................................................", + ".|......................................................................................................................", + ".|......................................................................................................................", + ".|......................................................................................................................", + ".|......................................................................................................................", + ".|......................................................................................................................", + ".|......................................................................................................................", + ".|......................................................................................................................", + ".|......................................................................................................................", + ".|......................................................................................................................", + ".|......................................................................................................................", + ".|......................................................................................................................", + ".|......................................................................................................................", + ".|......................................................................................................................", + ".|......................................................................................................................", + ".|......................................................................................................................", + ".|......................................................................................................................", + ".|......................................................................................................................", + ".|......................................................................................................................", + ".|......................................................................................................................", + ".|......................................................................................................................", + ".|......................................................................................................................", + ".|......................................................................................................................" + ], + "palettes": [ "rc_grounds" ] + } + }, + { + "type": "mapgen", + "method": "json", + "om_terrain": [ [ "refctr_SW1b", "refctr_SW2b", "refctr_SW3b", "refctr_SW4b", "refctr_SW5b" ] ], + "weight": 100, + "object": { + "fill_ter": "t_grass", + "rows": [ + ".|......................................................................................................................", + ".|......................................................................................................................", + ".|......................................................................................................................", + ".|......................................................................................................................", + ".|......................................................................................................................", + ".|......................................................................................................................", + ".|......................................................................................................................", + ".|......................................................................................................................", + ".|......................................................................................................................", + ".|......................................................................................................................", + ".|......................................................................................................................", + ".|......................................................................................................................", + ".|......................................................................................................................", + ".|......................................................................................................................", + ".|......................................................................................................................", + ".|......................................................................................................................", + ".|......................................................................................................................", + ".|......................................................................................................................", + ".|......................................................................................................................", + ".|......................................................................................................................", + ".|......................................................................................................................", + ".|......................................................................................................................", + ".|......................................................................................................................", + ".|......................................................................................................................" + ], + "palettes": [ "rc_grounds" ] + } + }, + { + "type": "mapgen", + "method": "json", + "om_terrain": [ [ "refctr_SW1c", "refctr_SW2c", "refctr_SW3c", "refctr_SW4c", "refctr_SW5c" ] ], + "weight": 100, + "object": { + "fill_ter": "t_grass", + "rows": [ + ".|......................................................................................................................", + ".|......................................................................................................................", + ".|......................................................................................................................", + ".|......................................................................................................................", + ".|......................................................................................................................", + ".|......................................................................................................................", + ".|......................................................................................................................", + ".|......................................................................................................................", + ".|......................................................................................................................", + ".|......................................................................................................................", + ".|......................................................................................................................", + ".|......................................................................................................................", + ".|......................................................................................................................", + ".|......................................................................................................................", + ".|......................................................................................................................", + ".|......................................................................................................................", + ".|......................................................................................................................", + ".|......................................................................................................................", + ".|......................................................................................................................", + ".|......................................................................................................................", + ".|......................................................................................................................", + ".|......................................................................................................................", + ".|......................................................................................................................", + ".|......................................................................................................................" + ], + "palettes": [ "rc_grounds" ] + } + }, + { + "type": "mapgen", + "method": "json", + "om_terrain": [ [ "refctr_SW1d", "refctr_SW2d", "refctr_SW3d", "refctr_SW4d", "refctr_SW5d" ] ], + "weight": 100, + "object": { + "fill_ter": "t_grass", + "rows": [ + ".|......................................................................................................................", + ".|......................................................................................................................", + ".|......................................................................................................................", + ".|......................................................................................................................", + ".|......................................................................................................................", + ".|......................................................................................................................", + ".|......................................................................................................................", + ".|......................................................................................................................", + ".|......................................................................................................................", + ".|......................................................................................................................", + ".|......................................................................................................................", + ".|......................................................................................................................", + ".|......................................................................................................................", + ".|......................................................................................................................", + ".|......................................................................................................................", + ".|......................................................................................................................", + ".|......................................................................................................................", + ".|......................................................................................................................", + ".|......................................................................................................................", + ".|......................................................................................................................", + ".|......................................................................................................................", + ".|......................................................................................................................", + ".|......................................................................................................................", + ".|......................................................................................................................" + ], + "palettes": [ "rc_grounds" ] + } + }, + { + "type": "mapgen", + "method": "json", + "om_terrain": [ [ "refctr_SW1e", "refctr_SW2e", "refctr_SW3e", "refctr_SW4e", "refctr_SW5e" ] ], + "weight": 100, + "object": { + "fill_ter": "t_grass", + "rows": [ + ".|......................................................................................................................", + ".|......................................................................................................................", + ".|......................................................................................................................", + ".|......................................................................................................................", + ".|......................................................................................................................", + ".|......................................................................................................................", + ".|......................................................................................................................", + ".|......................................................................................................................", + ".|......................................................................................................................", + ".|......................................................................................................................", + ".|......................................................................................................................", + ".|......................................................................................................................", + ".|......................................................................................................................", + ".|......................................................................................................................", + ".|......................................................................................................................", + ".|......................................................................................................................", + ".|......................................................................................................................", + ".|||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||", + "........................................................................................................................", + "........................................................................................................................", + "........................................................................................................................", + "........................................................................................................................", + "........................................................................................................................", + "........................................................................................................................" + ], + "palettes": [ "rc_grounds" ] + } + }, + { + "type": "mapgen", + "method": "json", + "om_terrain": [ + [ "refctr_SW1a_z2", "refctr_SW2a_z2", "refctr_SW3a_z2", "refctr_SW4a_z2", "refctr_SW5a_z2" ], + [ "refctr_SW1b_z2", "refctr_SW2b_z2", "refctr_SW3b_z2", "refctr_SW4b_z2", "refctr_SW5b_z2" ], + [ "refctr_SW1c_z2", "refctr_SW2c_z2", "refctr_SW3c_z2", "refctr_SW4c_z2", "refctr_SW5c_z2" ], + [ "refctr_SW1d_z2", "refctr_SW2d_z2", "refctr_SW3d_z2", "refctr_SW4d_z2", "refctr_SW5d_z2" ], + [ "refctr_SW1e_z2", "refctr_SW2e_z2", "refctr_SW3e_z2", "refctr_SW4e_z2", "refctr_SW5e_z2" ] + ], + "weight": 100, + "object": { "fill_ter": "t_open_air" } + }, + { + "type": "mapgen", + "method": "json", + "om_terrain": [ + [ "refctr_SW1a_z1", "refctr_SW2a_z1", "refctr_SW3a_z1", "refctr_SW4a_z1", "refctr_SW5a_z1" ], + [ "refctr_SW1b_z1", "refctr_SW2b_z1", "refctr_SW3b_z1", "refctr_SW4b_z1", "refctr_SW5b_z1" ], + [ "refctr_SW1c_z1", "refctr_SW2c_z1", "refctr_SW3c_z1", "refctr_SW4c_z1", "refctr_SW5c_z1" ], + [ "refctr_SW1d_z1", "refctr_SW2d_z1", "refctr_SW3d_z1", "refctr_SW4d_z1", "refctr_SW5d_z1" ], + [ "refctr_SW1e_z1", "refctr_SW2e_z1", "refctr_SW3e_z1", "refctr_SW4e_z1", "refctr_SW5e_z1" ] + ], + "weight": 100, + "object": { "fill_ter": "t_open_air" } + }, + { + "type": "mapgen", + "method": "json", + "om_terrain": [ + [ "refctr_SW1a_z-1", "refctr_SW2a_z-1", "refctr_SW3a_z-1", "refctr_SW4a_z-1", "refctr_SW5a_z-1" ], + [ "refctr_SW1b_z-1", "refctr_SW2b_z-1", "refctr_SW3b_z-1", "refctr_SW4b_z-1", "refctr_SW5b_z-1" ], + [ "refctr_SW1c_z-1", "refctr_SW2c_z-1", "refctr_SW3c_z-1", "refctr_SW4c_z-1", "refctr_SW5c_z-1" ], + [ "refctr_SW1d_z-1", "refctr_SW2d_z-1", "refctr_SW3d_z-1", "refctr_SW4d_z-1", "refctr_SW5d_z-1" ], + [ "refctr_SW1e_z-1", "refctr_SW2e_z-1", "refctr_SW3e_z-1", "refctr_SW4e_z-1", "refctr_SW5e_z-1" ] + ], + "weight": 100, + "object": { "fill_ter": "t_rock" } + }, + { + "type": "mapgen", + "method": "json", + "om_terrain": [ + [ "refctr_SW1a_z-2", "refctr_SW2a_z-2", "refctr_SW3a_z-2", "refctr_SW4a_z-2", "refctr_SW5a_z-2" ], + [ "refctr_SW1b_z-2", "refctr_SW2b_z-2", "refctr_SW3b_z-2", "refctr_SW4b_z-2", "refctr_SW5b_z-2" ], + [ "refctr_SW1c_z-2", "refctr_SW2c_z-2", "refctr_SW3c_z-2", "refctr_SW4c_z-2", "refctr_SW5c_z-2" ], + [ "refctr_SW1d_z-2", "refctr_SW2d_z-2", "refctr_SW3d_z-2", "refctr_SW4d_z-2", "refctr_SW5d_z-2" ], + [ "refctr_SW1e_z-2", "refctr_SW2e_z-2", "refctr_SW3e_z-2", "refctr_SW4e_z-2", "refctr_SW5e_z-2" ] + ], + "weight": 100, + "object": { "fill_ter": "t_rock" } + }, + { + "type": "mapgen", + "method": "json", + "om_terrain": [ + [ "refctr_SW1a_z-3", "refctr_SW2a_z-3", "refctr_SW3a_z-3", "refctr_SW4a_z-3", "refctr_SW5a_z-3" ], + [ "refctr_SW1b_z-3", "refctr_SW2b_z-3", "refctr_SW3b_z-3", "refctr_SW4b_z-3", "refctr_SW5b_z-3" ], + [ "refctr_SW1c_z-3", "refctr_SW2c_z-3", "refctr_SW3c_z-3", "refctr_SW4c_z-3", "refctr_SW5c_z-3" ], + [ "refctr_SW1d_z-3", "refctr_SW2d_z-3", "refctr_SW3d_z-3", "refctr_SW4d_z-3", "refctr_SW5d_z-3" ], + [ "refctr_SW1e_z-3", "refctr_SW2e_z-3", "refctr_SW3e_z-3", "refctr_SW4e_z-3", "refctr_SW5e_z-3" ] + ], + "weight": 100, + "object": { "fill_ter": "t_rock" } + }, + { + "type": "mapgen", + "method": "json", + "om_terrain": [ + [ "refctr_SW1a_z-4", "refctr_SW2a_z-4", "refctr_SW3a_z-4", "refctr_SW4a_z-4", "refctr_SW5a_z-4" ], + [ "refctr_SW1b_z-4", "refctr_SW2b_z-4", "refctr_SW3b_z-4", "refctr_SW4b_z-4", "refctr_SW5b_z-4" ], + [ "refctr_SW1c_z-4", "refctr_SW2c_z-4", "refctr_SW3c_z-4", "refctr_SW4c_z-4", "refctr_SW5c_z-4" ], + [ "refctr_SW1d_z-4", "refctr_SW2d_z-4", "refctr_SW3d_z-4", "refctr_SW4d_z-4", "refctr_SW5d_z-4" ], + [ "refctr_SW1e_z-4", "refctr_SW2e_z-4", "refctr_SW3e_z-4", "refctr_SW4e_z-4", "refctr_SW5e_z-4" ] + ], + "weight": 100, + "object": { "fill_ter": "t_rock" } + } +] diff --git a/data/json/mapgen/refugee_center/rc_grounds_w.json b/data/json/mapgen/refugee_center/rc_grounds_w.json new file mode 100644 index 0000000000000..c51c9c9b1ae40 --- /dev/null +++ b/data/json/mapgen/refugee_center/rc_grounds_w.json @@ -0,0 +1,260 @@ +[ + { + "type": "mapgen", + "method": "json", + "om_terrain": [ [ "refctr_W1a", "refctr_W2a", "refctr_W3a", "refctr_W4a", "refctr_W5a" ] ], + "weight": 100, + "object": { + "fill_ter": "t_grass", + "rows": [ + ".|......................................................................................................................", + ".|......................................................................................................................", + ".|......................................................................................................................", + ".|......................................................................................................................", + ".|......................................................................................................................", + ".|......................................................................................................................", + ".|......................................................................................................................", + ".|......................................................................................................................", + ".|......................................................................................................................", + ".|......................................................................................................................", + ".|......................................................................................................................", + ".|......................................................................................................................", + ".|......................................................................................................................", + ".|......................................................................................................................", + ".|......................................................................................................................", + ".|......................................................................................................................", + ".|......................................................................................................................", + ".|......................................................................................................................", + ".|......................................................................................................................", + ".|......................................................................................................................", + ".|......................................................................................................................", + ".|......................................................................................................................", + ".|......................................................................................................................", + ".|......................................................................................................................" + ], + "palettes": [ "rc_grounds" ] + } + }, + { + "type": "mapgen", + "method": "json", + "om_terrain": [ [ "refctr_W1b", "refctr_W2b", "refctr_W3b", "refctr_W4b", "refctr_W5b" ] ], + "weight": 100, + "object": { + "fill_ter": "t_grass", + "rows": [ + ".|......................................................................................................................", + ".|......................................................................................................................", + ".|......................................................................................................................", + ".|......................................................................................................................", + ".|......................................................................................................................", + ".|......................................................................................................................", + ".|......................................................................................................................", + ".|......................................................................................................................", + ".|......................................................................................................................", + ".|......................................................................................................................", + ".|......................................................................................................................", + ".|......................................................................................................................", + ".|......................................................................................................................", + ".|......................................................................................................................", + ".|......................................................................................................................", + ".|......................................................................................................................", + ".|......................................................................................................................", + ".|......................................................................................................................", + ".|......................................................................................................................", + ".|......................................................................................................................", + ".|......................................................................................................................", + ".|......................................................................................................................", + ".|......................................................................................................................", + ".|......................................................................................................................" + ], + "palettes": [ "rc_grounds" ] + } + }, + { + "type": "mapgen", + "method": "json", + "om_terrain": [ [ "refctr_W1c", "refctr_W2c", "refctr_W3c", "refctr_W4c", "refctr_W5c" ] ], + "weight": 100, + "object": { + "fill_ter": "t_grass", + "rows": [ + ".|......................................................................................................................", + ".|......................................................................................................................", + ".|......................................................................................................................", + ".|......................................................................................................................", + ".|......................................................................................................................", + ".|......................................................................................................................", + ".|......................................................................................................................", + ".|......................................................................................................................", + ".|......................................................................................................................", + ".|......................................................................................................................", + ".|......................................................................................................................", + ".|......................................................................................................................", + ".|......................................................................................................................", + ".|......................................................................................................................", + ".|......................................................................................................................", + ".|......................................................................................................................", + ".|......................................................................................................................", + ".|......................................................................................................................", + ".|......................................................................................................................", + ".|......................................................................................................................", + ".|......................................................................................................................", + ".|......................................................................................................................", + ".|......................................................................................................................", + ".|......................................................................................................................" + ], + "palettes": [ "rc_grounds" ] + } + }, + { + "type": "mapgen", + "method": "json", + "om_terrain": [ [ "refctr_W1d", "refctr_W2d", "refctr_W3d", "refctr_W4d", "refctr_W5d" ] ], + "weight": 100, + "object": { + "fill_ter": "t_grass", + "rows": [ + ".|......................................................................................................................", + ".|......................................................................................................................", + ".|......................................................................................................................", + ".|......................................................................................................................", + ".|......................................................................................................................", + ".|......................................................................................................................", + ".|......................................................................................................................", + ".|......................................................................................................................", + ".|......................................................................................................................", + ".|......................................................................................................................", + ".|......................................................................................................................", + ".|......................................................................................................................", + ".|......................................................................................................................", + ".|......................................................................................................................", + ".|......................................................................................................................", + ".|......................................................................................................................", + ".|......................................................................................................................", + ".|......................................................................................................................", + ".|......................................................................................................................", + ".|......................................................................................................................", + ".|......................................................................................................................", + ".|......................................................................................................................", + ".|......................................................................................................................", + ".|......................................................................................................................" + ], + "palettes": [ "rc_grounds" ] + } + }, + { + "type": "mapgen", + "method": "json", + "om_terrain": [ [ "refctr_W1e", "refctr_W2e", "refctr_W3e", "refctr_W4e", "refctr_W5e" ] ], + "weight": 100, + "object": { + "fill_ter": "t_grass", + "rows": [ + ".|......................................................................................................................", + ".|......................................................................................................................", + ".|......................................................................................................................", + ".|......................................................................................................................", + ".|......................................................................................................................", + ".|......................................................................................................................", + ".|......................................................................................................................", + ".|......................................................................................................................", + ".|......................................................................................................................", + ".|......................................................................................................................", + ".|......................................................................................................................", + ".|......................................................................................................................", + ".|......................................................................................................................", + ".|......................................................................................................................", + ".|......................................................................................................................", + ".|......................................................................................................................", + ".|......................................................................................................................", + ".|......................................................................................................................", + ".|......................................................................................................................", + ".|......................................................................................................................", + ".|......................................................................................................................", + ".|......................................................................................................................", + ".|......................................................................................................................", + ".|......................................................................................................................" + ], + "palettes": [ "rc_grounds" ] + } + }, + { + "type": "mapgen", + "method": "json", + "om_terrain": [ + [ "refctr_W1a_z2", "refctr_W2a_z2", "refctr_W3a_z2", "refctr_W4a_z2", "refctr_W5a_z2" ], + [ "refctr_W1b_z2", "refctr_W2b_z2", "refctr_W3b_z2", "refctr_W4b_z2", "refctr_W5b_z2" ], + [ "refctr_W1c_z2", "refctr_W2c_z2", "refctr_W3c_z2", "refctr_W4c_z2", "refctr_W5c_z2" ], + [ "refctr_W1d_z2", "refctr_W2d_z2", "refctr_W3d_z2", "refctr_W4d_z2", "refctr_W5d_z2" ], + [ "refctr_W1e_z2", "refctr_W2e_z2", "refctr_W3e_z2", "refctr_W4e_z2", "refctr_W5e_z2" ] + ], + "weight": 100, + "object": { "fill_ter": "t_open_air" } + }, + { + "type": "mapgen", + "method": "json", + "om_terrain": [ + [ "refctr_W1a_z1", "refctr_W2a_z1", "refctr_W3a_z1", "refctr_W4a_z1", "refctr_W5a_z1" ], + [ "refctr_W1b_z1", "refctr_W2b_z1", "refctr_W3b_z1", "refctr_W4b_z1", "refctr_W5b_z1" ], + [ "refctr_W1c_z1", "refctr_W2c_z1", "refctr_W3c_z1", "refctr_W4c_z1", "refctr_W5c_z1" ], + [ "refctr_W1d_z1", "refctr_W2d_z1", "refctr_W3d_z1", "refctr_W4d_z1", "refctr_W5d_z1" ], + [ "refctr_W1e_z1", "refctr_W2e_z1", "refctr_W3e_z1", "refctr_W4e_z1", "refctr_W5e_z1" ] + ], + "weight": 100, + "object": { "fill_ter": "t_open_air" } + }, + { + "type": "mapgen", + "method": "json", + "om_terrain": [ + [ "refctr_W1a_z-1", "refctr_W2a_z-1", "refctr_W3a_z-1", "refctr_W4a_z-1", "refctr_W5a_z-1" ], + [ "refctr_W1b_z-1", "refctr_W2b_z-1", "refctr_W3b_z-1", "refctr_W4b_z-1", "refctr_W5b_z-1" ], + [ "refctr_W1c_z-1", "refctr_W2c_z-1", "refctr_W3c_z-1", "refctr_W4c_z-1", "refctr_W5c_z-1" ], + [ "refctr_W1d_z-1", "refctr_W2d_z-1", "refctr_W3d_z-1", "refctr_W4d_z-1", "refctr_W5d_z-1" ], + [ "refctr_W1e_z-1", "refctr_W2e_z-1", "refctr_W3e_z-1", "refctr_W4e_z-1", "refctr_W5e_z-1" ] + ], + "weight": 100, + "object": { "fill_ter": "t_rock" } + }, + { + "type": "mapgen", + "method": "json", + "om_terrain": [ + [ "refctr_W1a_z-2", "refctr_W2a_z-2", "refctr_W3a_z-2", "refctr_W4a_z-2", "refctr_W5a_z-2" ], + [ "refctr_W1b_z-2", "refctr_W2b_z-2", "refctr_W3b_z-2", "refctr_W4b_z-2", "refctr_W5b_z-2" ], + [ "refctr_W1c_z-2", "refctr_W2c_z-2", "refctr_W3c_z-2", "refctr_W4c_z-2", "refctr_W5c_z-2" ], + [ "refctr_W1d_z-2", "refctr_W2d_z-2", "refctr_W3d_z-2", "refctr_W4d_z-2", "refctr_W5d_z-2" ], + [ "refctr_W1e_z-2", "refctr_W2e_z-2", "refctr_W3e_z-2", "refctr_W4e_z-2", "refctr_W5e_z-2" ] + ], + "weight": 100, + "object": { "fill_ter": "t_rock" } + }, + { + "type": "mapgen", + "method": "json", + "om_terrain": [ + [ "refctr_W1a_z-3", "refctr_W2a_z-3", "refctr_W3a_z-3", "refctr_W4a_z-3", "refctr_W5a_z-3" ], + [ "refctr_W1b_z-3", "refctr_W2b_z-3", "refctr_W3b_z-3", "refctr_W4b_z-3", "refctr_W5b_z-3" ], + [ "refctr_W1c_z-3", "refctr_W2c_z-3", "refctr_W3c_z-3", "refctr_W4c_z-3", "refctr_W5c_z-3" ], + [ "refctr_W1d_z-3", "refctr_W2d_z-3", "refctr_W3d_z-3", "refctr_W4d_z-3", "refctr_W5d_z-3" ], + [ "refctr_W1e_z-3", "refctr_W2e_z-3", "refctr_W3e_z-3", "refctr_W4e_z-3", "refctr_W5e_z-3" ] + ], + "weight": 100, + "object": { "fill_ter": "t_rock" } + }, + { + "type": "mapgen", + "method": "json", + "om_terrain": [ + [ "refctr_W1a_z-4", "refctr_W2a_z-4", "refctr_W3a_z-4", "refctr_W4a_z-4", "refctr_W5a_z-4" ], + [ "refctr_W1b_z-4", "refctr_W2b_z-4", "refctr_W3b_z-4", "refctr_W4b_z-4", "refctr_W5b_z-4" ], + [ "refctr_W1c_z-4", "refctr_W2c_z-4", "refctr_W3c_z-4", "refctr_W4c_z-4", "refctr_W5c_z-4" ], + [ "refctr_W1d_z-4", "refctr_W2d_z-4", "refctr_W3d_z-4", "refctr_W4d_z-4", "refctr_W5d_z-4" ], + [ "refctr_W1e_z-4", "refctr_W2e_z-4", "refctr_W3e_z-4", "refctr_W4e_z-4", "refctr_W5e_z-4" ] + ], + "weight": 100, + "object": { "fill_ter": "t_rock" } + } +] diff --git a/data/json/mapgen/refugee_center.json b/data/json/mapgen/refugee_center/refugee_center.json similarity index 100% rename from data/json/mapgen/refugee_center.json rename to data/json/mapgen/refugee_center/refugee_center.json diff --git a/data/json/mapgen/refugee_center/z-1_refugee_center.json b/data/json/mapgen/refugee_center/z-1_refugee_center.json new file mode 100644 index 0000000000000..4f579205def81 --- /dev/null +++ b/data/json/mapgen/refugee_center/z-1_refugee_center.json @@ -0,0 +1,15 @@ +[ + { + "type": "mapgen", + "method": "json", + "om_terrain": [ + [ "evac_center_1_z-1", "evac_center_2_z-1", "evac_center_3_z-1", "evac_center_4_z-1", "evac_center_5_z-1" ], + [ "evac_center_6_z-1", "evac_center_7_z-1", "evac_center_8_z-1", "evac_center_9_z-1", "evac_center_10_z-1" ], + [ "evac_center_11_z-1", "evac_center_12_z-1", "evac_center_13_z-1", "evac_center_14_z-1", "evac_center_15_z-1" ], + [ "evac_center_16_z-1", "evac_center_17_z-1", "evac_center_18_z-1", "evac_center_19_z-1", "evac_center_20_z-1" ], + [ "evac_center_21_z-1", "evac_center_22_z-1", "evac_center_23_z-1", "evac_center_24_z-1", "evac_center_25_z-1" ] + ], + "weight": 100, + "object": { "fill_ter": "t_rock" } + } +] diff --git a/data/json/mapgen/refugee_center/z-2_refugee_center.json b/data/json/mapgen/refugee_center/z-2_refugee_center.json new file mode 100644 index 0000000000000..cf9084bc160ad --- /dev/null +++ b/data/json/mapgen/refugee_center/z-2_refugee_center.json @@ -0,0 +1,15 @@ +[ + { + "type": "mapgen", + "method": "json", + "om_terrain": [ + [ "evac_center_1_z-2", "evac_center_2_z-2", "evac_center_3_z-2", "evac_center_4_z-2", "evac_center_5_z-2" ], + [ "evac_center_6_z-2", "evac_center_7_z-2", "evac_center_8_z-2", "evac_center_9_z-2", "evac_center_10_z-2" ], + [ "evac_center_11_z-2", "evac_center_12_z-2", "evac_center_13_z-2", "evac_center_14_z-2", "evac_center_15_z-2" ], + [ "evac_center_16_z-2", "evac_center_17_z-2", "evac_center_18_z-2", "evac_center_19_z-2", "evac_center_20_z-2" ], + [ "evac_center_21_z-2", "evac_center_22_z-2", "evac_center_23_z-2", "evac_center_24_z-2", "evac_center_25_z-2" ] + ], + "weight": 100, + "object": { "fill_ter": "t_rock" } + } +] diff --git a/data/json/mapgen/refugee_center/z-3_refugee_center.json b/data/json/mapgen/refugee_center/z-3_refugee_center.json new file mode 100644 index 0000000000000..1eb182e37eda5 --- /dev/null +++ b/data/json/mapgen/refugee_center/z-3_refugee_center.json @@ -0,0 +1,15 @@ +[ + { + "type": "mapgen", + "method": "json", + "om_terrain": [ + [ "evac_center_1_z-3", "evac_center_2_z-3", "evac_center_3_z-3", "evac_center_4_z-3", "evac_center_5_z-3" ], + [ "evac_center_6_z-3", "evac_center_7_z-3", "evac_center_8_z-3", "evac_center_9_z-3", "evac_center_10_z-3" ], + [ "evac_center_11_z-3", "evac_center_12_z-3", "evac_center_13_z-3", "evac_center_14_z-3", "evac_center_15_z-3" ], + [ "evac_center_16_z-3", "evac_center_17_z-3", "evac_center_18_z-3", "evac_center_19_z-3", "evac_center_20_z-3" ], + [ "evac_center_21_z-3", "evac_center_22_z-3", "evac_center_23_z-3", "evac_center_24_z-3", "evac_center_25_z-3" ] + ], + "weight": 100, + "object": { "fill_ter": "t_rock" } + } +] diff --git a/data/json/mapgen/refugee_center/z-4_refugee_center.json b/data/json/mapgen/refugee_center/z-4_refugee_center.json new file mode 100644 index 0000000000000..e8b0f95cdf451 --- /dev/null +++ b/data/json/mapgen/refugee_center/z-4_refugee_center.json @@ -0,0 +1,15 @@ +[ + { + "type": "mapgen", + "method": "json", + "om_terrain": [ + [ "evac_center_1_z-4", "evac_center_2_z-4", "evac_center_3_z-4", "evac_center_4_z-4", "evac_center_5_z-4" ], + [ "evac_center_6_z-4", "evac_center_7_z-4", "evac_center_8_z-4", "evac_center_9_z-4", "evac_center_10_z-4" ], + [ "evac_center_11_z-4", "evac_center_12_z-4", "evac_center_13_z-4", "evac_center_14_z-4", "evac_center_15_z-4" ], + [ "evac_center_16_z-4", "evac_center_17_z-4", "evac_center_18_z-4", "evac_center_19_z-4", "evac_center_20_z-4" ], + [ "evac_center_21_z-4", "evac_center_22_z-4", "evac_center_23_z-4", "evac_center_24_z-4", "evac_center_25_z-4" ] + ], + "weight": 100, + "object": { "fill_ter": "t_rock" } + } +] diff --git a/data/json/mapgen/refugee_center/z1_refugee_center.json b/data/json/mapgen/refugee_center/z1_refugee_center.json new file mode 100644 index 0000000000000..04fba503372fa --- /dev/null +++ b/data/json/mapgen/refugee_center/z1_refugee_center.json @@ -0,0 +1,15 @@ +[ + { + "type": "mapgen", + "method": "json", + "om_terrain": [ + [ "evac_center_1_z1", "evac_center_2_z1", "evac_center_3_z1", "evac_center_4_z1", "evac_center_5_z1" ], + [ "evac_center_6_z1", "evac_center_7_z1", "evac_center_8_z1", "evac_center_9_z1", "evac_center_10_z1" ], + [ "evac_center_11_z1", "evac_center_12_z1", "evac_center_13_z1", "evac_center_14_z1", "evac_center_15_z1" ], + [ "evac_center_16_z1", "evac_center_17_z1", "evac_center_18_z1", "evac_center_19_z1", "evac_center_20_z1" ], + [ "evac_center_21_z1", "evac_center_22_z1", "evac_center_23_z1", "evac_center_24_z1", "evac_center_25_z1" ] + ], + "weight": 100, + "object": { "fill_ter": "t_open_air" } + } +] diff --git a/data/json/mapgen/refugee_center/z2_refugee_center.json b/data/json/mapgen/refugee_center/z2_refugee_center.json new file mode 100644 index 0000000000000..97ccf0393566b --- /dev/null +++ b/data/json/mapgen/refugee_center/z2_refugee_center.json @@ -0,0 +1,15 @@ +[ + { + "type": "mapgen", + "method": "json", + "om_terrain": [ + [ "evac_center_1_z2", "evac_center_2_z2", "evac_center_3_z2", "evac_center_4_z2", "evac_center_5_z2" ], + [ "evac_center_6_z2", "evac_center_7_z2", "evac_center_8_z2", "evac_center_9_z2", "evac_center_10_z2" ], + [ "evac_center_11_z2", "evac_center_12_z2", "evac_center_13_z2", "evac_center_14_z2", "evac_center_15_z2" ], + [ "evac_center_16_z2", "evac_center_17_z2", "evac_center_18_z2", "evac_center_19_z2", "evac_center_20_z2" ], + [ "evac_center_21_z2", "evac_center_22_z2", "evac_center_23_z2", "evac_center_24_z2", "evac_center_25_z2" ] + ], + "weight": 100, + "object": { "fill_ter": "t_open_air" } + } +] diff --git a/data/json/mapgen/restaurant.json b/data/json/mapgen/restaurant.json index 57994d13314ef..5ebbcdd2eb62e 100644 --- a/data/json/mapgen/restaurant.json +++ b/data/json/mapgen/restaurant.json @@ -37,7 +37,7 @@ "&": "t_linoleum_gray", "+": "t_door_c", ",": "t_pavement_y", - "-": "t_wall", + "-": "t_wall_r", "C": "t_curtains", "D": "t_door_locked", "F": "t_linoleum_gray", @@ -54,7 +54,7 @@ "{": "t_linoleum_gray", "4": "t_gutter_downspout", "<": "t_ladder_up", - "|": "t_wall" + "|": "t_wall_r" }, "furniture": { "#": "f_counter", @@ -201,7 +201,7 @@ "'": "t_window", "+": "t_door_c", ",": "t_pavement_y", - "-": "t_wall", + "-": "t_wall_y", ".": "t_carpet_green", "@": "t_console_broken", "C": "t_curtains", @@ -225,7 +225,7 @@ "4": "t_gutter_downspout", "6": "t_tree_willow", " ": "t_grass_long", - "|": "t_wall" + "|": "t_wall_y" }, "furniture": { "#": "f_counter", @@ -369,7 +369,7 @@ "#": "t_linoleum_gray", "+": "t_door_c", ",": "t_pavement_y", - "-": "t_wall", + "-": "t_wall_w", ".": [ "t_grass", "t_grass", "t_grass", "t_grass", "t_dirt" ], "=": "t_sidewalk", "G": "t_linoleum_white", @@ -389,7 +389,7 @@ "<": "t_stairs_up", "L": "t_linoleum_white", "r": "t_linoleum_white", - "|": "t_wall" + "|": "t_wall_w" }, "furniture": { "#": "f_counter", @@ -498,5 +498,284 @@ } ] } + }, + { + "type": "mapgen", + "method": "json", + "om_terrain": [ "s_restaurant_foodplace" ], + "weight": 1000, + "object": { + "fill_ter": "t_floor", + "rows": [ + "____,____,____,____,____", + "____,____,____,____,____", + "____,____,____,____,____", + "____,____,____,____,____", + "|-GGGGGG---++---GGGGGG-|", + "|......................|", + "C..BB...BB....BB...BB..C", + "W..TT...TT....TT...TT..W", + "W..TT...TT....TT...TT..W", + "C..BB...BB....BB...BB..C", + "|^....................^|", + "C..BB...BB....BB...BB..C", + "W..TT...TT....TT...TT..W", + "W..TT...TT....TT...TT..W", + "C..BB...BB....BB...BB..C", + "|---...................|", + "|Sg|...................|", + "|Pg+..|-------------|..|", + "|--|..|FF#SS##OO##{{|..|", + "|Pg+..|wgwgwgwgwgwgw|..|", + "|Sg|..|&&###RR###gwg+..|", + "|-----------------C-|6M|", + "______4dd___________|.<|", + "____________________|--|" + ], + "terrain": { + "#": "t_linoleum_white", + "&": "t_linoleum_gray", + "+": "t_door_c", + ",": "t_pavement_y", + "-": "t_wall_p", + "C": "t_curtains", + "D": "t_door_locked", + "F": "t_linoleum_gray", + "G": "t_wall_glass", + "M": "t_door_metal_locked", + "O": "t_linoleum_white", + "P": "t_linoleum_white", + "R": "t_linoleum_white", + "S": "t_linoleum_white", + "W": "t_window", + "_": "t_pavement", + "d": "t_pavement", + "g": "t_linoleum_gray", + "w": "t_linoleum_white", + "{": "t_linoleum_gray", + "4": "t_gutter_downspout", + "6": "t_card_fp", + "<": "t_stairs_up", + "|": "t_wall_p" + }, + "furniture": { + "#": "f_counter", + "&": "f_trashcan", + "B": "f_bench", + "F": "f_fridge", + "O": "f_oven", + "R": "f_woodstove", + "S": "f_sink", + "T": "f_table", + "^": "f_indoor_plant", + "d": "f_dumpster", + "{": "f_rack" + }, + "toilets": { "P": { } }, + "place_items": [ + { "item": "restaur_table", "x": [ 3, 4 ], "y": [ 7, 8 ], "chance": 25, "repeat": [ 1, 2 ] }, + { "item": "restaur_table", "x": [ 8, 9 ], "y": [ 7, 8 ], "chance": 25, "repeat": [ 1, 2 ] }, + { "item": "restaur_table", "x": [ 14, 15 ], "y": [ 7, 8 ], "chance": 25, "repeat": [ 1, 2 ] }, + { "item": "restaur_table", "x": [ 19, 20 ], "y": [ 7, 8 ], "chance": 25, "repeat": [ 1, 2 ] }, + { "item": "restaur_table", "x": [ 3, 4 ], "y": [ 12, 13 ], "chance": 25, "repeat": [ 1, 2 ] }, + { "item": "restaur_table", "x": [ 8, 9 ], "y": [ 12, 13 ], "chance": 25, "repeat": [ 1, 2 ] }, + { "item": "restaur_table", "x": [ 14, 15 ], "y": [ 12, 13 ], "chance": 25, "repeat": [ 1, 2 ] }, + { "item": "restaur_table", "x": [ 19, 20 ], "y": [ 12, 13 ], "chance": 25, "repeat": [ 1, 2 ] }, + { "item": "restaur_bath", "x": 2, "y": [ 17, 18 ], "chance": 25 }, + { "item": "restaur_bath", "x": 2, "y": [ 20, 21 ], "chance": 25 }, + { "item": "restaur_fridge", "x": [ 7, 8 ], "y": 18, "chance": 70, "repeat": [ 2, 3 ] }, + { "item": "restaur_sink", "x": [ 10, 11 ], "y": 18, "chance": 75, "repeat": [ 2, 3 ] }, + { "item": "restaur_kitchen", "x": 9, "y": 18, "chance": 25, "repeat": [ 1, 2 ] }, + { "item": "restaur_kitchen", "x": [ 12, 13 ], "y": 18, "chance": 25, "repeat": [ 1, 2 ] }, + { "item": "restaur_kitchen", "x": [ 16, 17 ], "y": 18, "chance": 25, "repeat": [ 1, 2 ] }, + { "item": "restaur_rack", "x": [ 18, 19 ], "y": 18, "chance": 75, "repeat": [ 1, 2 ] }, + { "item": "restaur_trash", "x": [ 7, 8 ], "y": 20, "chance": 75, "repeat": [ 1, 3 ] }, + { "item": "restaur_kitchen", "x": [ 9, 11 ], "y": 20, "chance": 25, "repeat": [ 1, 2 ] }, + { "item": "restaur_kitchen", "x": [ 14, 16 ], "y": 20, "chance": 25, "repeat": [ 1, 2 ] }, + { "item": "restaur_trash", "x": [ 7, 8 ], "y": 22, "chance": 50, "repeat": [ 1, 2 ] }, + { "item": "trash", "x": [ 7, 8 ], "y": 22, "chance": 50, "repeat": [ 1, 2 ] }, + { "item": "trash", "x": [ 0, 17 ], "y": [ 22, 23 ], "chance": 20, "repeat": [ 1, 2 ] } + ], + "place_nested": [ { "chunks": [ [ "chef_s_restaurant", 5 ], [ "null", 95 ] ], "x": 7, "y": 18 } ], + "place_monsters": [ + { "monster": "GROUP_GROCERY", "x": [ 7, 19 ], "y": 19, "chance": 5 }, + { "monster": "GROUP_ROACH", "x": [ 7, 19 ], "y": 19, "chance": 20 } + ] + } + }, + { + "type": "mapgen", + "method": "json", + "om_terrain": [ "s_restaurant_foodplace_roof" ], + "weight": 300, + "object": { + "fill_ter": "t_floor", + "rows": [ + " ", + " ", + " ", + " ", + "|......................3", + "|......................3", + "|......................3", + "|......................3", + "|......................3", + "|......................3", + "|............WWWWWWWWWWW", + "|............Wh,,sWh,,sW", + "|............WT,,,WT,,,W", + "|............WWWDWWWWDWW", + "|............Wl,,bWl,,bW", + "|...........[Wl,,bWl,,bW", + "WwWWWWwWWWWWWWWWDWWWWDWW", + "Wpccccvfuosrrq;,,,M@,,,W", + "W,,,,,,,,,,,,,,,,,,,,,aW", + "w,,,,,,,,#tt#,,,,,,,,,,w", + "Wpttttp,,#tt#,,VBBp,H,,W", + "WWWwWWWWWWWwWWWWWWWWW,,W", + " Wl>W", + " WWWW" + ], + "terrain": { + ".": "t_flat_roof", + " ": "t_open_air", + "W": "t_wall_p", + "D": "t_door_c", + "[": "t_ladder_up", + "w": "t_window_domestic", + "|": "t_gutter_west", + ",": "t_floor", + "-": "t_gutter_south", + "3": "t_gutter_east", + ">": "t_stairs_down", + "5": "t_gutter_drop" + }, + "toilets": { "T": { } }, + "furniture": { + "&": "f_roof_turbine_vent", + "l": "f_locker", + "b": "f_bench", + "h": "f_shower", + "V": "f_vending_c", + "s": "f_sink", + "v": "f_trashcan", + ";": "f_pinball_machine", + "c": "f_sofa", + "t": "f_table", + "M": "f_bigmirror", + "@": "f_mannequin", + "a": "f_armchair", + "r": "f_counter", + "u": "f_cupboard", + "f": "f_fridge", + "o": "f_oven", + "q": "f_dishwasher", + "#": "f_stool", + "B": "f_bookcase", + "p": "f_indoor_plant", + "H": "f_rack_coat" + }, + "place_items": [ + { "item": "kitchen", "x": [ 11, 12 ], "y": [ 17 ], "chance": 100, "repeat": [ 5, 10 ] }, + { "item": "cleaning", "x": [ 10 ], "y": [ 17 ], "chance": 100, "repeat": [ 1, 3 ] }, + { "item": "knifeblock", "x": [ 11, 12 ], "y": [ 17 ], "chance": 100, "repeat": [ 1, 2 ] }, + { "item": "trash", "x": [ 6 ], "y": [ 17 ], "chance": 100, "repeat": [ 2, 4 ] }, + { "item": "fridge", "x": [ 7 ], "y": [ 17 ], "chance": 100, "repeat": [ 5, 15 ] }, + { "item": "oven", "x": [ 9 ], "y": [ 17 ], "chance": 100, "repeat": [ 1, 2 ] }, + { "item": "bed", "x": [ 2, 5 ], "y": [ 17 ], "chance": 100, "repeat": [ 1, 2 ] }, + { "item": "dining", "x": [ 10, 11 ], "y": [ 19, 20 ], "chance": 40, "repeat": [ 1, 2 ] }, + { "item": "vending_drink_items", "x": [ 15 ], "y": [ 20 ], "chance": 100, "repeat": [ 5, 20 ] }, + { "item": "snacks_fancy", "x": [ 2 ], "y": [ 20 ], "chance": 30, "repeat": [ 1, 2 ] }, + { "item": "snacks_fancy", "x": [ 2 ], "y": [ 17 ], "chance": 30, "repeat": [ 1, 2 ] }, + { "item": "snacks_fancy", "x": [ 22 ], "y": [ 18 ], "chance": 30, "repeat": [ 1, 2 ] }, + { "item": "fast_food", "x": [ 10, 11 ], "y": [ 19, 20 ], "chance": 30, "repeat": [ 1, 2 ] }, + { "item": "magazines", "x": [ 2 ], "y": [ 17 ], "chance": 30, "repeat": [ 1, 2 ] }, + { "item": "magazines", "x": [ 16, 17 ], "y": [ 20 ], "chance": 100, "repeat": [ 3, 5 ] }, + { "item": "coat_rack", "x": [ 20 ], "y": [ 20 ], "chance": 100, "repeat": [ 1, 4 ] }, + { "item": "stash_drugs", "x": [ 1 ], "y": [ 20 ], "chance": 30, "repeat": [ 1, 2 ] }, + { "item": "livingroom", "x": [ 2, 5 ], "y": [ 20 ], "chance": 50, "repeat": [ 1, 2 ] }, + { "item": "allclothes", "x": [ 13 ], "y": [ 14, 15 ], "chance": 100, "repeat": [ 3, 4 ] }, + { "item": "allclothes", "x": [ 19 ], "y": [ 14, 15 ], "chance": 100, "repeat": [ 3, 4 ] }, + { "item": "softdrugs", "x": [ 17 ], "y": [ 11 ], "chance": 70, "repeat": [ 2, 3 ] }, + { "item": "softdrugs", "x": [ 22 ], "y": [ 11 ], "chance": 100, "repeat": [ 2, 3 ] } + ], + "place_loot": [ + { "item": "television", "x": [ 3, 4 ], "y": 20, "repeat": 1, "chance": 100 }, + { "item": "foodperson_mask", "x": 19, "y": 17, "repeat": 1, "chance": 100 }, + { "item": "cape_fp", "x": 19, "y": 17, "repeat": 1, "chance": 100 }, + { "item": "chestguard_hard", "x": 19, "y": 17, "repeat": 1, "chance": 100 }, + { "item": "legguard_hard", "x": 19, "y": 17, "repeat": 1, "chance": 100 }, + { "item": "armguard_hard", "x": 19, "y": 17, "repeat": 1, "chance": 100 }, + { "item": "gloves_rubber", "x": 19, "y": 17, "repeat": 1, "chance": 100 }, + { "item": "boots_rubber", "x": 19, "y": 17, "repeat": 1, "chance": 100 }, + { "item": "medium_disposable_cell", "x": 21, "y": 22, "repeat": 5, "chance": 100 } + ], + "place_nested": [ { "chunks": [ [ "foodperson_break_room", 5 ], [ "null", 95 ] ], "x": 15, "y": 10 } ] + } + }, + { + "type": "mapgen", + "method": "json", + "om_terrain": [ "s_restaurant_foodplace_upper_roof" ], + "weight": 300, + "object": { + "fill_ter": "t_flat_roof", + "rows": [ + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " |---------3", + " |....:....3", + " |.........3", + " |.........3", + " |.........3", + " [..........3", + "|-----------...........3", + "|......................3", + "|......................3", + "|......................3", + "|...X..................3", + "|------5------------|..3", + " |..3", + " |--3" + ], + "terrain": { + ".": "t_flat_roof", + " ": "t_open_air", + "[": "t_ladder_down", + "|": "t_gutter_west", + ",": "t_floor", + "-": "t_gutter_south", + "3": "t_gutter_east", + "5": "t_gutter_drop" + }, + "furniture": { "&": "f_roof_turbine_vent", ":": "f_cellphone_booster", "X": "f_small_satelitte_dish" }, + "place_items": [ { "item": "roof_trash", "x": [ 3, 16 ], "y": [ 17, 19 ], "chance": 50, "repeat": [ 1, 3 ] } ], + "place_nested": [ + { + "chunks": [ + [ "roof_2x2_utilities_b", 20 ], + [ "roof_2x2_utilities_c", 20 ], + [ "roof_2x2_utilities_d", 20 ], + [ "roof_2x2_utilities", 20 ], + [ "null", 40 ] + ], + "x": [ 10, 11 ], + "y": [ 17, 18 ] + }, + { + "chunks": [ [ "roof_4x4_utility_1", 50 ], [ "roof_4x4_holdout", 5 ], [ "null", 80 ], [ "roof_5x5_coop", 5 ] ], + "x": 17, + "y": 16 + } + ] + } } ] diff --git a/data/json/mapgen/robofachq_static.json b/data/json/mapgen/robofachq_static.json index 5f50166819f4a..0c2c655f7b192 100644 --- a/data/json/mapgen/robofachq_static.json +++ b/data/json/mapgen/robofachq_static.json @@ -42,7 +42,7 @@ ], "method": "json", "object": { - "fill_ter": "t_concrete", + "fill_ter": "t_thconc_floor", "rows": [ ",,,,,,,,,,,,,,__________,ss,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,___________,,,,,,,,,,,,,,,,,,,,,,,,,,,,", ",,,,,,,,,,,,,,__________|ss|((|,,,,,,,,,,,,,,,,,,,,,,,,,,___________,,,,,,,,,,,,,,,,,,,,,,,,,,,,", @@ -118,7 +118,7 @@ ], "method": "json", "object": { - "fill_ter": "t_concrete", + "fill_ter": "t_thconc_floor", "rows": [ "################################################################################################", "#################################################################||||||||||||||||||||||||||||||#", @@ -203,7 +203,7 @@ ], "method": "json", "object": { - "fill_ter": "t_concrete", + "fill_ter": "t_thconc_floor", "rows": [ "################################################################################################", "################################################################################################", @@ -275,7 +275,7 @@ ], "method": "json", "object": { - "fill_ter": "t_concrete", + "fill_ter": "t_thconc_floor", "rows": [ "################################################################################################", "################################################################################################", diff --git a/data/json/mapgen/s_electronics.json b/data/json/mapgen/s_electronics.json index 6228374f047b1..03a6064ced013 100644 --- a/data/json/mapgen/s_electronics.json +++ b/data/json/mapgen/s_electronics.json @@ -2,26 +2,36 @@ { "id": "elecsto_cameras", "type": "item_group", + "ammo": 75, + "magazine": 100, "items": [ [ "camera", 75 ], [ "camera_pro", 25 ] ] }, { "id": "elecsto_lights", "type": "item_group", + "ammo": 75, + "magazine": 100, "items": [ [ "flashlight", 95 ], [ "wearable_light", 65 ], [ "floodlight", 10 ], [ "atomic_light", 1 ] ] }, { "id": "elecsto_pcs", "type": "item_group", + "ammo": 75, + "magazine": 100, "items": [ [ "eink_tablet_pc", 60 ], [ "laptop", 75 ] ] }, { "id": "elecsto_entapl", "type": "item_group", + "ammo": 75, + "magazine": 100, "items": [ [ "television", 50 ], [ "radio", 20 ], [ "stereo", 40 ] ] }, { "id": "elecsto_persele", "type": "item_group", + "ammo": 75, + "magazine": 100, "items": [ [ "portable_game", 65 ], [ "cell_phone", 30 ], @@ -34,6 +44,8 @@ { "id": "elecsto_homapl", "type": "item_group", + "ammo": 75, + "magazine": 100, "items": [ [ "microwave", 65 ], [ "toaster", 65 ], @@ -74,6 +86,8 @@ { "id": "elecsto_displ", "type": "item_group", + "ammo": 75, + "magazine": 100, "items": [ [ "television", 50 ], [ "eink_tablet_pc", 50 ], [ "stereo", 30 ], [ "microwave", 40 ] ] }, { diff --git a/data/json/mapgen/s_gun.json b/data/json/mapgen/s_gun.json index 3f5a002363c86..6cee2130a774e 100644 --- a/data/json/mapgen/s_gun.json +++ b/data/json/mapgen/s_gun.json @@ -3,8 +3,9 @@ "type": "mapgen", "method": "json", "om_terrain": [ "s_gun" ], - "weight": 1000, + "weight": 300, "object": { + "fill_ter": "t_floor", "rows": [ " ____________________ ", " *___*___*______*___* ", @@ -13,45 +14,57 @@ " *___*___*______*___* ", " *___*___*______*___* ", " ---:::--------:::--- ", - " |{.S..#...........{| ", " |{....#...........{| ", + " |{..S.?...........{| ", " |{....#...{{..{...{| ", " |{....#...{{..{...{| ", - " |{....#...{{..{...{| ", - " |{....#...........{| ", - " |{............{{{{{| ", - " |-:::::::::::------| ", - " |l.................| ", - " |--#--#--#--#--#--+| ", - " |..................| ", - " |..................| ", - " |..................| ", - " |..................| ", - " |..................| ", + " |---..#...{{..{...{| ", + " |&N|..............{| ", + " |..D..........{{{{{| ", + " |---:::::::::------| ", + " 4|l~~~~~~~~~~~~~~D~<| ", + " |--H--H--H--H--H-+-| ", + " |~~~~~~~~~~~~~~~~~~| ", + " |~~~~~~~~~~~~~~~~~~| ", + " |~~~~~~~~~~~~~~~~~~| ", + " |~~~~~~~~~~~~~~~~~~| ", + " |~~~~~~~~~~~~~~~~~~| ", " |ssssssssssssssssss| ", " ==================== " ], "place_terrain": [ { "ter": "t_door_metal_pickable", "x": [ 11, 14 ], "y": 6 }, - { "ter": "t_door_metal_pickable", "x": [ 5, 14 ], "y": 14 } + { "ter": "t_door_metal_pickable", "x": [ 7, 14 ], "y": 14 } ], "terrain": { " ": [ "t_grass", "t_grass", "t_grass", "t_dirt" ], - "#": "t_floor", "*": "t_pavement_y", "+": "t_door_metal_pickable", - "-": "t_wall", + "-": "t_wall_w", ".": "t_floor", ":": "t_window_bars_alarm", "=": "t_strconc_wall", "_": "t_pavement", - "S": "t_floor", - "l": "t_floor", - "s": "t_floor", - "{": "t_floor", - "|": "t_wall" + "~": "t_concrete", + "H": "t_concrete", + "s": "t_concrete", + "l": "t_concrete", + "|": "t_wall_w", + "D": "t_door_c", + "?": "t_console_broken", + "<": "t_ladder_up", + "4": "t_gutter_downspout" + }, + "toilets": { "&": { } }, + "furniture": { + "#": "f_counter", + "H": "f_counter", + "S": "f_stool", + "l": "f_locker", + "s": "f_sandbag_wall", + "{": "f_rack", + "N": "f_sink" }, - "furniture": { "#": "f_counter", "S": "f_stool", "l": "f_locker", "s": "f_sandbag_wall", "{": "f_rack" }, "place_loot": [ { "group": "guns_pistol_common", "x": 12, "y": 9, "chance": 75, "magazine": 100 }, { "group": "guns_pistol_common", "x": 13, "y": 9, "chance": 75, "magazine": 100 }, @@ -69,10 +82,10 @@ { "group": "guns_rifle_common", "x": 20, "y": 12, "chance": 50, "magazine": 100 }, { "group": "guns_smg_common", "x": 17, "y": 13, "chance": 85, "magazine": 100 }, { "group": "guns_smg_rare", "x": 18, "y": 13, "chance": 15, "magazine": 100 }, - { "group": "ammo_common", "x": 3, "y": [ 11, 13 ], "chance": 100, "repeat": 2 }, - { "group": "ammo_pistol_common", "x": 3, "y": 11, "chance": 100, "repeat": [ 1, 3 ] }, - { "group": "ammo_shotgun_common", "x": 3, "y": 12, "chance": 75, "repeat": [ 1, 2 ] }, - { "group": "ammo_rifle_common", "x": 3, "y": 13, "chance": 75, "repeat": [ 1, 2 ] }, + { "group": "ammo_common", "x": 3, "y": [ 7, 10 ], "chance": 100, "repeat": 2 }, + { "group": "ammo_pistol_common", "x": 3, "y": 7, "chance": 100, "repeat": [ 1, 3 ] }, + { "group": "ammo_shotgun_common", "x": 3, "y": 8, "chance": 75, "repeat": [ 1, 2 ] }, + { "group": "ammo_rifle_common", "x": 3, "y": 9, "chance": 75, "repeat": [ 1, 2 ] }, { "group": "mags_common", "x": 3, "y": 10, "chance": 100 }, { "group": "mags_pistol_common", "x": 3, "y": 9, "chance": 100 }, { "group": "mags_rifle_common", "x": 3, "y": 8, "chance": 75 }, @@ -96,17 +109,82 @@ { "type": "mapgen", "method": "json", - "om_terrain": [ "s_gun" ], + "om_terrain": "s_gun_roof", + "object": { + "fill_ter": "t_flat_roof", + "rows": [ + " ", + " ", + " ", + " ", + " ", + " ", + " |2222222222222222223 ", + " |..................3 ", + " |..................3 ", + " |..................3 ", + " |..................3 ", + " |..X...............3 ", + " |..................3 ", + " |..................3 ", + " |..................3 ", + " 5.................>3 ", + " |..................3 ", + " |..................3 ", + " |..................3 ", + " |..................3 ", + " |..................3 ", + " |..................3 ", + " |..................3 ", + " |------------------3 " + ], + "palettes": [ "roof_palette" ], + "terrain": { ">": "t_ladder_down" }, + "place_nested": [ + { + "chunks": [ + [ "null", 20 ], + [ "roof_2x2_utilities_b", 15 ], + [ "roof_2x2_utilities_c", 5 ], + [ "roof_2x2_utilities_d", 30 ], + [ "roof_2x2_utilities", 30 ], + [ "roof_2x2_golf", 10 ], + [ "roof_3x3_wine", 10 ] + ], + "x": [ 4, 15 ], + "y": [ 8, 9 ] + }, + { + "chunks": [ + [ "null", 20 ], + [ "roof_4x4_party", 5 ], + [ "roof_4x4_holdout", 15 ], + [ "roof_4x4_utility", 40 ], + [ "roof_4x4_utility_1", 10 ], + [ "roof_6x6_survivor", 20 ], + [ "roof_6x6_utility", 20 ] + ], + "x": [ 4, 13 ], + "y": [ 11, 16 ] + } + ] + } + }, + { + "type": "mapgen", + "method": "json", + "om_terrain": [ "s_gun_1" ], "//": "Home defense gun store", "weight": 300, "object": { + "fill_ter": "t_floor", "rows": [ "_ssssssssssssssssssssss_", "_s@@@@@@@_ssss_@@@@@@@s_", "_s||555||_ssss_||555||s_", "_s|#####5_ssss_5#####|s_", - "_s|.....5_ssss_5.....|s_", - "_s|.....5_ssss_5.....|s_", + "_s|..a..5_ssss_5..a..|s_", + "_s|.#?#.5_ssss_5.#?#.|s_", "_s|.....|55++55|.....|s_", "_s|..................|s_", "_s|..................|s_", @@ -117,17 +195,16 @@ "_A|....rrr....rrr....|s_", "_||..................|s_", "_s|..................|s_", - "_s||D|||&&&&&&&&||L|||s_", - "_s|....|..####..|..cE|s_", - "_s|....|........D...E|s_", - "_s|S..;|lll##lll|l...|s_", - "_s|||||||||||||||||L||s_", + "_s||D|*|&&&&&&&&||+|||s_", + "_s|;.|.|..####..|..cE|s_", + "_s|..|.|........*...E|s_", + "_s|S.|<|lll##lll|l...|4_", + "_s|||||||||||||||||+||s_", "_ssssssssssssssssssssss_", "________________________", "________________________" ], "terrain": { - "#": "t_floor", "&": "t_bars", "*": "t_door_locked_alarm", "+": "t_door_metal_pickable", @@ -137,20 +214,17 @@ "@": "t_shrub", "A": "t_atm", "D": "t_door_c", - "E": "t_floor", "L": "t_door_metal_locked", - "S": "t_floor", - "^": "t_floor", "_": "t_pavement", - "c": "t_floor", - "l": "t_floor", - "r": "t_floor", "s": "t_sidewalk", - "u": "t_floor", - "|": "t_wall" + "|": "t_wall_w", + "?": "t_console_broken", + "<": "t_ladder_up", + "4": "t_gutter_downspout" }, "furniture": { "#": "f_counter", + "a": "f_stool", "E": "f_desk", "S": "f_sink", "^": "f_indoor_plant", @@ -181,10 +255,73 @@ { "type": "mapgen", "method": "json", - "om_terrain": [ "s_gun" ], - "//": "Public holdout based on Home Defense Gunstore.", - "weight": 30, + "om_terrain": "s_gun_roof_1", "object": { + "fill_ter": "t_flat_roof", + "rows": [ + " ", + " ", + " |222223 |222223 ", + " |.....3 |.....3 ", + " |.....3 |.....3 ", + " |.....3 |.....3 ", + " |.....3222222|.....3 ", + " |..................3 ", + " |..................3 ", + " |..................3 ", + " |..................3 ", + " |..................3 ", + " |..................3 ", + " |..................3 ", + " |..................3 ", + " |..................3 ", + " |..................3 ", + " |..................3 ", + " |..................3 ", + " |...>..............5 ", + " |------------------3 ", + " ", + " ", + " " + ], + "palettes": [ "roof_palette" ], + "terrain": { ">": "t_ladder_down" }, + "place_nested": [ + { + "chunks": [ + [ "null", 20 ], + [ "roof_2x2_utilities_b", 15 ], + [ "roof_2x2_utilities_c", 5 ], + [ "roof_2x2_utilities_d", 30 ], + [ "roof_2x2_utilities", 30 ] + ], + "x": [ 4, 15 ], + "y": [ 7, 8 ] + }, + { + "chunks": [ + [ "null", 20 ], + [ "roof_4x4_party", 5 ], + [ "roof_4x4_holdout", 15 ], + [ "roof_4x4_utility", 40 ], + [ "roof_4x4_utility_1", 10 ], + [ "roof_6x6_survivor", 20 ], + [ "roof_6x6_utility", 20 ] + ], + "x": [ 4, 13 ], + "y": 12 + } + ] + } + }, + { + "type": "mapgen", + "method": "json", + "om_terrain": [ "s_gun_2" ], + "//": "Public holdout based on Home Defense Gunstore. Uses same roof as s_gunstore_1.", + "weight": 100, + "object": { + "fill_ter": "t_floor", "rows": [ "_ssssssssssssssssssssss_", "_s@@xx@@@_ssss_@@@@@@@s_", @@ -202,42 +339,33 @@ "_A|......rr..rr....7.|s_", "_||.....rr...........|s_", "_s|....rr..B.B.rrr.r.|s_", - "_s||D|||&&&&&&&&||p|||s_", - "_s|....|B.......|..c.|s_", - "_s|....|........C.#..|s_", - "_s|S..;|B...B...|.EE#|s_", + "_s||D|D|&&&&&&&&||p|||s_", + "_s|;.|.|B.......|..c.|s_", + "_s|..|.|........C.#..|s_", + "_s|S.|<|B...B...|.EE#|4_", "_s|||||||||||||||||L||s_", "_ssssssssssssssssssssss_", "________________________", "________________________" ], "terrain": { - "#": "t_floor", "&": "t_bars", "*": "t_door_locked_alarm", "+": "t_door_metal_pickable", ".": "t_floor", "5": "t_window_bars_alarm", - "7": "t_floor", - ";": "t_floor", "@": "t_shrub", "A": "t_atm", - "B": "t_floor", "C": "t_door_frame", "D": "t_door_o", - "E": "t_floor", "L": "t_door_metal_locked", - "S": "t_floor", - "^": "t_floor", "_": "t_pavement", - "c": "t_floor", - "l": "t_floor", "p": "t_door_metal_o", - "r": "t_floor", "s": "t_sidewalk", - "u": "t_floor", - "|": "t_wall", - "x": "t_dirt" + "|": "t_wall_w", + "x": "t_dirt", + "<": "t_ladder_up", + "4": "t_gutter_downspout" }, "furniture": { "#": "f_counter", @@ -285,56 +413,11 @@ }, { "method": "json", + "om_terrain": "s_gun_3", + "type": "mapgen", + "weight": 200, "object": { - "place_item": [ { "item": "corpse", "repeat": 1, "x": 19, "y": 12 } ], - "furniture": { - "#": "f_sandbag_wall", - "&": "f_trashcan", - "+": "f_null", - "-": "f_null", - ".": "f_null", - "C": "f_chair", - "D": "f_displaycase", - "H": "f_armchair", - "S": "f_sandbag_half", - "T": "f_table", - "W": "f_null", - "^": "f_indoor_plant_y", - "_": "f_null", - "a": "f_null", - "b": "f_sandbag_half", - "c": "f_counter", - "d": "f_null", - "e": "f_null", - "f": "f_null", - "g": "f_null", - "i": "f_indoor_plant", - "r": "f_rack", - "s": "f_null", - "t": "f_table", - "u": "f_null", - "w": "f_null", - "{": "f_locker", - "|": "f_null" - }, - "place_items": [ - { "chance": 99, "item": "corpse_male", "x": 19, "y": 12 }, - { "chance": 35, "item": "ammo_casings", "x": [ 14, 15 ], "y": 14 }, - { "chance": 35, "item": "guns_pistol_common", "x": 19, "y": 8 }, - { "chance": 75, "item": "guns_common", "x": 3, "y": 10 }, - { "chance": 40, "item": "gunmod_rare", "x": 3, "y": 12 }, - { "chance": 55, "item": "book_gunmags", "x": 9, "y": 8 }, - { "chance": 5, "item": "guns_pistol_rare", "x": 3, "y": 11 }, - { "chance": 35, "item": "ammo_rifle_common", "x": 18, "y": 14 }, - { "chance": 35, "item": "ammo_rifle_common", "x": 6, "y": 7 }, - { "chance": 30, "item": "gunmod_common", "x": [ 12, 14 ], "y": 9 }, - { "chance": 45, "item": "ammo_common", "x": 6, "y": [ 5, 6 ] }, - { "chance": 35, "item": "guns_rifle_common", "x": [ 17, 18 ], "y": 5 }, - { "chance": 35, "item": "guns_common", "x": 9, "y": [ 6, 7 ] }, - { "chance": 35, "item": "guns_common", "x": 19, "y": [ 5, 7 ] }, - { "chance": 45, "item": "trash", "x": 13, "y": 12 }, - { "chance": 45, "item": "trash", "x": 10, "y": 12 } - ], + "fill_ter": "t_floor", "rows": [ "....d...d....dss..dd.d..", ".......d......ss........", @@ -344,11 +427,11 @@ "d....W{_Cc__^____DDDWu..", "d....ar__D_________Dw...", ".d...|r__D_________D|u.d", - "...uu|__cc_________D|u..", + "...u4|__cc_________D|u..", "d.||||______DDD__||||...", - ".u|{_|||||_______|tC|u.d", - ".u|{_+______________|...", - "d.|{_|___|&_|&___|iH|...", + ".u|{_|||||_______+_C|u.d", + ".u|{_+______||+|||_t|...", + "d.|{_|___|&_|;_N|i_H|...", "..|||||e|||g|||||||||...", ".u-___________tt_tt_-u..", "du-_________________-u..", @@ -363,37 +446,111 @@ ], "terrain": { "#": "t_dirt", - "&": "t_floor", "+": "t_door_metal_pickable", "-": "t_brick_wall", ".": "t_grass", - "C": "t_floor", - "D": "t_floor", - "H": "t_floor", "S": "t_grass", "T": "t_dirt", "W": "t_wall_w", - "^": "t_floor", "_": "t_floor", "a": "t_wall_r", "b": "t_dirt", - "c": "t_floor", "d": "t_dirt", "e": "t_window_boarded", "f": "t_door_boarded", "g": "t_door_c", - "i": "t_floor", - "r": "t_floor", "s": "t_sidewalk", - "t": "t_floor", "u": "t_underbrush", "w": "t_wall_b", - "{": "t_floor", - "|": "t_wall" - } - }, - "om_terrain": "s_gun", + "|": "t_wall_w", + "4": "t_gutter_downspout" + }, + "toilets": { ";": { } }, + "place_item": [ { "item": "corpse", "repeat": 1, "x": 19, "y": 12 } ], + "furniture": { + "#": "f_sandbag_wall", + "&": "f_trashcan", + "C": "f_chair", + "D": "f_displaycase", + "H": "f_armchair", + "S": "f_sandbag_half", + "T": "f_table", + "^": "f_indoor_plant_y", + "b": "f_sandbag_half", + "c": "f_counter", + "i": "f_indoor_plant", + "r": "f_rack", + "t": "f_table", + "N": "f_sink", + "{": "f_locker" + }, + "place_items": [ + { "chance": 99, "item": "corpse_male", "x": 19, "y": 12 }, + { "chance": 35, "item": "ammo_casings", "x": [ 14, 15 ], "y": 14 }, + { "chance": 35, "item": "guns_pistol_common", "x": 19, "y": 8 }, + { "chance": 75, "item": "guns_common", "x": 3, "y": 10 }, + { "chance": 40, "item": "gunmod_rare", "x": 3, "y": 12 }, + { "chance": 55, "item": "book_gunmags", "x": 9, "y": 8 }, + { "chance": 5, "item": "guns_pistol_rare", "x": 3, "y": 11 }, + { "chance": 35, "item": "ammo_rifle_common", "x": 18, "y": 14 }, + { "chance": 35, "item": "ammo_rifle_common", "x": 6, "y": 7 }, + { "chance": 30, "item": "gunmod_common", "x": [ 12, 14 ], "y": 9 }, + { "chance": 45, "item": "ammo_common", "x": 6, "y": [ 5, 6 ] }, + { "chance": 35, "item": "guns_rifle_common", "x": [ 17, 18 ], "y": 5 }, + { "chance": 35, "item": "guns_common", "x": 9, "y": [ 6, 7 ] }, + { "chance": 35, "item": "guns_common", "x": 19, "y": [ 5, 7 ] }, + { "chance": 45, "item": "trash", "x": 13, "y": 12 }, + { "chance": 45, "item": "trash", "x": 10, "y": 12 } + ] + } + }, + { "type": "mapgen", - "weight": 100 + "method": "json", + "om_terrain": "s_gun_roof_3", + "object": { + "fill_ter": "t_flat_roof", + "rows": [ + " ", + " ", + " ", + " ", + " |222222222222223 ", + " |..............3 ", + " |..............3 ", + " |..............3 ", + " |..............3 ", + " |225..............3 ", + " |.................3 ", + " |.................3 ", + " |.................3 ", + " |-----------------3 ", + " NNNNNNNNNNNNNNNNNNN ", + " NNNNNNNNNNNNNNNNNNN ", + " N N N N ", + " N N ", + " N N ", + " N N ", + " N N ", + " N N ", + " N N ", + " NNNNNNNNNNNNNNNNNNN " + ], + "palettes": [ "roof_palette" ], + "terrain": { "N": "t_open_air_rooved" }, + "place_nested": [ + { + "chunks": [ + [ "null", 20 ], + [ "roof_2x2_utilities_b", 15 ], + [ "roof_2x2_utilities_c", 5 ], + [ "roof_2x2_utilities_d", 40 ], + [ "roof_2x2_utilities", 50 ] + ], + "x": [ 7, 17 ], + "y": [ 6, 10 ] + } + ] + } } ] diff --git a/data/json/mapgen/shelter.json b/data/json/mapgen/shelter.json index a014a41e57ac2..3accf9376f1cd 100644 --- a/data/json/mapgen/shelter.json +++ b/data/json/mapgen/shelter.json @@ -12,10 +12,14 @@ "om_terrain": [ "shelter" ], "object": { "rows": [ - " ", - " ", - " ", - " ", + " !!!!!!!!!!!!!!!! ", + " `!!!!`!!!!`!!!!` ", + " `!!!!`!!!!`!!!!` ", + " `!!!!`!!!!`!!!!` ", + " `!!!!`!!!!`!!!!` ", + " `!!!!`!!!!`!!!!` ", + " `!!!!`!!!!`!!!!` ", + " &&&&&&&&&&&&&&&& ", " |----:-++-:----| ", " |llll......c..6| ", " |.b.b.b....c...| ", @@ -23,19 +27,15 @@ " |.b.b.b....c...| ", " :.b.b.b........: ", " |..............| ", - " +......>>......+ ", - " +......>>......+ ", + " |......>>......| ", + " |......>>......| ", " |..............| ", " :.b.b.b........: ", " |.b.b.b....c...| ", " |.b.b.b....c...| ", " |||.b.b....c...| ", " |*=........c..x| ", - " |----:-++-:----| ", - " ", - " ", - " ", - " " + " |----:--+-:----| " ], "palettes": [ "shelter" ], "items": { "l": { "item": "shelter_supplies", "chance": 20, "repeat": [ 0, 1 ] } }, @@ -59,6 +59,10 @@ "object": { "fill_ter": "t_flat_roof", "rows": [ + " ", + " ", + " ", + " ", " ", " ", " ", @@ -78,11 +82,7 @@ " |.:............3 ", " |...........&..3 ", " |>.............3 ", - " |--------------3 ", - " ", - " ", - " ", - " " + " |--------------3 " ], "terrain": { ",": "t_flat_roof", @@ -94,7 +94,7 @@ ">": "t_ladder_down" }, "furniture": { ":": "f_standing_tank", "#": "f_solar_unit", "&": "f_roof_turbine_vent" }, - "place_items": [ { "item": "roof_trash", "x": [ 5, 17 ], "y": [ 5, 18 ], "chance": 50, "repeat": [ 1, 3 ] } ] + "place_items": [ { "item": "roof_trash", "x": [ 5, 17 ], "y": [ 9, 22 ], "chance": 50, "repeat": [ 1, 3 ] } ] } }, { @@ -104,10 +104,14 @@ "om_terrain": [ "shelter_1" ], "object": { "rows": [ - " ", - " ", - " ", - " ", + " !!!!!!!!!!!!!!!! ", + " `!!!!`!!!!`!!!!` ", + " `!!!!`!!!!`!!!!` ", + " `!!!!`!!!!`!!!!` ", + " `!!!!`!!!!`!!!!` ", + " `!!!!`!!!!`!!!!` ", + " `!!!!`!!!!`!!!!` ", + " &&&&&&&&&&&&&&&& ", " |---++---| ", " |-:|........| ", " |...........|:-| ", @@ -115,19 +119,15 @@ " |...........c..| ", " :.bbbbb.....c..: ", " |...........cc.| ", - " +.bbbbb........+ ", - " +........|||...+ ", + " |.bbbbb........| ", + " |........|||...| ", " |.-----..|*=...| ", " :........|||...: ", " |.b.b.b...c|-+-| ", " |.b.b.b...c|..l| ", " |.b.b.b...c|>.l| ", " |..........|>.l| ", - " |----:-++-:----| ", - " ", - " ", - " ", - " " + " |----:--+-:----| " ], "palettes": [ "shelter" ], "items": { "l": { "item": "shelter_supplies", "chance": 20, "repeat": [ 0, 1 ] } }, @@ -151,6 +151,10 @@ "object": { "fill_ter": "t_flat_roof", "rows": [ + " ", + " ", + " ", + " ", " ", " ", " ", @@ -170,11 +174,7 @@ " |..............3 ", " |..............3 ", " |............#.3 ", - " |--------------3 ", - " ", - " ", - " ", - " " + " |--------------3 " ], "terrain": { ",": "t_flat_roof", @@ -186,7 +186,7 @@ ">": "t_ladder_down" }, "furniture": { ":": "f_standing_tank", "#": "f_solar_unit", "&": "f_roof_turbine_vent" }, - "place_items": [ { "item": "roof_trash", "x": [ 5, 17 ], "y": [ 5, 18 ], "chance": 50, "repeat": [ 1, 3 ] } ] + "place_items": [ { "item": "roof_trash", "x": [ 5, 17 ], "y": [ 11, 22 ], "chance": 50, "repeat": [ 1, 3 ] } ] } }, { @@ -196,9 +196,12 @@ "om_terrain": [ "shelter_2" ], "object": { "rows": [ - " ", - " ", - " ", + " `!!!!`!!!!`!!!!` ", + " `!!!!`!!!!`!!!!` ", + " `!!!!`!!!!`!!!!` ", + " `!!!!`!!!!`!!!!` ", + " `!!!!`!!!!`!!!!` ", + " &&&&&&&&&&&&&&&& ", " |-:-++-:-| ", " |--|........|--| ", " |*|c........ccc| ", @@ -216,10 +219,7 @@ " |..c..b..b..c..| ", " |6....b..b....x| ", " |--|........|--| ", - " |-:-++-:-| ", - " ", - " ", - " " + " |-:--+-:-| " ], "palettes": [ "shelter" ], "items": { "l": { "item": "shelter_supplies", "chance": 20, "repeat": [ 0, 1 ] } }, @@ -243,6 +243,9 @@ "object": { "fill_ter": "t_flat_roof", "rows": [ + " ", + " ", + " ", " ", " ", " ", @@ -263,10 +266,7 @@ " |..............3 ", " |..............3 ", " |--|........|--3 ", - " |--------| ", - " ", - " ", - " " + " |--------| " ], "terrain": { ".": "t_flat_roof", @@ -278,7 +278,7 @@ ">": "t_ladder_down" }, "furniture": { ":": "f_standing_tank", "#": "f_solar_unit", "&": "f_roof_turbine_vent" }, - "place_items": [ { "item": "roof_trash", "x": [ 5, 17 ], "y": [ 5, 18 ], "chance": 50, "repeat": [ 1, 3 ] } ] + "place_items": [ { "item": "roof_trash", "x": [ 8, 15 ], "y": [ 7, 22 ], "chance": 50, "repeat": [ 1, 3 ] } ] } }, { diff --git a/data/json/mapgen_palettes/apartment.json b/data/json/mapgen_palettes/apartment.json index 7664a73da4bf0..cb7dcd1696717 100644 --- a/data/json/mapgen_palettes/apartment.json +++ b/data/json/mapgen_palettes/apartment.json @@ -4,7 +4,7 @@ "id": "apartment_palette", "terrain": { " ": [ [ "t_dirt", 5 ], [ "t_grass", 16 ], [ "t_grass_long", 5 ], [ "t_underbrush", 1 ] ], - "+": [ "t_door_c", "t_door_c", "t_door_o" ], + "+": [ [ "t_door_c", 2 ], "t_door_o" ], "-": "t_wall", "%": "t_rock", "=": "t_door_metal_c", @@ -14,7 +14,7 @@ "R": "t_railing_v", "W": "t_window", "s": "t_sidewalk", - "w": [ "t_window_domestic", "t_window_domestic", "t_window_domestic", "t_curtains" ], + "w": [ [ "t_window_domestic", 3 ], "t_curtains" ], "x": "t_console_broken", "|": "t_wall", "z": "t_flat_roof", @@ -45,44 +45,125 @@ "M": "t_machinery_heavy" }, "furniture": { - "A": [ "f_armchair", "f_armchair", "f_null" ], + "a": "f_small_satelitte_dish", + "A": [ [ "f_armchair", 2 ], "f_null" ], + "b": "f_bathtub", "B": "f_bed", + "c": "f_counter", + "C": "f_counter", + "d": "f_dresser", + "e": "f_fridge", "F": "f_sofa", + "h": [ [ "f_chair", 2 ], "f_null" ], + "I": "f_floor_lamp", + "j": "f_trashcan", + "l": [ [ "f_stool", 2 ], "f_null" ], + "n": "f_table", + "o": "f_bookcase", "O": "f_oven", "p": "f_mailbox", - "l": [ "f_stool", "f_stool", "f_null" ], - "Y": "f_rack_coat", + "Q": "f_air_conditioner", + "r": "f_rack", "S": "f_sink", + "t": "f_table", + "u": "f_cupboard", + "X": [ [ "f_wardrobe", 2 ], "f_dresser" ], + "Y": "f_rack_coat", + "1": "f_cupboard", + "2": "f_cupboard", + "3": "f_sink", "^": [ "f_indoor_plant", "f_indoor_plant_y" ], + "(": "f_solar_unit", + "&": "f_chimney", + "@": "f_TV_antenna" + }, + "toilets": { "T": { } }, + "items": { + "B": { "item": "bed", "chance": 60 }, + "d": { "item": "dresser", "chance": 70, "repeat": [ 1, 3 ] }, + "e": { "item": "fridge", "chance": 70, "repeat": [ 1, 10 ] }, + "j": { "item": "trash", "chance": 65, "repeat": [ 1, 3 ] }, + "o": [ + { "item": "magazines", "chance": 30 }, + { "item": "novels", "chance": 40 }, + { "item": "alcohol", "chance": 30 }, + { "item": "manuals", "chance": 20 } + ], + "O": { "item": "oven", "chance": 70 }, + "p": { "item": "mail", "chance": 30, "repeat": [ 2, 5 ] }, + "r": [ { "item": "dresser", "chance": 30 }, { "item": "jackets", "chance": 60 } ], + "S": [ { "item": "softdrugs", "chance": 70 }, { "item": "cleaning", "chance": 50 } ], + "T": [ { "item": "magazines", "chance": 50 }, { "item": "novels", "chance": 50 } ], + "u": [ + { "item": "cleaning", "chance": 50 }, + { "item": "home_hw", "chance": 30 }, + { "item": "cannedfood", "chance": 50, "repeat": [ 1, 10 ] }, + { "item": "pasta", "chance": 50, "repeat": [ 1, 5 ] } + ], + "X": [ { "item": "bed", "chance": 60, "repeat": [ 1, 3 ] }, { "item": "dresser", "chance": 70, "repeat": [ 1, 9 ] } ], + "Y": { "item": "coat_rack", "chance": 35, "repeat": [ 1, 4 ] }, + "1": [ { "item": "SUS_dishes" }, { "item": "SUS_silverware" }, { "item": "SUS_knife_drawer" } ], + "2": [ { "item": "SUS_cookware" }, { "item": "SUS_utensils" } ], + "3": [ { "item": "SUS_junk_drawer" }, { "item": "SUS_kitchen_sink" } ] + }, + "item": { "n": { "item": "television", "chance": 70 } } + }, + { + "type": "palette", + "id": "apartment_con_old", + "terrain": { + " ": [ [ "t_grass", 3 ], "t_dirt" ], + "#": "t_rock", + "%": "t_shrub", + "+": "t_door_c", + "-": "t_wall", + "|": "t_wall", + "<": "t_stairs_up", + "=": "t_door_metal_c", + ">": "t_stairs_down", + "D": "t_door_locked_interior", + "E": "t_elevator", + "G": "t_door_glass_c", + "R": "t_railing_v", + "p": "t_grass", + "s": "t_sidewalk", + "w": "t_window", + "X": "t_door_locked", + "x": "t_console_broken" + }, + "furniture": { + "A": "f_armchair", + "B": "f_bed", "b": "f_bathtub", "c": "f_counter", - "C": "f_counter", "d": "f_dresser", "e": "f_fridge", - "h": [ "f_chair", "f_chair", "f_null" ], + "F": "f_sofa", + "h": "f_chair", + "l": "f_locker", "o": "f_bookcase", + "O": "f_oven", + "p": "f_mailbox", + "Q": "f_stool", "r": "f_rack", + "S": "f_sink", "t": "f_table", + "T": "f_toilet", "u": "f_cupboard", - "X": [ "f_wardrobe", "f_wardrobe", "f_null" ], - "Q": "f_air_conditioner", - "(": "f_solar_unit", - "&": "f_chimney", - "a": "f_small_satelitte_dish", - "@": "f_TV_antenna", - "I": "f_floor_lamp", - "j": "f_trashcan", - "n": "f_table" + "Y": "f_rack_coat", + "1": "f_cupboard", + "2": "f_cupboard", + "3": "f_sink", + "^": "f_indoor_plant" }, "toilets": { "T": { } }, "items": { - "j": { "item": "trash", "chance": 65, "repeat": [ 1, 3 ] }, "B": { "item": "bed", "chance": 60 }, "O": { "item": "oven", "chance": 70 }, "S": [ { "item": "softdrugs", "chance": 70 }, { "item": "cleaning", "chance": 50 } ], - "T": [ { "item": "magazines", "chance": 50 }, { "item": "novels", "chance": 50 } ], "d": { "item": "dresser", "chance": 70 }, "e": { "item": "fridge", "chance": 70 }, + "f": [ { "item": "magazines", "chance": 70 }, { "item": "novels", "chance": 50 } ], "o": [ { "item": "magazines", "chance": 30 }, { "item": "novels", "chance": 40 }, @@ -97,8 +178,10 @@ { "item": "pasta", "chance": 50 } ], "Y": { "item": "coat_rack", "chance": 35, "repeat": [ 1, 4 ] }, - "p": { "item": "mail", "chance": 30, "repeat": [ 2, 5 ] } - }, - "item": { "n": { "item": "television", "chance": 70 } } + "p": { "item": "mail", "chance": 30, "repeat": [ 2, 5 ] }, + "1": [ { "item": "SUS_dishes" }, { "item": "SUS_silverware" }, { "item": "SUS_knife_drawer" } ], + "2": [ { "item": "SUS_cookware" }, { "item": "SUS_utensils" } ], + "3": [ { "item": "SUS_junk_drawer" }, { "item": "SUS_kitchen_sink" } ] + } } ] diff --git a/data/json/mapgen_palettes/apartment_con_old.json b/data/json/mapgen_palettes/apartment_con_old.json deleted file mode 100644 index e8e5915c4ab31..0000000000000 --- a/data/json/mapgen_palettes/apartment_con_old.json +++ /dev/null @@ -1,48 +0,0 @@ -[ - { - "type": "palette", - "id": "apartment_con_old", - "furniture": { - "A": "f_armchair", - "B": "f_bed", - "F": "f_sofa", - "O": "f_oven", - "S": "f_sink", - "T": "f_toilet", - "Q": "f_stool", - "^": "f_indoor_plant", - "b": "f_bathtub", - "c": "f_counter", - "Y": "f_rack_coat", - "d": "f_dresser", - "e": "f_fridge", - "h": "f_chair", - "l": "f_locker", - "o": "f_bookcase", - "r": "f_rack", - "t": "f_table", - "u": "f_cupboard", - "p": "f_mailbox" - }, - "terrain": { - " ": [ "t_grass", "t_grass", "t_grass", "t_dirt" ], - "#": "t_rock", - "%": "t_shrub", - "+": "t_door_c", - "-": "t_wall", - "<": "t_stairs_up", - "=": "t_door_metal_c", - ">": "t_stairs_down", - "D": "t_door_locked_interior", - "E": "t_elevator", - "G": "t_door_glass_c", - "R": "t_railing_v", - "X": "t_door_locked", - "s": "t_sidewalk", - "w": "t_window", - "x": "t_console_broken", - "|": "t_wall", - "p": "t_grass" - } - } -] diff --git a/data/json/mapgen_palettes/farm.json b/data/json/mapgen_palettes/farm.json index 364fa8eb51512..4d65b2794ccf2 100644 --- a/data/json/mapgen_palettes/farm.json +++ b/data/json/mapgen_palettes/farm.json @@ -2,74 +2,94 @@ { "type": "palette", "id": "farm", - "furniture": { - "B": "f_bed", - "H": "f_armchair", - "P": "f_mailbox", - "S": "f_sink", - "T": "f_toilet", - "Y": "f_rack_coat", - "b": "f_bathtub", - "d": "f_dresser", - "e": "f_fridge", - "h": "f_chair", - "k": "f_desk", - "l": "f_locker", - "o": "f_oven", - "u": "f_cupboard", - "y": "f_hay", - "m": "f_makeshift_bed", - "r": "f_rack", - "s": "f_rack" - }, "terrain": { - " ": [ "t_grass", "t_grass", "t_grass", "t_dirt" ], - "Q": "t_dirtfloor", - "#": "t_wall_glass", + " ": [ [ "t_grass", 3 ], "t_dirt" ], + "#": "t_wall_wood", "$": "t_shrub", "&": "t_water_pump", - "+": "t_door_glass_c", + "+": "t_door_c", + "~": "t_door_glass_c", ",": "t_dirt", "-": "t_wall", ".": "t_floor", - "1": "t_column", - "2": "t_fence_h", - "3": "t_fence_v", - "5": "t_barndoor", - "B": "t_floor", + "_": "t_dirtfloor", + "|": "t_wall", + ";": "t_fence_wire", + "A": "t_bars", + "c": "t_door_makeshift_c", "D": "t_dirtmound", "E": "t_dirtmoundfloor", "F": "t_fence_barbed", - "H": "t_fence_h", + "g": "t_fencegate_c", + "G": "t_wall_glass", + "l": "t_dirtfloor", "M": "t_door_metal_locked", "O": "t_barndoor", "P": "t_grass", - "S": "t_floor", - "T": "t_floor", + "Q": [ [ "t_grass", 3 ], "t_dirt" ], + "r": "t_dirtfloor", + "R": "t_dirtfloor", + "s": "t_dirtfloor", "W": "t_window_boarded", - "Y": "t_floor", - "_": "t_dirtfloor", - "b": "t_floor", - "d": "t_floor", - "e": "t_floor", - "g": "t_chaingate_c", - "h": "t_floor", - "k": "t_floor", - "l": "t_floor", - "o": "t_floor", - "u": "t_floor", "w": "t_window_domestic", "y": "t_dirtfloor", - "|": "t_wall", - "m": "t_floor", - "=": "t_door_metal_locked", - "A": "t_bars", - "r": "t_dirtfloor", - "s": "t_dirtfloor", - ";": "t_fence_wire", + "1": "t_column", + "2": "t_fence_h", + "3": "t_fence_v", "7": "t_dirtfloor", - "8": "t_dirtfloor", - "c": "t_door_makeshift_c" + "8": "t_dirtfloor" + }, + "furniture": { + "B": "f_bed", + "b": "f_bathtub", + "d": "f_dresser", + "e": "f_fridge", + "H": "f_armchair", + "h": "f_chair", + "k": "f_desk", + "l": "f_locker", + "m": "f_makeshift_bed", + "o": "f_oven", + "P": "f_mailbox", + "r": "f_rack", + "s": "f_rack", + "S": "f_sink", + "T": "f_toilet", + "u": "f_cupboard", + "Y": "f_rack_coat", + "y": "f_hay", + "4": "f_cupboard", + "5": "f_sink", + "6": "f_cupboard" + }, + "toilets": { "T": { } }, + "items": { + "B": { "item": "bed", "chance": 60 }, + "b": { "item": "shower", "chance": 70 }, + "D": { "item": "hydro", "chance": 5 }, + "d": [ { "item": "dresser", "chance": 80, "repeat": [ 1, 6 ] }, { "item": "homeguns", "chance": 20 } ], + "e": { "item": "fridge", "chance": 65, "repeat": [ 1, 15 ] }, + "h": { "item": "bedroom", "chance": 65 }, + "H": { "item": "livingroom", "chance": 65 }, + "k": { "item": "bedroom", "chance": 65 }, + "l": [ + { "item": "tools_earthworking", "chance": 65 }, + { "item": "mechanics", "chance": 40 }, + { "item": "home_hw", "chance": 50 }, + { "item": "tools_common", "chance": 50 } + ], + "P": { "item": "mail", "chance": 30, "repeat": [ 2, 5 ] }, + "Q": { "item": "farming_tools", "chance": 15 }, + "S": { "item": "softdrugs", "chance": 70 }, + "u": [ + { "item": "kitchen", "chance": 70, "repeat": [ 1, 4 ] }, + { "item": "cannedfood", "chance": 65, "repeat": [ 1, 10 ] }, + { "item": "moonshine_brew", "chance": 65 } + ], + "Y": { "item": "coat_rack", "chance": 35, "repeat": [ 1, 4 ] }, + "4": [ { "item": "SUS_dishes" }, { "item": "SUS_silverware" }, { "item": "SUS_knife_drawer" } ], + "5": [ { "item": "SUS_junk_drawer" }, { "item": "SUS_kitchen_sink" } ], + "6": [ { "item": "SUS_cookware" }, { "item": "SUS_utensils" } ] } } ] diff --git a/data/json/mapgen_palettes/lmoe.json b/data/json/mapgen_palettes/lmoe.json new file mode 100644 index 0000000000000..d23231243d0e0 --- /dev/null +++ b/data/json/mapgen_palettes/lmoe.json @@ -0,0 +1,128 @@ +[ + { + "type": "palette", + "id": "bunker", + "terrain": { + "#": "t_rock", + "*": "t_chaingate_c", + "+": "t_door_metal_c", + "-": "t_scrap_wall", + "_": "t_metal_floor", + ",": "t_carpet_metal", + "1": "t_column", + "<": "t_stairs_up", + "=": "t_chainfence", + "|": "t_wall_metal", + ":": "t_secretdoor_metal_c", + ";": "t_secretdoor_metal_o", + "~": "t_water_pump", + "G": "t_generator_broken", + "t": "t_metal_floor" + }, + "furniture": { + "A": "f_air_filter", + "a": "f_standing_tank", + "b": "f_bookcase", + "B": "f_bed", + "c": "f_counter", + "C": "f_cupboard", + "d": "f_dresser", + "D": "f_desk", + "e": "f_ergometer", + "E": "f_exercise", + "F": "f_fridge", + "f": "f_sofa", + "h": "f_chair", + "H": "f_water_heater", + "K": "f_sink", + "l": "f_utility_shelf", + "L": "f_table", + "O": "f_oven", + "P": "f_punching_bag", + "r": "f_rack", + "R": "f_rack", + "s": "f_shower", + "S": "f_woodstove", + "T": "f_table", + "U": "f_utility_shelf", + "u": "f_utility_shelf", + "v": "f_utility_shelf", + "V": "f_utility_shelf", + "w": "f_wardrobe", + "W": "f_water_purifier", + "Y": "f_rack_coat", + "^": "f_rubble", + "&": "f_trashcan", + "{": "f_rack", + "}": "f_bookcase" + }, + "toilets": { "t": { } } + }, + { + "type": "palette", + "id": "empty_bunker_items", + "items": { + "b": [ { "item": "manuals", "chance": 60 }, { "item": "textbooks", "chance": 40 } ], + "B": { "item": "bed", "chance": 70, "repeat": [ 1, 2 ] }, + "c": { "item": "hardware", "chance": 50 }, + "C": [ { "item": "dining", "chance": 30, "repeat": [ 1, 3 ] }, { "item": "oven", "chance": 20 } ], + "d": { "item": "allclothes", "chance": 80, "repeat": [ 2, 4 ] }, + "D": { "item": "office", "chance": 70 }, + "l": { "item": "hardware", "chance": 50, "repeat": [ 1, 2 ] }, + "L": { "item": "dining", "chance": 30 }, + "r": { "item": "stash_wood", "chance": 85 }, + "R": { "item": "hardware", "chance": 80 }, + "S": { "item": "oven", "chance": 80 }, + "T": { "item": "tools_common", "chance": 60, "repeat": [ 1, 2 ] }, + "U": { "item": "gear_survival", "chance": 20, "repeat": [ 3, 5 ] }, + "u": [ { "item": "cannedfood", "chance": 20, "repeat": [ 1, 5 ] }, { "item": "pasta", "chance": 10, "repeat": [ 1, 3 ] } ], + "v": { "item": "softdrugs", "chance": 50 }, + "V": { "item": "bags", "chance": 30 }, + "w": { "item": "allclothes", "chance": 80, "repeat": [ 2, 4 ] }, + "Y": [ { "item": "jackets", "chance": 15 }, { "item": "hats", "chance": 15 }, { "item": "winter", "chance": 10 } ], + "^": { "item": "shelter", "chance": 30 }, + "{": [ { "item": "lmoe_guns", "chance": 80 }, { "item": "ammo", "y": 3, "chance": 5, "repeat": [ 3, 7 ] } ], + "}": { "item": "novels", "chance": 90, "repeat": [ 3, 8 ] } + } + }, + { + "type": "palette", + "id": "bunker_ext", + "terrain": { + " ": [ [ "t_grass", 10 ], [ "t_grass_long", 2 ], [ "t_shrub", 1 ], [ "t_dirt", 5 ] ], + "_": "t_dirt", + "#": "t_rock", + "$": [ + "t_tree", + "t_tree_apple", + "t_tree_peach", + "t_tree_pear", + "t_tree_hickory", + "t_tree_beech", + "t_tree_coffee", + [ "t_tree_young", 14 ], + [ "t_shrub", 20 ] + ], + "S": [ + [ "t_grass", 15 ], + [ "t_tree_young", 2 ], + [ "t_shrub", 2 ], + "t_tree", + "t_tree_apple", + "t_tree_peach", + "t_tree_pear", + "t_tree_hickory", + "t_tree_beech", + "t_tree_coffee" + ], + "v": "t_open_air", + "+": "t_door_metal_c", + ".": "t_rock_floor", + ">": "t_stairs_down", + ")": "t_slope_up", + "(": "t_slope_down", + "T": [ "t_tree", "t_tree_apple", "t_tree_peach", "t_tree_pear", "t_tree_hickory", "t_tree_beech", "t_tree_coffee" ] + }, + "items": { " ": [ { "item": "forest", "chance": 1 }, { "item": "field", "chance": 2 } ] } + } +] diff --git a/data/json/mapgen_palettes/mil_surplus.json b/data/json/mapgen_palettes/mil_surplus.json index 84cc57cc9b85e..2124529ff2514 100644 --- a/data/json/mapgen_palettes/mil_surplus.json +++ b/data/json/mapgen_palettes/mil_surplus.json @@ -18,25 +18,38 @@ "R": "t_floor", "S": "t_floor", "~": "t_sidewalk", - "-": "t_wall", - "|": "t_wall", + "-": "t_wall_w", + "|": "t_wall_w", "'": "t_window", "`": "t_window_alarm", "+": "t_door_c", - "/": "t_door_curtain_c" + "/": "t_door_curtain_c", + "Y": "t_concrete", + "U": "t_concrete", + "4": "t_gutter_downspout", + "<": "t_ladder_up" }, "furniture": { "#": "f_counter", + "U": [ "f_dumpster", "f_recycle_bin" ], "h": "f_chair", "%": "f_sink", "@": "f_mannequin", + "L": "f_locker", "^": [ "f_bigmirror", "f_bigmirror", "f_bigmirror", "f_bigmirror_b" ], "R": "f_rack", "S": "f_stool", "A": "f_rack", "B": "f_rack", "C": "f_rack", - "D": [ "f_displaycase", "f_displaycase", "f_displaycase", "f_displaycase", "f_displaycase_b" ] + "D": [ "f_displaycase", "f_displaycase", "f_displaycase", "f_displaycase", "f_displaycase_b" ], + "*": "f_canvas_wall", + "8": "f_groundsheet", + "]": "f_canvas_door", + "Q": "f_camp_chair", + "b": "f_brazier", + "r": "f_tourist_table", + "d": "f_mannequin" }, "toilets": { "&": { } } } diff --git a/data/json/mapgen_palettes/refugee_center.json b/data/json/mapgen_palettes/refugee_center.json index 4a4c413062c7c..d69d6ede278e6 100644 --- a/data/json/mapgen_palettes/refugee_center.json +++ b/data/json/mapgen_palettes/refugee_center.json @@ -57,5 +57,26 @@ "~": "f_shower" }, "toilets": { "t": { } } + }, + { + "type": "palette", + "id": "rc_grounds", + "terrain": { + "'": [ [ "t_grass", 30 ], [ "t_dirt", 10 ], [ "t_grass_dead", 3 ] ], + ",": [ [ "t_pavement_y", 300 ], [ "t_dirt", 2 ], "t_grass_dead" ], + ".": [ + [ "t_grass", 600 ], + [ "t_dirt", 200 ], + [ "t_grass_dead", 60 ], + [ "t_shrub", 15 ], + [ "t_tree_young", 10 ], + [ "t_tree", 3 ], + [ "t_tree_dead", 2 ], + "t_water_sh", + "t_tree_pine" + ], + "|": [ [ "t_chainfence", 30 ], [ "t_chainfence_posts", 4 ], [ "t_grass", 2 ], "t_shrub" ], + "_": [ [ "t_pavement", 300 ], [ "t_dirt", 2 ], "t_grass_dead" ] + } } ] diff --git a/data/json/mapgen_palettes/shelter.json b/data/json/mapgen_palettes/shelter.json index 919ef554ff4ca..7456276e1d17d 100644 --- a/data/json/mapgen_palettes/shelter.json +++ b/data/json/mapgen_palettes/shelter.json @@ -4,6 +4,9 @@ "id": "shelter", "terrain": { " ": [ "t_grass", "t_grass", "t_grass", "t_dirt" ], + "!": "t_pavement", + "`": "t_pavement_y", + "&": "t_sidewalk", "#": "t_rock", "+": "t_door_c", "-": "t_wall_w", diff --git a/data/json/martialarts.json b/data/json/martialarts.json index b71b85556d3b0..e86f8b2766b8f 100644 --- a/data/json/martialarts.json +++ b/data/json/martialarts.json @@ -1009,5 +1009,65 @@ "tec_wingchun_disarm" ], "weapons": [ "butterfly_swords", "long_pole" ] + }, + { + "type": "martial_art", + "id": "style_swordsmanship", + "name": "Medieval Swordsmanship", + "description": "The art of the longsword and sword & shield, preceding the later development of fencing. Designed for combat both unarmored and in armor, it includes grappling as well as defensive and offensive sword techniques. This treatise compares the Italian and German traditions of medieval combat with detailed step-by-step pictures.", + "initiate": [ "You stand tall and become vigilant against attacks.", "%s stands tall and becomes vigilant." ], + "arm_block": 99, + "leg_block": 99, + "onattack_buffs": [ + { + "id": "swordsmanship_attack_buff", + "name": "Perfect Defense", + "description": "Bonus dodges after an attack.", + "buff_duration": 3, + "melee_allowed": true, + "bonus_dodges": 2 + } + ], + "ondodge_buffs": [ + { + "id": "swordsmanship_counter", + "name": "Displacement", + "description": "The enemy has presented an opening in their defense.", + "min_melee": 2, + "melee_allowed": true, + "max_stacks": 1, + "buff_duration": 2 + } + ], + "techniques": [ + "tec_swordsmanship_counter", + "tec_swordsmanship_grab", + "tec_swordsmanship_break", + "tec_swordsmanship_zornhau", + "tec_swordsmanship_unterhau", + "tec_swordsmanship_mordhau" + ], + "weapons": [ + "sword_wood", + "sword_nail", + "sword_crude", + "zweihander", + "zweihander_inferior", + "zweihander_fake", + "zweifire_off", + "zweifire_on", + "arming_sword", + "arming_sword_inferior", + "arming_sword_fake", + "longsword", + "longsword_inferior", + "longsword_fake", + "estoc", + "estoc_inferior", + "estoc_fake", + "jian", + "jian_inferior", + "jian_fake" + ] } ] diff --git a/data/json/materials.json b/data/json/materials.json index 2663ef3a02f6b..77a6eebd733fd 100644 --- a/data/json/materials.json +++ b/data/json/materials.json @@ -1249,7 +1249,7 @@ { "type": "material", "ident": "dried_vegetable", - "name": "Dried vegetable", + "name": "Dried Vegetable", "density": 4, "specific_heat_liquid": 2.5, "specific_heat_solid": 3.5, @@ -1301,7 +1301,7 @@ { "type": "material", "ident": "processed_food", - "name": "Processed fod", + "name": "Processed Food", "density": 4, "specific_heat_liquid": 3, "specific_heat_solid": 2, @@ -1348,7 +1348,7 @@ { "type": "material", "ident": "ice_cream", - "name": "Ice cream", + "name": "Ice Cream", "density": 1, "specific_heat_liquid": 3.15, "specific_heat_solid": 2.74, diff --git a/data/json/monster_drops.json b/data/json/monsterdrops/monster_drops.json similarity index 100% rename from data/json/monster_drops.json rename to data/json/monsterdrops/monster_drops.json diff --git a/data/json/monstergroups.json b/data/json/monstergroups/monstergroups.json similarity index 100% rename from data/json/monstergroups.json rename to data/json/monstergroups/monstergroups.json diff --git a/data/json/monstergroups_egg.json b/data/json/monstergroups/monstergroups_egg.json similarity index 100% rename from data/json/monstergroups_egg.json rename to data/json/monstergroups/monstergroups_egg.json diff --git a/data/json/monsters/mammal.json b/data/json/monsters/mammal.json index 11dbb40c9bb1e..97d4861ca5dec 100644 --- a/data/json/monsters/mammal.json +++ b/data/json/monsters/mammal.json @@ -1805,7 +1805,7 @@ "type": "MONSTER", "name": "lamb", "name_plural": "lambs", - "description": "A timid, hooved grazing mammal, and one of the first animals ever domesticated. Its body is covered in a thick layer of wool, and the males have long, spiraling horns.", + "description": "A timid, hooved grazing mammal, and one of the first animals ever domesticated. Its body is covered in a thick layer of wool, and the males have long, spiraling horns.", "default_faction": "herbivore", "bodytype": "dog", "categories": [ "WILDLIFE" ], @@ -1837,7 +1837,7 @@ "type": "MONSTER", "name": "sheep", "name_plural": "sheep", - "description": "A timid, hooved grazing mammal, and one of the first animals ever domesticated. Its body is covered in a thick layer of wool, and the males have long, spiralling horns.", + "description": "A timid, hooved grazing mammal, and one of the first animals ever domesticated. Its body is covered in a thick layer of wool, and the males have long, spiralling horns.", "default_faction": "herbivore", "bodytype": "dog", "categories": [ "WILDLIFE" ], diff --git a/data/json/monsters.json b/data/json/monsters/monsters.json similarity index 100% rename from data/json/monsters.json rename to data/json/monsters/monsters.json diff --git a/data/json/monsters/zed_lab.json b/data/json/monsters/zed_lab.json index b659598ce9fb7..d0dbeea1ca885 100644 --- a/data/json/monsters/zed_lab.json +++ b/data/json/monsters/zed_lab.json @@ -54,7 +54,7 @@ "id": "mon_zombie_labsecurity", "type": "MONSTER", "name": "zombie security guard", - "description": "A shambling human corpse wearing a grey uniform and bulletproof vest with \"SECURITY\" emblazoned across the front. It looks like the guard was quite physically fit before its death; it moves quickly and powerfully, albeit clumsily.", + "description": "A shambling human corpse wearing a gray uniform and bulletproof vest with \"SECURITY\" emblazoned across the front. It looks like the guard was quite physically fit before its death; it moves quickly and powerfully, albeit clumsily.", "default_faction": "science", "//": "guards are recognised as friendly by the lab's defense system", "categories": [ "CLASSIC" ], diff --git a/data/json/morale_types.json b/data/json/morale_types.json index 53124d5931786..9809242c5e788 100644 --- a/data/json/morale_types.json +++ b/data/json/morale_types.json @@ -249,6 +249,16 @@ "type": "morale_type", "text": "Masochism" }, + { + "id": "morale_perm_noface", + "type": "morale_type", + "text": "You have no face!" + }, + { + "id": "morale_perm_fpmode_on", + "type": "morale_type", + "text": "You feel pumped!" + }, { "id": "morale_perm_hoarder", "type": "morale_type", diff --git a/data/json/mutation_appearance.json b/data/json/mutations/mutation_appearance.json similarity index 100% rename from data/json/mutation_appearance.json rename to data/json/mutations/mutation_appearance.json diff --git a/data/json/mutation_category.json b/data/json/mutations/mutation_category.json similarity index 100% rename from data/json/mutation_category.json rename to data/json/mutations/mutation_category.json diff --git a/data/json/mutation_ordering.json b/data/json/mutations/mutation_ordering.json similarity index 100% rename from data/json/mutation_ordering.json rename to data/json/mutations/mutation_ordering.json diff --git a/data/json/mutation_type.json b/data/json/mutations/mutation_type.json similarity index 100% rename from data/json/mutation_type.json rename to data/json/mutations/mutation_type.json diff --git a/data/json/mutations.json b/data/json/mutations/mutations.json similarity index 99% rename from data/json/mutations.json rename to data/json/mutations/mutations.json index c6c9710a337a5..275a34dac7bfd 100644 --- a/data/json/mutations.json +++ b/data/json/mutations/mutations.json @@ -418,7 +418,7 @@ "id": "ANIMALEMPATH2", "name": "Animal Kinship", "points": 2, - "description": "Something about your presence is calming to animals, and they will treat you with innate trust. This only applies to natural animals such as woodland creatures.", + "description": "Something about your presence is calming to animals, and they will treat you with innate trust. This only applies to natural animals such as woodland creatures.", "category": [ "ELFA" ], "prereqs": [ "ANIMALEMPATH" ], "cancels": [ "ANIMALDISCORD" ] @@ -630,9 +630,9 @@ "id": "MARTIAL_ARTS5", "name": "Melee Weapon Training", "points": 3, - "description": "You have practiced fighting with weapons. You start with your choice of Eskrima, Fencing, Pentjak Silat, Niten Ichi-Ryu, or Sōjutsu.", + "description": "You have practiced fighting with weapons. You start with your choice of Eskrima, Fencing, Pentjak Silat, Medieval Swordsmanship, Niten Ichi-Ryu, or Sōjutsu.", "starting_trait": true, - "initial_ma_styles": [ "style_eskrima", "style_fencing", "style_silat", "style_niten", "style_sojutsu" ], + "initial_ma_styles": [ "style_eskrima", "style_fencing", "style_silat", "style_niten", "style_sojutsu", "style_swordsmanship" ], "valid": false }, { @@ -660,7 +660,7 @@ "id": "SAVINGS", "name": "Savings", "points": 1, - "description": "You had some money stashed at the bank for a rainy day. Now that the storm is raging, it's a last call to use it maybe?", + "description": "You had some money stashed at the bank for a rainy day. Now that the storm is raging, it's a last call to use it maybe?", "starting_trait": true, "purifiable": false, "valid": false, @@ -671,7 +671,7 @@ "id": "DEBT", "name": "Debt", "points": -1, - "description": "You needed money and had a big loan in a bank. Good thing nobody will come to collect it now, right? Right?", + "description": "You needed money and had a big loan in a bank. Good thing nobody will come to collect it now, right? Right?", "starting_trait": true, "purifiable": false, "valid": false, @@ -2237,7 +2237,7 @@ "points": 6, "visibility": 10, "ugliness": 5, - "description": "Your leaves have grown in size and prominence, with additional leaves sprouting along your arms. While your arms and head are uncovered, you will photosynthesize additional nutrients while in sunlight. Reduces wet effects.", + "description": "Your leaves have grown in size and prominence, with additional leaves sprouting along your arms. While your arms and head are uncovered, you will photosynthesize additional nutrients while in sunlight. Reduces wet effects.", "prereqs": [ "LEAVES" ], "prereqs2": [ "TRANSPIRATION" ], "threshreq": [ "THRESH_PLANT" ], @@ -2253,7 +2253,7 @@ "points": 9, "visibility": 12, "ugliness": 6, - "description": "You leaves are vibrant, large, and green, and have become a major source of nutrition for your body. Whenever your arms and head are uncovered you will gain a large amount of nutrition by standing in the sunlight. Reduces wet effects.", + "description": "You leaves are vibrant, large, and green, and have become a major source of nutrition for your body. Whenever your arms and head are uncovered you will gain a large amount of nutrition by standing in the sunlight. Reduces wet effects.", "prereqs": [ "LEAVES2" ], "prereqs2": [ "TRANSPIRATION" ], "threshreq": [ "THRESH_PLANT" ], @@ -2268,7 +2268,7 @@ "points": -5, "visibility": 0, "ugliness": 0, - "description": "You body has begun moving nutrients via the evaporation of water. This increases your thrist when it's hot, but reduces it when it's cold.", + "description": "You body has begun moving nutrients via the evaporation of water. This increases your thirst when it's hot, but reduces it when it's cold.", "prereqs": [ "PLANTSKIN", "BARK" ], "prereqs2": [ "LEAVES" ], "threshreq": [ "THRESH_PLANT" ], @@ -5239,7 +5239,7 @@ "id": "TREE_COMMUNION", "name": "Mycorrhizal Communion", "points": 2, - "description": "You have gained the ability to commune with trees and comprehend their ancient wisdom. Activate next to a tree to gradually gain overmap vision through connected forests.", + "description": "You have gained the ability to commune with trees and comprehend their ancient wisdom. Activate next to a tree to gradually gain overmap vision through connected forests.", "prereqs": [ "HAIRROOTS", "ROOTS2", "ROOTS3" ], "threshreq": [ "THRESH_PLANT", "THRESH_ELFA" ], "category": [ "PLANT", "ELFA" ], @@ -5256,6 +5256,7 @@ "changes_to": [ "COLDBLOOD2" ], "types": [ "METABOLISM" ], "category": [ "FISH", "CEPHALOPOD", "SPIDER" ], + "temperature_speed_modifier": 1, "metabolism_modifier": -0.333 }, { @@ -5269,6 +5270,7 @@ "changes_to": [ "COLDBLOOD3" ], "types": [ "METABOLISM" ], "category": [ "RAPTOR", "PLANT" ], + "temperature_speed_modifier": 0.333, "metabolism_modifier": -0.5 }, { @@ -5282,6 +5284,7 @@ "changes_to": [ "COLDBLOOD4" ], "types": [ "METABOLISM" ], "category": [ "INSECT", "LIZARD" ], + "temperature_speed_modifier": 0.5, "metabolism_modifier": -0.5 }, { @@ -5296,6 +5299,7 @@ "purifiable": false, "types": [ "METABOLISM" ], "category": [ "LIZARD", "PLANT" ], + "temperature_speed_modifier": 0.5, "metabolism_modifier": -0.5 }, { @@ -6041,6 +6045,16 @@ "purifiable": false, "profession": true }, + { + "type": "mutation", + "id": "PROF_FOODP", + "name": "True Foodperson", + "points": 0, + "description": "You are the true Foodperson, some might think Foodperson is just a mascot, but you know better. You are Foodperson, the mask has become your face, you are real and the only thing standing between this world and oblivion is you.", + "valid": false, + "purifiable": false, + "profession": true + }, { "type": "mutation", "id": "PROF_MED", diff --git a/data/json/npcs/NC_CITY_COP.json b/data/json/npcs/NC_CITY_COP.json index 917500e4ea9a1..457d9aed84bce 100644 --- a/data/json/npcs/NC_CITY_COP.json +++ b/data/json/npcs/NC_CITY_COP.json @@ -42,6 +42,8 @@ { "id": "NC_CITY_COP_misc", "type": "item_group", + "ammo": 75, + "magazine": 100, "items": [ [ "ring", 30 ], [ "gold_ear", 30 ], diff --git a/data/json/npcs/NC_JUNK_SHOPKEEP.json b/data/json/npcs/NC_JUNK_SHOPKEEP.json index de09e022ad3ba..b523682f550c9 100644 --- a/data/json/npcs/NC_JUNK_SHOPKEEP.json +++ b/data/json/npcs/NC_JUNK_SHOPKEEP.json @@ -12,6 +12,8 @@ { "type": "item_group", "id": "NC_JUNK_SHOPKEEP_misc", + "ammo": 75, + "magazine": 100, "items": [ [ "vest", 40 ], [ "kevlar", 15 ], diff --git a/data/json/npcs/NC_TRUE_FOODPERSON.json b/data/json/npcs/NC_TRUE_FOODPERSON.json new file mode 100644 index 0000000000000..2e4e0f0c0533e --- /dev/null +++ b/data/json/npcs/NC_TRUE_FOODPERSON.json @@ -0,0 +1,35 @@ +[ + { + "type": "item_group", + "id": "NC_TRUE_FOODPERSON_worn", + "subtype": "collection", + "entries": [ + { "item": "foodperson_mask" }, + { "item": "briefs" }, + { "item": "socks" }, + { "item": "pants_cargo" }, + { "item": "dress_shirt" }, + { "item": "chestguard_hard" }, + { "item": "cape_fp" }, + { "item": "armguard_hard" }, + { "item": "legguard_hard" }, + { "item": "gloves_rubber" }, + { "item": "boots_rubber" } + ] + }, + { + "id": "NC_TRUE_FOODPERSON_melee", + "type": "item_group", + "items": [ [ "bat", 50 ], [ "null", 50 ] ] + }, + { + "type": "item_group", + "id": "NC_TRUE_FOODPERSON_misc", + "subtype": "collection", + "entries": [ + { "item": "medium_disposable_cell", "prob": 90 }, + { "group": "snacks_fancy", "prob": 30, "charges": 2 }, + { "group": "snacks", "prob": 20, "charges": 2 } + ] + } +] diff --git a/data/json/npcs/TALK_COMMON_ALLY.json b/data/json/npcs/TALK_COMMON_ALLY.json index 7a3f2af0705db..f5df41118c237 100644 --- a/data/json/npcs/TALK_COMMON_ALLY.json +++ b/data/json/npcs/TALK_COMMON_ALLY.json @@ -741,10 +741,16 @@ "effect": "sort_loot" }, { - "text": "Please work on any construction taks that you know how to finish.", + "text": "Please work on any unfinished construction task that you know how to finish.", "topic": "TALK_DONE", "condition": { "not": "npc_has_activity" }, "effect": "do_construction" + }, + { + "text": "Please work on any contruction blueprint zones nearby.", + "topic": "TALK_DONE", + "condition": { "not": "npc_has_activity" }, + "effect": "do_blueprint_construction" } ] }, diff --git a/data/json/npcs/TALK_TEST.json b/data/json/npcs/TALK_TEST.json index b7080abc314ad..46dfaf5c2ab7c 100644 --- a/data/json/npcs/TALK_TEST.json +++ b/data/json/npcs/TALK_TEST.json @@ -648,7 +648,7 @@ { "type": "talk_topic", "id": "TALK_TEST_SPEAKER_EFFECT_SENTINEL_CONDITIONAL", - "speaker_effect": { "sentinel": "spend500", "condition": { "u_has_cash": 750 }, "effect": { "u_spend_cash": 500 } }, + "speaker_effect": { "sentinel": "spend500", "condition": { "u_are_owed": 750 }, "effect": { "u_spend_cash": 500 } }, "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" } ] }, @@ -663,8 +663,8 @@ "type": "talk_topic", "id": "TALK_TEST_SPEAKER_EFFECT_COMPOUND_CONDITIONAL", "speaker_effect": [ - { "condition": { "u_has_cash": 1500 }, "effect": { "u_spend_cash": 1000 } }, - { "condition": { "u_has_cash": 750 }, "effect": { "u_spend_cash": 500 } } + { "condition": { "u_are_owed": 1500 }, "effect": { "u_spend_cash": 1000 } }, + { "condition": { "u_are_owed": 750 }, "effect": { "u_spend_cash": 500 } } ], "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" } ] @@ -680,8 +680,8 @@ "type": "talk_topic", "id": "TALK_TEST_SPEAKER_EFFECT_COMPOUND_SENTINEL_CONDITIONAL", "speaker_effect": [ - { "sentinel": "spend250", "condition": { "u_has_cash": 750 }, "effect": { "u_spend_cash": 250 } }, - { "sentinel": "spend500", "condition": { "u_has_cash": 750 }, "effect": { "u_spend_cash": 500 } } + { "sentinel": "spend250", "condition": { "u_are_owed": 750 }, "effect": { "u_spend_cash": 250 } }, + { "sentinel": "spend500", "condition": { "u_are_owed": 750 }, "effect": { "u_spend_cash": 500 } } ], "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" } ] diff --git a/data/json/npcs/TALK_TRUE_FOODPERSON.json b/data/json/npcs/TALK_TRUE_FOODPERSON.json new file mode 100644 index 0000000000000..f7f74ec7514b2 --- /dev/null +++ b/data/json/npcs/TALK_TRUE_FOODPERSON.json @@ -0,0 +1,550 @@ +[ + { + "id": "TALK_TRUE_FOODPERSON", + "type": "talk_topic", + "dynamic_line": { + "u_is_wearing": "foodperson_mask", + "yes": { + "npc_has_var": "foodperson_has_talked", + "type": "dialogue", + "context": "foodperson", + "value": "yes", + "no": "What sorcery is this?", + "yes": { + "npc_has_var": "foodperson_meeting_solved", + "type": "dialogue", + "context": "foodperson", + "value": "yes", + "no": "So you're back... Explain yourself!", + "yes": "Greetings friend, it's nice to see you." + } + }, + "no": { + "u_is_wearing": "foodkid_badge", + "yes": "Welcome home Foodkid!", + "no": { + "npc_has_var": "npc_foodperson_impressed", + "type": "dialogue", + "context": "foodperson", + "value": "yes", + "yes": "Greetings friend, it's nice to see you.", + "no": { + "npc_has_var": "foodperson_has_talked", + "type": "dialogue", + "context": "foodperson", + "value": "yes", + "no": "Greeting citizen, what brings you to the FoodLair?", + "yes": "Still here? Take your time, it's rough out there." + } + } + } + }, + "speaker_effect": { "effect": { "npc_add_var": "foodperson_has_talked", "type": "dialogue", "context": "foodperson", "value": "yes" } }, + "responses": [ + { + "condition": { + "or": [ + { + "and": [ + { "npc_has_var": "foodperson_has_talked", "type": "dialogue", "context": "foodperson", "value": "yes" }, + { + "not": { "or": [ { "u_is_wearing": "foodperson_mask" }, { "u_is_wearing": "foodperson_mask_on" } ] } + } + ] + }, + { + "and": [ + { "npc_has_var": "foodperson_meeting_solved", "type": "dialogue", "context": "foodperson", "value": "yes" }, + { + "or": [ + { "u_has_trait": "PROF_FOODP" }, + { "or": [ { "u_is_wearing": "foodperson_mask" }, { "u_is_wearing": "foodperson_mask_on" } ] } + ] + } + ] + } + ] + }, + "text": "Hey. Let's chat for a second.", + "topic": "TALK_FOODPERSON_MAIN" + }, + { + "condition": { + "and": [ + { "not": { "npc_has_var": "foodperson_has_talked", "type": "dialogue", "context": "foodperson", "value": "yes" } }, + { + "and": [ + { "not": { "or": [ { "u_is_wearing": "foodperson_mask" }, { "u_is_wearing": "foodperson_mask_on" } ] } }, + { "not": { "u_is_wearing": "foodkid_badge" } } + ] + } + ] + }, + "text": "Greetings... Foodperson?", + "topic": "TALK_FOODPERSON_INTRODUCTION" + }, + { + "condition": { + "and": [ + { "not": { "npc_has_var": "foodperson_meeting_solved", "type": "dialogue", "context": "foodperson", "value": "yes" } }, + { "not": { "u_has_trait": "PROF_FOODP" } }, + { "or": [ { "u_is_wearing": "foodperson_mask" }, { "u_is_wearing": "foodperson_mask_on" } ] } + ] + }, + "text": "I am you but from an alternate reality.", + "trial": { "type": "LIE", "difficulty": 10, "opinion": { "trust": 1, "value": 1 } }, + "success": { "topic": "TALK_FOODPERSON_MULTIVERSE", "opinion": { "trust": 2, "value": 2 } }, + "failure": { "topic": "TALK_FOODPERSON_ONLYONE", "opinion": { "trust": -5, "value": -5 } } + }, + { + "condition": { + "and": [ + { "not": { "npc_has_var": "foodperson_meeting_solved", "type": "dialogue", "context": "foodperson", "value": "yes" } }, + { "or": [ { "u_is_wearing": "foodperson_mask" }, { "u_is_wearing": "foodperson_mask_on" } ] }, + { "u_has_trait": "PROF_FOODP" } + ] + }, + "text": "I am Foodperson, who are YOU?", + "topic": "TALK_FOODPERSON_TWO" + }, + { + "condition": { + "and": [ + { "not": { "npc_has_var": "foodperson_meeting_solved", "type": "dialogue", "context": "foodperson", "value": "yes" } }, + { "or": [ { "u_is_wearing": "foodperson_mask" }, { "u_is_wearing": "foodperson_mask_on" } ] }, + { "u_has_trait": "PROF_FOODP" } + ] + }, + "text": "There is only one real Foodperson!", + "topic": "TALK_FOODPERSON_ONLYONE" + }, + { + "condition": { + "and": [ + { "not": { "npc_has_var": "foodperson_meeting_solved", "type": "dialogue", "context": "foodperson", "value": "yes" } }, + { "or": [ { "u_is_wearing": "foodperson_mask" }, { "u_is_wearing": "foodperson_mask_on" } ] }, + { "not": { "u_has_trait": "PROF_FOODP" } } + ] + }, + "text": "I am the REAL Foodperson!", + "topic": "TALK_FOODPERSON_ONLYONE" + }, + { "text": "Nevermind me, I'm just going to leave.", "topic": "TALK_DONE" } + ] + }, + { + "id": "TALK_FOODPERSON_INTRODUCTION", + "type": "talk_topic", + "dynamic_line": "Indeed it is I! The one and only FOODPERSON!", + "responses": [ + { + "text": "Wow! Such an honor to meet you in person!", + "topic": "TALK_FOODPERSON_MAIN", + "opinion": { "trust": 1, "value": 1 } + }, + { + "text": "Are you joking? Foodpeson is not real, it's a restaurant mascot!", + "opinion": { "trust": -1, "value": -1 }, + "topic": "TALK_FOODPERSON_DOUBTED" + }, + { + "text": "The great Foodperson in the flesh! Such an honor to finaly meet you in person!", + "trial": { "type": "LIE", "difficulty": 60, "mod": [ [ "TRUST", 2 ], [ "VALUE", 2 ] ] }, + "success": { "topic": "TALK_FOODPERSON_MAIN", "opinion": { "trust": 2, "value": 2 } }, + "failure": { "topic": "TALK_FOODPERSON_VEXED", "opinion": { "trust": -5, "value": -5 } } + }, + { "text": "Ah... Well, nice to meet you Foodperson.", "topic": "TALK_FOODPERSON_MAIN" } + ] + }, + { + "id": "TALK_FOODPERSON_VEXED", + "type": "talk_topic", + "dynamic_line": "Do not mock me, for my strength is quite real! Get out of here now!", + "responses": [ + { "text": "Sheesh, ok, calm down, I'm leaving!", "topic": "TALK_DONE" }, + { "text": "Forgive me, I didn't mean to disrespect you.", "topic": "TALK_FOODPERSON_MAIN" }, + { "text": "Oh yeah? Show me what you can do!", "topic": "TALK_DONE", "effect": "hostile" } + ] + }, + { + "id": "TALK_FOODPERSON_DOUBTED", + "type": "talk_topic", + "dynamic_line": "A common mistake, but I can assure you that I'm very real!", + "responses": [ + { "text": "Sure, whatever.", "topic": "TALK_DONE" }, + { "text": "Ok... I believe you.", "topic": "TALK_FOODPERSON_MAIN" } + ] + }, + { + "id": "TALK_FOODPERSON_MAIN", + "type": "talk_topic", + "dynamic_line": "Anyway, do you need something?", + "responses": [ + { + "text": "Are you interested in some trading?", + "condition": { + "and": [ + { "not": { "npc_has_var": "npc_failed_trade", "type": "dialogue", "context": "foodperson", "value": "yes" } }, + { + "not": { "npc_has_var": "npc_succes_trade", "type": "dialogue", "context": "foodperson", "value": "yes" } + }, + { + "not": { + "and": [ + { "npc_has_var": "npc_foodpersons_sharing", "type": "dialogue", "context": "foodperson", "value": "yes" }, + { + "or": [ + { "u_has_trait": "PROF_FOODP" }, + { "or": [ { "u_is_wearing": "foodperson_mask" }, { "u_is_wearing": "foodperson_mask_on" } ] } + ] + } + ] + } + } + ] + }, + "trial": { "type": "PERSUADE", "difficulty": 50, "mod": [ [ "TRUST", 2 ], [ "VALUE", 2 ] ] }, + "success": { "topic": "TALK_FOODPERSON_TRADE" }, + "failure": { "topic": "TALK_FOODPERSON_NOTRADE" } + }, + { + "text": "Let's trade?", + "condition": { + "and": [ + { "not": { "npc_has_var": "npc_failed_trade", "type": "dialogue", "context": "foodperson", "value": "yes" } }, + { + "or": [ + { "npc_has_var": "npc_succes_trade", "type": "dialogue", "context": "foodperson", "value": "yes" }, + { + "npc_has_var": "npc_foodperson_impressed", + "type": "dialogue", + "context": "foodperson", + "value": "yes" + }, + { + "and": [ + { "npc_has_var": "npc_foodpersons_sharing", "type": "dialogue", "context": "foodperson", "value": "yes" }, + { + "or": [ + { "u_has_trait": "PROF_FOODP" }, + { "or": [ { "u_is_wearing": "foodperson_mask" }, { "u_is_wearing": "foodperson_mask_on" } ] } + ] + } + ] + } + ] + } + ] + }, + "effect": "start_trade", + "topic": "TALK_DONE" + }, + { + "text": "I'm looking for a place to stay.", + "condition": { + "and": [ + { "not": { "npc_has_var": "npc_failed_shelter", "type": "dialogue", "context": "foodperson", "value": "yes" } }, + { + "not": { "npc_has_var": "npc_succes_shelter", "type": "dialogue", "context": "foodperson", "value": "yes" } + }, + { + "not": { + "and": [ + { "npc_has_var": "npc_foodpersons_sharing", "type": "dialogue", "context": "foodperson", "value": "yes" }, + { + "or": [ + { "u_has_trait": "PROF_FOODP" }, + { "or": [ { "u_is_wearing": "foodperson_mask" }, { "u_is_wearing": "foodperson_mask_on" } ] } + ] + } + ] + } + } + ] + }, + "trial": { "type": "PERSUADE", "difficulty": 20, "mod": [ [ "TRUST", 2 ], [ "VALUE", 2 ] ] }, + "success": { "topic": "TALK_FOODPERSON_SHELTER" }, + "failure": { "topic": "TALK_FOODPERSON_NOSHELTER" } + }, + { + "text": "I want to get stronger. Please teach me.", + "condition": { + "and": [ + { "not": { "npc_has_var": "npc_failed_training", "type": "dialogue", "context": "foodperson", "value": "yes" } }, + { + "not": { "npc_has_var": "npc_succes_training", "type": "dialogue", "context": "foodperson", "value": "yes" } + }, + { + "not": { + "and": [ + { "npc_has_var": "npc_foodpersons_sharing", "type": "dialogue", "context": "foodperson", "value": "yes" }, + { + "or": [ + { "u_has_trait": "PROF_FOODP" }, + { "or": [ { "u_is_wearing": "foodperson_mask" }, { "u_is_wearing": "foodperson_mask_on" } ] } + ] + } + ] + } + } + ] + }, + "trial": { "type": "PERSUADE", "difficulty": 20, "mod": [ [ "TRUST", 2 ], [ "VALUE", 2 ] ] }, + "success": { "topic": "TALK_FOODPERSON_TRAINING" }, + "failure": { "topic": "TALK_FOODPERSON_NOTRAINING" } + }, + { + "text": "Please share your knowledge.", + "condition": { + "and": [ + { "not": { "npc_has_var": "npc_failed_training", "type": "dialogue", "context": "foodperson", "value": "yes" } }, + { + "or": [ + { "npc_has_var": "npc_succes_training", "type": "dialogue", "context": "foodperson", "value": "yes" }, + { + "npc_has_var": "npc_foodperson_impressed", + "type": "dialogue", + "context": "foodperson", + "value": "yes" + }, + { + "and": [ + { "npc_has_var": "npc_foodpersons_sharing", "type": "dialogue", "context": "foodperson", "value": "yes" }, + { + "or": [ + { "u_has_trait": "PROF_FOODP" }, + { "or": [ { "u_is_wearing": "foodperson_mask" }, { "u_is_wearing": "foodperson_mask_on" } ] } + ] + } + ] + } + ] + } + ] + }, + "topic": "TALK_TRAIN" + }, + { + "text": "I'm building up a team, people with special abilities.", + "condition": { + "and": [ + { "not": { "npc_has_var": "npc_failed_team", "type": "dialogue", "context": "foodperson", "value": "yes" } }, + { + "not": { "npc_has_var": "npc_succes_team", "type": "dialogue", "context": "foodperson", "value": "yes" } + }, + { + "not": { "npc_has_var": "npc_foodperson_impressed", "type": "dialogue", "context": "foodperson", "value": "yes" } + }, + { + "not": { + "and": [ + { "npc_has_var": "npc_foodpersons_sharing", "type": "dialogue", "context": "foodperson", "value": "yes" }, + { + "or": [ + { "u_has_trait": "PROF_FOODP" }, + { "or": [ { "u_is_wearing": "foodperson_mask" }, { "u_is_wearing": "foodperson_mask_on" } ] } + ] + } + ] + } + } + ] + }, + "trial": { "type": "PERSUADE", "difficulty": 0, "mod": [ [ "TRUST", 2 ], [ "VALUE", 2 ] ] }, + "success": { + "topic": "TALK_FOODPERSON_SIDEKICK", + "effect": { "npc_add_var": "npc_succes_team_team", "type": "dialogue", "context": "foodperson", "value": "yes" } + }, + "failure": { "topic": "TALK_FOODPERSON_SOLO" } + }, + { + "text": "Can you tell me again about this sidekick offer?", + "condition": { + "and": [ + { "npc_has_var": "npc_sidekick_offer", "type": "dialogue", "context": "foodperson", "value": "yes" }, + { "not": "has_assigned_mission" } + ] + }, + "topic": "TALK_FOODPERSON_SIDEKICK" + }, + { + "text": "Alright, I thought about this, what do you say about we team up?", + "condition": { + "and": [ + { "npc_has_var": "npc_foodpersons_sharing", "type": "dialogue", "context": "foodperson", "value": "yes" }, + { + "or": [ + { "u_has_trait": "PROF_FOODP" }, + { "or": [ { "u_is_wearing": "foodperson_mask" }, { "u_is_wearing": "foodperson_mask_on" } ] } + ] + } + ] + }, + "topic": "TALK_FOODPERSON_TEAMUP" + }, + { "text": "I'm good, bye.", "topic": "TALK_DONE" } + ] + }, + { + "id": "TALK_FOODPERSON_NOTRADE", + "type": "talk_topic", + "dynamic_line": "I already have everything I need here in the FoodLair!", + "speaker_effect": { "effect": { "npc_add_var": "npc_failed_trade", "type": "dialogue", "context": "foodperson", "value": "yes" } }, + "responses": [ { "text": "Fair enough.", "topic": "TALK_NONE" } ] + }, + { + "id": "TALK_FOODPERSON_TRADE", + "type": "talk_topic", + "dynamic_line": "Alright let's see what you've got.", + "speaker_effect": { "effect": { "npc_add_var": "npc_succes_trade", "type": "dialogue", "context": "foodperson", "value": "yes" } }, + "responses": [ { "text": "...", "topic": "TALK_DONE", "effect": "start_trade" } ] + }, + { + "id": "TALK_FOODPERSON_NOTRAINING", + "type": "talk_topic", + "dynamic_line": "You're not ready for this.", + "speaker_effect": { "effect": { "npc_add_var": "npc_failed_training", "type": "dialogue", "context": "foodperson", "value": "yes" } }, + "responses": [ { "text": "But I am worthy!", "topic": "TALK_NONE" } ] + }, + { + "id": "TALK_FOODPERSON_TRAINING", + "type": "talk_topic", + "dynamic_line": "I can teach you a few tricks.", + "speaker_effect": { "effect": { "npc_add_var": "npc_succes_training", "type": "dialogue", "context": "foodperson", "value": "yes" } }, + "responses": [ { "text": "...", "topic": "TALK_TRAIN" }, { "text": "Nevermind.", "topic": "TALK_DONE" } ] + }, + { + "id": "TALK_FOODPERSON_NOSHELTER", + "type": "talk_topic", + "dynamic_line": "This is no place for a civilian. You should go to the refugee center.", + "speaker_effect": { "effect": { "npc_add_var": "npc_failed_shelter", "type": "dialogue", "context": "foodperson", "value": "yes" } }, + "responses": [ { "text": "Damn!", "topic": "TALK_NONE" } ] + }, + { + "id": "TALK_FOODPERSON_SHELTER", + "type": "talk_topic", + "dynamic_line": "Well... You seem like a decent sort, I might have an offer for you.", + "speaker_effect": { "effect": { "npc_add_var": "npc_succes_shelter", "type": "dialogue", "context": "foodperson", "value": "yes" } }, + "responses": [ { "text": "I'm listening.", "topic": "TALK_FOODPERSON_SIDEKICK" } ] + }, + { + "id": "TALK_FOODPERSON_SOLO", + "type": "talk_topic", + "dynamic_line": "Sorry but I work alone.", + "speaker_effect": { "effect": { "npc_add_var": "npc_failed_team", "type": "dialogue", "context": "foodperson", "value": "yes" } }, + "responses": [ { "text": "We could really use your help!", "topic": "TALK_NONE" } ] + }, + { + "id": "TALK_FOODPERSON_SIDEKICK", + "type": "talk_topic", + "dynamic_line": "What about: you prove your worth and join me as my sidekick?", + "speaker_effect": { "effect": { "npc_add_var": "npc_sidekick_offer", "type": "dialogue", "context": "foodperson", "value": "yes" } }, + "responses": [ + { "condition": { "not": "has_assigned_mission" }, "text": "That sounds great!", "topic": "TALK_MISSION_LIST" }, + { "condition": { "not": "has_assigned_mission" }, "text": "Ok...", "topic": "TALK_MISSION_LIST" }, + { + "condition": { "not": "has_assigned_mission" }, + "text": "I need to think about it.", + "topic": "TALK_FOODPERSON_MAIN" + }, + { "condition": { "not": "has_assigned_mission" }, "text": "Huh... No thanks.", "topic": "TALK_DONE" }, + { + "condition": "has_assigned_mission", + "text": "There's other things I'd like to discuss.", + "topic": "TALK_FOODPERSON_MAIN" + }, + { "condition": "has_assigned_mission", "text": "Alright bye.", "topic": "TALK_DONE" } + ] + }, + { + "id": "TALK_FOODPERSON_TWO", + "type": "talk_topic", + "dynamic_line": "The way you talk, the way you move... You're... You're me? But how?", + "responses": [ + { + "text": "I... I don't know. It probably has something to do with ! What do you say we team up to find out?", + "effect": { "npc_add_var": "foodperson_meeting_solved", "type": "dialogue", "context": "foodperson", "value": "yes" }, + "topic": "TALK_FOODPERSON_TEAMUP" + }, + { + "text": "It might have something to do with , mind if I stay here while we try to figure this out?", + "effect": { "npc_add_var": "foodperson_meeting_solved", "type": "dialogue", "context": "foodperson", "value": "yes" }, + "topic": "TALK_FOODPERSON_SHARING" + }, + { "text": "This can't be true, you're trying to trick me!", "topic": "TALK_FOODPERSON_ONLYONE" }, + { "text": "I need time to think.", "topic": "TALK_DONE" } + ] + }, + { + "id": "TALK_FOODPERSON_MULTIVERSE", + "type": "talk_topic", + "dynamic_line": "Wha... But. But... How?", + "responses": [ + { + "text": "No time to explain, the world is at an end and we must join forces to save it!", + "effect": { "npc_add_var": "foodperson_meeting_solved", "type": "dialogue", "context": "foodperson", "value": "yes" }, + "topic": "TALK_FOODPERSON_TEAMUP" + }, + { + "text": "The cataclysm weakened the space-time continuum, I accidentally fell through a tear in reality and ended up here. I will need access to your resources to keep fighting.", + "effect": { "npc_add_var": "foodperson_meeting_solved", "type": "dialogue", "context": "foodperson", "value": "yes" }, + "topic": "TALK_FOODPERSON_SHARING" + }, + { + "text": "I am the ultimate Foodperson, I travel the multiverse consuming powers from all the Foodpersons. And now I've come for you!", + "topic": "TALK_FOODPERSON_ONLYONE" + }, + { "text": "Can't tell you now. In due time all will be revealed.", "topic": "TALK_DONE" } + ] + }, + { + "id": "TALK_FOODPERSON_SHARING", + "type": "talk_topic", + "dynamic_line": "Of course, whatever you need... Foodperson.", + "speaker_effect": { "effect": { "npc_add_var": "npc_foodpersons_sharing", "type": "dialogue", "context": "foodperson", "value": "yes" } }, + "responses": [ + { + "text": "Thank you Foodperson! It's good to know I have a friend here.", + "topic": "TALK_FOODPERSON_MAIN", + "opinion": { "trust": 10, "value": 10 } + } + ] + }, + { + "id": "TALK_FOODPERSON_TEAMUP", + "type": "talk_topic", + "dynamic_line": "It's crazy out there, it's going to be a tough journey but I'm with you!", + "responses": [ + { + "text": "Let's go, we have a world to save!", + "topic": "TALK_DONE", + "effect": "follow", + "opinion": { "trust": 20, "value": 20 } + } + ] + }, + { + "id": "TALK_FOODPERSON_ONLYONE", + "type": "talk_topic", + "dynamic_line": "There can be only one!", + "responses": [ + { "text": "I AM THE ONE!", "topic": "TALK_DONE", "effect": "hostile", "opinion": { "trust": -20, "value": -20 } }, + { + "condition": { "not": { "u_has_trait": "PROF_FOODP" } }, + "text": "Wow calm down, it's just a prank bro.", + "topic": "TALK_DONE", + "opinion": { "trust": -20, "value": -20 } + }, + { + "condition": { "u_has_trait": "PROF_FOODP" }, + "text": "WAIT! There might be another way!", + "topic": "TALK_NONE" + }, + { + "condition": { "u_has_trait": "PROF_FOODP" }, + "text": "I don't want to fight you. I'm leaving.", + "topic": "TALK_DONE" + } + ] + } +] diff --git a/data/json/npcs/classes.json b/data/json/npcs/classes.json index 7d95f06f1f0cb..065ec05cad5a4 100644 --- a/data/json/npcs/classes.json +++ b/data/json/npcs/classes.json @@ -357,6 +357,23 @@ { "skill": "cooking", "bonus": { "rng": [ 3, 6 ] } } ] }, + { + "type": "npc_class", + "id": "NC_TRUE_FOODPERSON", + "name": "Foodperson", + "job_description": "I AM FOODPERSON. AND I BRING SUSTENANCE!", + "traits": [ { "group": "NPC_starting_traits" }, { "group": "Appearance_demographics" }, [ "PROF_FOODP", 100 ] ], + "common": false, + "worn_override": "NC_TRUE_FOODPERSON_worn", + "weapon_override": "NC_TRUE_FOODPERSON_melee", + "bonus_str": { "rng": [ 0, 2 ] }, + "skills": [ + { "skill": "ALL", "level": { "mul": [ { "one_in": 3 }, { "sum": [ { "dice": [ 4, 2 ] }, { "rng": [ -4, -1 ] } ] } ] } }, + { "skill": "bashing", "bonus": { "rng": [ 1, 3 ] } }, + { "skill": "speech", "bonus": { "rng": [ 1, 3 ] } }, + { "skill": "dodge", "bonus": { "rng": [ 3, 6 ] } } + ] + }, { "type": "npc_class", "id": "NC_CYBORG", diff --git a/data/json/npcs/factions.json b/data/json/npcs/factions.json index 0cdcb5b16a372..b9e80a6c0900e 100644 --- a/data/json/npcs/factions.json +++ b/data/json/npcs/factions.json @@ -208,6 +208,7 @@ "power": 100, "food_supply": 115200, "wealth": 10000000, + "currency": "FMCNote", "relations": { "free_merchants": { "kill on sight": false, @@ -231,7 +232,7 @@ "size": 100, "power": 100, "food_supply": 172800, - "wealth": 250000, + "wealth": 25000, "relations": { "marloss": { "kill on sight": false, @@ -255,7 +256,7 @@ "size": 100, "power": 100, "food_supply": 172800, - "wealth": 25000000, + "wealth": 2500000, "relations": { "lobby_beggars": { "knows your voice": true }, "free_merchants": { "knows your voice": true }, diff --git a/data/json/npcs/items_generic.json b/data/json/npcs/items_generic.json index 4185a06b32030..3d3fe1a3e1450 100644 --- a/data/json/npcs/items_generic.json +++ b/data/json/npcs/items_generic.json @@ -315,6 +315,8 @@ { "type": "item_group", "id": "npc_misc", + "ammo": 75, + "magazine": 50, "items": [ [ "101_carpentry", 1 ], [ "1st_aid", 20 ], @@ -543,7 +545,7 @@ [ "football", 1 ], [ "fork", 1 ], [ "fries", 1 ], - [ "frozen_burrito", 3 ], + [ "junk_burrito", 3 ], [ "frozen_dinner", 3 ], [ "fruit_leather", 3 ], [ "fruit_wine", 5 ], diff --git a/data/json/npcs/missiondef.json b/data/json/npcs/missiondef.json index c3d1fb91caade..4cbf7aa09641e 100644 --- a/data/json/npcs/missiondef.json +++ b/data/json/npcs/missiondef.json @@ -563,7 +563,7 @@ "start": { "effect": "follow" }, "end": { "effect": "leave" }, "origins": [ "ORIGIN_SECONDARY" ], - "destination": "farm", + "destination": "farm_2", "dialogue": { "describe": "I just need a place to start over...", "offer": "I've accepted that everyone I used to know is dead... one way or another. I really wish I could have done something to save my brother but he was one of 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?", @@ -742,5 +742,33 @@ "value": 0, "origins": [ "ORIGIN_GAME_START" ], "item": "antibiotics" + }, + { + "id": "MISSION_PROVE_YOUR_WORTH", + "type": "mission_definition", + "name": "Prove your worth to Foodperson", + "goal": "MGOAL_FIND_ITEM", + "item": "fp_loyalty_card", + "count": 10, + "difficulty": 1, + "value": 0, + "end": { + "effect": [ + { "npc_add_var": "npc_foodperson_impressed", "type": "dialogue", "context": "foodperson", "value": "yes" }, + { "u_buy_item": "badge_foodkid" } + ] + }, + "origins": [ "ORIGIN_SECONDARY" ], + "dialogue": { + "describe": "Prove your dedication to Foodplace.", + "offer": "Show me the proof of your loyalty to the great Foodplace, and I'll consider 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?", + "accepted": "That's the spirit! Good luck kid.", + "rejected": "That's alright not everyone is cutout for this.", + "advice": "Those are very precious, people would probably keep them on their person or in bank vaults. And definitely not throw them in the trash!", + "inquire": "How is it going? Do you have them?", + "success": "YES! I knew you could do it! You proved your worth and I'm proud to call you a friend.", + "success_lie": "Well... where are they?", + "failure": "I'm so disappointed in you kid..." + } } ] diff --git a/data/json/npcs/npc.json b/data/json/npcs/npc.json index 2f0ddb95d0101..219d3dc195796 100644 --- a/data/json/npcs/npc.json +++ b/data/json/npcs/npc.json @@ -66,10 +66,22 @@ "chat": "TALK_NC_SURVIVOR_CHEF", "faction": "wasteland_scavengers" }, + { + "type": "npc", + "id": "true_foodperson", + "//": "Foodperson mascot, except if you ask them Foodperson is a real hero and it's them!", + "name_unique": "Foodperson", + "class": "NC_TRUE_FOODPERSON", + "attitude": 7, + "mission": 7, + "chat": "TALK_TRUE_FOODPERSON", + "mission_offered": "MISSION_PROVE_YOUR_WORTH", + "faction": "wasteland_scavengers" + }, { "type": "npc", "id": "cyborg_rescued", - "//": "A broken cyborg you saved.", + "//": "A prototype cyborg you saved.", "name_suffix": "Cyborg", "class": "NC_CYBORG", "attitude": 1, diff --git a/data/json/npcs/refugee_center/missiondef_free_merchants.json b/data/json/npcs/refugee_center/missiondef_free_merchants.json index 48fec04b358f2..209c11921db8c 100644 --- a/data/json/npcs/refugee_center/missiondef_free_merchants.json +++ b/data/json/npcs/refugee_center/missiondef_free_merchants.json @@ -8,6 +8,6 @@ "value": 0, "start": "reveal_refugee_center", "origins": [ "ORIGIN_COMPUTER" ], - "destination": "evac_center" + "destination": "refctr_S3e" } ] 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 e8d1f972bfde3..9bb8158fcde05 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 @@ -99,7 +99,7 @@ }, { "type": "talk_topic", - "id": "TALK_FREE_MERCHANT_STOCKS_JAR", + "id": "TALK_FREE_MERCHANT_STOCKS_JARS", "dynamic_line": "Yes, I can buy 500 mL or 3 L glass jars at the moment.", "repeat_responses": { "for_item": [ "jar_glass", "jar_3l_glass" ], 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 50908c863fa37..f16d0b53d05e7 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 @@ -16,8 +16,7 @@ "id": "NC_EVAC_SHOPKEEP", "name": "Merchant", "job_description": "I'm a local shopkeeper.", - "traits": [ { "trait": "DEBUG_STORAGE" }, { "group": "NPC_starting_traits" }, { "group": "Appearance_demographics" } ], - "//": "giving a shopkeeper debug storage is a stopgap until better shop inventory systems are coded", + "traits": [ { "group": "NPC_starting_traits" }, { "group": "Appearance_demographics" } ], "common": false, "bonus_int": { "one_in": 4 }, "bonus_per": { "one_in": 4 }, @@ -49,7 +48,8 @@ "id": "NC_EVAC_SHOPKEEP_misc", "subtype": "collection", "items": [ - { "item": "FMCNote", "count-min": 50, "count-max": 300, "prob": 100 }, + { "item": "RobofacCoin", "count-min": 5, "count-max": 30, "prob": 30 }, + { "item": "FlatCoin", "count-min": 50, "count-max": 300, "prob": 30 }, { "group": "tools_general", "prob": 80, "repeat": [ 1, 3 ] }, { "group": "tools_home", "prob": 80, "repeat": [ 1, 3 ] }, { "group": "tools_construction", "prob": 30, "repeat": [ 1, 3 ] }, @@ -253,6 +253,7 @@ "effect": { "companion_mission": "REFUGEE_MERCHANT" }, "condition": { "u_has_any_trait": [ "NPC_MISSION_LEV_1" ] } }, + { "text": "What's your story?", "topic": "TALK_EVAC_MERCHANT_BACKGROUND" }, { "text": "What was it you were saying before?", "topic": "TALK_NONE" }, { "text": "Well, I'd better be going. Bye.", "topic": "TALK_DONE" } ] @@ -477,7 +478,7 @@ "terrain": { "g": "t_grass", ".": "t_dirt", "a": "t_dirt", "b": "t_dirt", "R": "t_dirt", "F": "t_dirt" }, "furniture": { "a": "f_ash" }, "traps": { "F": "tr_fur_rollmat", "R": "tr_rollmat" }, - "fields": { "b": { "field": "fd_blood", "density": 1 } }, + "fields": { "b": { "field": "fd_blood", "intensity": 1 } }, "place_loot": [ { "group": "cannedfood", "x": [ 6, 18 ], "y": [ 3, 15 ], "chance": 100 }, { "group": "alcohol_bottled_canned", "x": [ 6, 18 ], "y": [ 3, 15 ], "repeat": 2, "chance": 75 }, diff --git a/data/json/npcs/refugee_center/surface_visitors/NPC_scavenger_mercenary.json b/data/json/npcs/refugee_center/surface_visitors/NPC_scavenger_mercenary.json index edaf28d857fe2..29962e56992db 100644 --- a/data/json/npcs/refugee_center/surface_visitors/NPC_scavenger_mercenary.json +++ b/data/json/npcs/refugee_center/surface_visitors/NPC_scavenger_mercenary.json @@ -101,17 +101,28 @@ { "id": "TALK_SCAVENGER_MERC_HIRE", "type": "talk_topic", - "dynamic_line": "I'm currently waiting for a customer to return... I'll make you a deal though, $8,000 will cover my expenses if I get a small cut of the loot. I can't accept cash cards, so you'll have to find an ATM to deposit money into your bank account.", + "dynamic_line": "I'm currently waiting for a customer to return... I'll make you a deal though, 2500 Merch will cover my expenses if I get a small cut of the loot.", "responses": [ + { "text": "What the heck is a Merch?", "topic": "TALK_SCAVENGER_MERC_MERCH" }, { "text": "I might be back.", "topic": "TALK_SCAVENGER_MERC" }, { - "text": "[$8000] You have a deal.", + "text": "[FMC2500] You have a deal.", "topic": "TALK_SCAVENGER_MERC_HIRE_SUCCESS", - "condition": { "u_has_cash": 800000 }, - "effect": { "u_spend_cash": 800000 } + "condition": { "u_has_items": { "item": "FMCNote", "count": 2500 } }, + "effect": { "u_consume_item": "FMCNote", "count": 2500 } } ] }, + { + "id": "TALK_SCAVENGER_MERC_MERCH", + "type": "talk_topic", + "dynamic_line": "Merchs are what they call dollar bills around here. Free Merchant Credit Notes or something. If you want to buy stuff around here and you don't want to barter away your guns, you need Merch.", + "responses": [ + { "text": "I see. Let's try this again from the start.", "topic": "TALK_SCAVENGER_MERC" }, + { "text": "Okay, how much Merch do I need?", "topic": "TALK_SCAVENGER_MERC_HIRE" }, + { "text": "Well, thanks for the info. Bye!", "topic": "TALK_DONE" } + ] + }, { "id": "TALK_SCAVENGER_MERC_HIRE_SUCCESS", "type": "talk_topic", diff --git a/data/json/npcs/robofac/NPC_ROBOFAC_INTERCOM.json b/data/json/npcs/robofac/NPC_ROBOFAC_INTERCOM.json index 5bdd965db0861..43b050594b4bc 100644 --- a/data/json/npcs/robofac/NPC_ROBOFAC_INTERCOM.json +++ b/data/json/npcs/robofac/NPC_ROBOFAC_INTERCOM.json @@ -76,7 +76,7 @@ " " ], "terrain": { "@": "t_grass", "b": "t_dirt", "M": "t_dirt" }, - "fields": { "b": { "field": "fd_blood", "density": 1 } }, + "fields": { "b": { "field": "fd_blood", "intensity": 1 } }, "items": { "@": { "item": "NC_ROBOFAC_FIELD_RESEARCHER_worn", "chance": 100 } }, "item": { "@": [ { "item": "EMPbomb", "amount": 2 }, { "item": "corpse" } ] }, "monster": { "M": { "monster": "mon_robofac_prototype" } } diff --git a/data/json/npcs/robofac/NPC_Ulysses_Rourke.json b/data/json/npcs/robofac/NPC_Ulysses_Rourke.json index 4539c75a1193f..d5a1e6632fb3c 100644 --- a/data/json/npcs/robofac/NPC_Ulysses_Rourke.json +++ b/data/json/npcs/robofac/NPC_Ulysses_Rourke.json @@ -16,8 +16,9 @@ { "type": "npc_class", "id": "NC_ROBOFAC_SECURITY_HEAD", - "name": "intercom", + "name": "Head of security", "job_description": "I'm part of the Hub security team.", + "common": false, "//": "Needs his own unique background.", "traits": [ { "group": "BG_survival_story_POLICE" }, diff --git a/data/json/npcs/robofac/NPC_robofac_generic_security.json b/data/json/npcs/robofac/NPC_robofac_generic_security.json index e2378b7db15e8..ea2eccde9383d 100644 --- a/data/json/npcs/robofac/NPC_robofac_generic_security.json +++ b/data/json/npcs/robofac/NPC_robofac_generic_security.json @@ -13,8 +13,9 @@ { "type": "npc_class", "id": "NC_ROBOFAC_SECURITY", - "name": "intercom", + "name": "Hub Security", "job_description": "I'm part of the Hub security team.", + "common": false, "traits": [ { "group": "BG_survival_story_POLICE" }, { "group": "NPC_starting_traits" }, { "group": "Appearance_demographics" } ], "bonus_str": { "rng": [ 1, 3 ] }, "bonus_int": { "rng": [ 1, 2 ] }, @@ -59,7 +60,7 @@ ] }, { - "id": "TALK_GUARD", + "id": "TALK_HUB_SECURITY", "type": "talk_topic", "dynamic_line": [ "Keep it civil, merc.", "Just on watch, move along.", { "u_male": [ "Sir." ], "no": [ "Ma'am" ] } ], "responses": [ { "text": "...", "topic": "TALK_DONE" } ] diff --git a/data/json/npcs/robofac/ROBOFAC_SURFACE_FREEMERCHANT.json b/data/json/npcs/robofac/ROBOFAC_SURFACE_FREEMERCHANT.json index a9866a2b28a94..e1f2f05b31d3d 100644 --- a/data/json/npcs/robofac/ROBOFAC_SURFACE_FREEMERCHANT.json +++ b/data/json/npcs/robofac/ROBOFAC_SURFACE_FREEMERCHANT.json @@ -48,7 +48,7 @@ "sub-type": "collection", "id": "NC_ROBOFAC_FREE_MERCHANT_misc", "items": [ - { "item": "FMCNote", "count-min": 50, "count-max": 300, "prob": 100 }, + { "item": "RobofacCoin", "count-min": 5, "count-max": 30, "prob": 90 }, { "item": "jerky", "count-min": 10, "count-max": 25, "prob": 100 }, { "item": "tallow", "count-min": 10, "count-max": 25, "prob": 100 }, { "item": "pemmican", "count-min": 10, "count-max": 25, "prob": 100 }, diff --git a/data/json/npcs/tacoma_ranch/NPC_ranch_bartender.json b/data/json/npcs/tacoma_ranch/NPC_ranch_bartender.json index ca2293acbf01f..3727b5f5cd60c 100644 --- a/data/json/npcs/tacoma_ranch/NPC_ranch_bartender.json +++ b/data/json/npcs/tacoma_ranch/NPC_ranch_bartender.json @@ -48,26 +48,22 @@ { "text": "[$8] I'll take a beer", "topic": "TALK_DONE", - "condition": { "u_has_cash": 800 }, "effect": { "u_buy_item": "beer", "container": "bottle_glass", "count": 2, "cost": 800 } }, { "text": "[$10] I'll take a shot of brandy", "topic": "TALK_DONE", - "condition": { "u_has_cash": 1000 }, - "effect": { "u_buy_item": "beer", "container": "bottle_glass", "cost": 1000 } + "effect": { "u_buy_item": "brandy", "container": "bottle_glass", "cost": 1000 } }, { "text": "[$10] I'll take a shot of rum", "topic": "TALK_DONE", - "condition": { "u_has_cash": 1000 }, - "effect": { "u_buy_item": "beer", "container": "bottle_glass", "cost": 1000 } + "effect": { "u_buy_item": "rum", "container": "bottle_glass", "cost": 1000 } }, { "text": "[$12] I'll take a shot of whiskey", "topic": "TALK_DONE", - "condition": { "u_has_cash": 1200 }, - "effect": { "u_buy_item": "beer", "container": "bottle_glass", "cost": 1200 } + "effect": { "u_buy_item": "whiskey", "container": "bottle_glass", "cost": 1200 } }, { "text": "On second thought, don't bother.", "topic": "TALK_RANCH_BARKEEP" } ] diff --git a/data/json/obsolete.json b/data/json/obsolete.json index 22240ab039c27..91b369062b350 100644 --- a/data/json/obsolete.json +++ b/data/json/obsolete.json @@ -14,5 +14,10 @@ "description": "Space inside your chest cavity has been surgically converted into a storage area. You may carry an extra 2 liters of volume.", "occupied_bodyparts": [ [ "TORSO", 32 ] ], "flags": [ "BIONIC_NPC_USABLE", "BIONIC_SHOCKPROOF" ] + }, + { + "type": "recipe", + "result": "reloaded_270", + "obsolete": true } ] diff --git a/data/json/overmap/map_extras.json b/data/json/overmap/map_extras.json new file mode 100644 index 0000000000000..7932146fee013 --- /dev/null +++ b/data/json/overmap/map_extras.json @@ -0,0 +1,319 @@ +[ + { + "id": "mx_null", + "type": "map_extra", + "name": "Nothing", + "description": "Nothing of interest is here.", + "function": "mx_null" + }, + { + "id": "mx_crater", + "type": "map_extra", + "name": "Crater", + "description": "There is a crater here.", + "function": "mx_crater", + "sym": "x", + "color": "yellow", + "autonote": true + }, + { + "id": "mx_fumarole", + "type": "map_extra", + "name": "Fumarole", + "description": "There is a fumarole here.", + "function": "mx_fumarole", + "sym": "x", + "color": "yellow", + "autonote": true + }, + { + "id": "mx_collegekids", + "type": "map_extra", + "name": "College Kids", + "description": "Several corpses of college kids are here.", + "function": "mx_collegekids", + "sym": "x", + "color": "yellow", + "autonote": true + }, + { + "id": "mx_drugdeal", + "type": "map_extra", + "name": "Drug Deal", + "description": "Several corpses of drug dealers are here.", + "function": "mx_drugdeal", + "sym": "x", + "color": "yellow", + "autonote": true + }, + { + "id": "mx_roadworks", + "type": "map_extra", + "name": "Roadworks", + "description": "Roadworks are here.", + "function": "mx_roadworks", + "sym": "x", + "color": "yellow", + "autonote": true + }, + { + "id": "mx_mayhem", + "type": "map_extra", + "name": "Road Mayhem", + "description": "Road mayhem is here.", + "function": "mx_mayhem", + "sym": "x", + "color": "yellow", + "autonote": true + }, + { + "id": "mx_roadblock", + "type": "map_extra", + "name": "Roadblock (Military)", + "description": "This road is blocked by military.", + "function": "mx_roadblock", + "sym": "x", + "color": "yellow", + "autonote": true + }, + { + "id": "mx_bandits_block", + "type": "map_extra", + "name": "Roadblock (Bandits)", + "description": "This road is blocked by bandits.", + "function": "mx_roadblock", + "sym": "x", + "color": "yellow", + "autonote": true + }, + { + "id": "mx_minefield", + "type": "map_extra", + "name": "Minefield", + "description": "Mines are scattered here.", + "function": "mx_minefield", + "sym": "x", + "color": "yellow", + "autonote": true + }, + { + "id": "mx_supplydrop", + "type": "map_extra", + "name": "Supply Drop", + "description": "Several supply crates were dropped here.", + "function": "mx_supplydrop", + "sym": "x", + "color": "yellow", + "autonote": true + }, + { + "id": "mx_military", + "type": "map_extra", + "name": "Military", + "description": "Several corpses of soldiers are here.", + "function": "mx_military", + "sym": "x", + "color": "yellow", + "autonote": true + }, + { + "id": "mx_helicopter", + "type": "map_extra", + "name": "Helicopter Crash", + "description": "Helicopter crashed here.", + "function": "mx_helicopter", + "sym": "x", + "color": "yellow", + "autonote": true + }, + { + "id": "mx_science", + "type": "map_extra", + "name": "Scientists", + "description": "Several corpses of scientists are here.", + "function": "mx_science", + "sym": "x", + "color": "yellow", + "autonote": true + }, + { + "id": "mx_portal", + "type": "map_extra", + "name": "Portal", + "description": "Portal is here.", + "function": "mx_portal", + "sym": "x", + "color": "yellow", + "autonote": true + }, + { + "id": "mx_portal_in", + "type": "map_extra", + "name": "Portal In", + "description": "Another portal is here.", + "function": "mx_portal_in", + "sym": "x", + "color": "yellow", + "autonote": true + }, + { + "id": "mx_anomaly", + "type": "map_extra", + "name": "Anomaly", + "description": "Some anomaly is here.", + "function": "mx_anomaly", + "sym": "x", + "color": "yellow", + "autonote": true + }, + { + "id": "mx_house_spider", + "type": "map_extra", + "name": "Spider Nest", + "description": "Spider nest is here.", + "function": "mx_house_spider", + "sym": "x", + "color": "yellow", + "autonote": true + }, + { + "id": "mx_house_wasp", + "type": "map_extra", + "name": "Wasp Nest", + "description": "Wasp nest is here.", + "function": "mx_house_wasp", + "sym": "x", + "color": "yellow", + "autonote": true + }, + { + "id": "mx_spider", + "type": "map_extra", + "name": "Spiders", + "description": "This area is covered with webs. Probably spiders are nearby", + "function": "mx_spider", + "sym": "x", + "color": "yellow", + "autonote": true + }, + { + "id": "mx_shia", + "type": "map_extra", + "name": "Shia LaBeouf", + "description": "Cannibal is nearby.", + "function": "mx_shia", + "sym": "x", + "color": "yellow", + "autonote": true + }, + { + "id": "mx_jabberwock", + "type": "map_extra", + "name": "Jabberwock", + "description": "Jabberwock is nearby.", + "function": "mx_jabberwock", + "sym": "x", + "color": "yellow", + "autonote": true + }, + { + "id": "mx_grove", + "type": "map_extra", + "name": "Grove", + "description": "This area is covered with a single type of trees.", + "function": "mx_grove", + "sym": "x", + "color": "yellow", + "autonote": true + }, + { + "id": "mx_shrubbery", + "type": "map_extra", + "name": "Shrubberry", + "description": "This area is covered with a single type of shrubs.", + "function": "mx_shrubbery", + "sym": "x", + "color": "yellow", + "autonote": true + }, + { + "id": "mx_clearcut", + "type": "map_extra", + "name": "Clearcut", + "description": "Most trees in this area were uniformly cut down.", + "function": "mx_clearcut", + "sym": "x", + "color": "yellow", + "autonote": true + }, + { + "id": "mx_pond", + "type": "map_extra", + "name": "Pond", + "description": "Small pond is here.", + "function": "mx_pond", + "sym": "x", + "color": "yellow", + "autonote": true + }, + { + "id": "mx_clay_deposit", + "type": "map_extra", + "name": "Clay Deposit", + "description": "Small clay deposit is here.", + "function": "mx_clay_deposit", + "sym": "x", + "color": "yellow", + "autonote": true + }, + { + "id": "mx_dead_vegetation", + "type": "map_extra", + "name": "Dead Vegetation", + "description": "Dead vegetation is here.", + "function": "mx_dead_vegetation", + "sym": "x", + "color": "yellow", + "autonote": true + }, + { + "id": "mx_point_dead_vegetation", + "type": "map_extra", + "name": "Dead Vegetation (Point)", + "description": "Dead vegetation is here.", + "function": "mx_point_dead_vegetation", + "sym": "x", + "color": "yellow", + "autonote": true + }, + { + "id": "mx_burned_ground", + "type": "map_extra", + "name": "Burned Ground", + "description": "Burned ground is here.", + "function": "mx_burned_ground", + "sym": "x", + "color": "yellow", + "autonote": true + }, + { + "id": "mx_point_burned_ground", + "type": "map_extra", + "name": "Burned Ground (Point)", + "description": "Burned ground is here.", + "function": "mx_point_burned_ground", + "sym": "x", + "color": "yellow", + "autonote": true + }, + { + "id": "mx_marloss_pilgrimage", + "type": "map_extra", + "name": "Marloss Pilgrimage", + "description": "Marloss Pilgrimage is here.", + "function": "mx_marloss_pilgrimage", + "sym": "x", + "color": "yellow", + "autonote": true + } +] diff --git a/data/json/overmap/multitile_buildings_terrain.json b/data/json/overmap/multitile_buildings_terrain.json deleted file mode 100644 index 4b65648719e0c..0000000000000 --- a/data/json/overmap/multitile_buildings_terrain.json +++ /dev/null @@ -1,132 +0,0 @@ -[ - { - "type": "overmap_terrain", - "id": "house_2story_base", - "name": "house", - "sym": "^", - "color": "light_green", - "see_cost": 2, - "mondensity": 2, - "flags": [ "SIDEWALK" ] - }, - { - "type": "overmap_terrain", - "id": "house_2story_second", - "name": "house", - "sym": "^", - "color": "light_green", - "see_cost": 2, - "mondensity": 2 - }, - { - "type": "overmap_terrain", - "id": "town_hall_0_0_0", - "name": "town hall", - "sym": "^", - "color": "i_black", - "see_cost": 2, - "mondensity": 2, - "flags": [ "SIDEWALK" ] - }, - { - "type": "overmap_terrain", - "id": "town_hall_1_0_0", - "name": "town hall", - "sym": "^", - "color": "i_black", - "see_cost": 2, - "mondensity": 2, - "flags": [ "SIDEWALK" ] - }, - { - "type": "overmap_terrain", - "id": "town_hall_0_1_0", - "name": "town hall", - "sym": "^", - "color": "i_black", - "see_cost": 2, - "flags": [ "SIDEWALK" ] - }, - { - "type": "overmap_terrain", - "id": "town_hall_1_1_0", - "name": "town hall", - "sym": "^", - "color": "i_black", - "see_cost": 2, - "mondensity": 2, - "flags": [ "SIDEWALK" ] - }, - { - "type": "overmap_terrain", - "id": "town_hall_0_0_1", - "name": "town hall", - "sym": "^", - "color": "i_black", - "see_cost": 2, - "mondensity": 2 - }, - { - "type": "overmap_terrain", - "id": "town_hall_1_0_1", - "name": "town hall", - "sym": "^", - "color": "i_black", - "see_cost": 2, - "mondensity": 2 - }, - { - "type": "overmap_terrain", - "id": "town_hall_0_1_1", - "name": "town hall", - "sym": "^", - "color": "i_black", - "see_cost": 2, - "mondensity": 2 - }, - { - "type": "overmap_terrain", - "id": "town_hall_1_1_1", - "name": "town hall", - "sym": "^", - "color": "i_black", - "see_cost": 2, - "mondensity": 2 - }, - { - "type": "overmap_terrain", - "id": "town_hall_0_0_roof", - "name": "town hall", - "sym": ".", - "color": "light_blue", - "see_cost": 2, - "mondensity": 2 - }, - { - "type": "overmap_terrain", - "id": "town_hall_1_0_roof", - "name": "town hall", - "sym": ".", - "color": "light_blue", - "see_cost": 2, - "mondensity": 2 - }, - { - "type": "overmap_terrain", - "id": "town_hall_0_1_roof", - "name": "town hall", - "sym": ".", - "color": "light_blue", - "see_cost": 2, - "mondensity": 2 - }, - { - "type": "overmap_terrain", - "id": "town_hall_1_1_roof", - "name": "town hall", - "sym": ".", - "color": "light_blue", - "see_cost": 2, - "mondensity": 2 - } -] diff --git a/data/json/overmap/multitile_city_buildings.json b/data/json/overmap/multitile_city_buildings.json index 8da77c115801d..e4df6f2ee4caf 100644 --- a/data/json/overmap/multitile_city_buildings.json +++ b/data/json/overmap/multitile_city_buildings.json @@ -15,6 +15,57 @@ { "point": [ 0, 0, -1 ], "overmap": "basement" } ] }, + { + "type": "city_building", + "id": "mil_surplus", + "locations": [ "land" ], + "overmaps": [ + { "point": [ 0, 0, 0 ], "overmap": "mil_surplus_north" }, + { "point": [ 0, 0, 1 ], "overmap": "mil_surplus_roof_north" } + ] + }, + { + "type": "city_building", + "id": "mil_surplus_1", + "locations": [ "land" ], + "overmaps": [ + { "point": [ 0, 0, 0 ], "overmap": "mil_surplus_1_north" }, + { "point": [ 0, 0, 1 ], "overmap": "mil_surplus_roof_1_north" } + ] + }, + { + "type": "city_building", + "id": "s_library", + "locations": [ "land" ], + "overmaps": [ { "point": [ 0, 0, 0 ], "overmap": "s_library_north" }, { "point": [ 0, 0, 1 ], "overmap": "s_library_roof_north" } ] + }, + { + "type": "city_building", + "id": "s_library_1", + "locations": [ "land" ], + "overmaps": [ + { "point": [ 0, 0, 0 ], "overmap": "s_library_1_north" }, + { "point": [ 0, 0, 1 ], "overmap": "s_library_roof_1_north" } + ] + }, + { + "type": "city_building", + "id": "mil_surplus_2", + "locations": [ "land" ], + "overmaps": [ + { "point": [ 0, 0, 0 ], "overmap": "mil_surplus_2_north" }, + { "point": [ 0, 0, 1 ], "overmap": "mil_surplus_roof_2_north" } + ] + }, + { + "type": "city_building", + "id": "s_library_2", + "locations": [ "land" ], + "overmaps": [ + { "point": [ 0, 0, 0 ], "overmap": "s_library_2_north" }, + { "point": [ 0, 0, 1 ], "overmap": "s_library_roof_2_north" } + ] + }, { "type": "city_building", "id": "furniture", @@ -111,6 +162,40 @@ { "point": [ 0, 0, 1 ], "overmap": "cs_tire_shop_roof_north" } ] }, + { + "type": "city_building", + "id": "s_gun", + "locations": [ "land" ], + "overmaps": [ { "point": [ 0, 0, 0 ], "overmap": "s_gun_north" }, { "point": [ 0, 0, 1 ], "overmap": "s_gun_roof_north" } ] + }, + { + "type": "city_building", + "id": "s_gun_1", + "locations": [ "land" ], + "overmaps": [ { "point": [ 0, 0, 0 ], "overmap": "s_gun_1_north" }, { "point": [ 0, 0, 1 ], "overmap": "s_gun_roof_1_north" } ] + }, + { + "type": "city_building", + "id": "s_gun_2", + "locations": [ "land" ], + "overmaps": [ { "point": [ 0, 0, 0 ], "overmap": "s_gun_2_north" }, { "point": [ 0, 0, 1 ], "overmap": "s_gun_roof_1_north" } ] + }, + { + "type": "city_building", + "id": "s_gun_3", + "locations": [ "land" ], + "overmaps": [ { "point": [ 0, 0, 0 ], "overmap": "s_gun_3_north" }, { "point": [ 0, 0, 1 ], "overmap": "s_gun_roof_3_north" } ] + }, + { + "type": "city_building", + "id": "s_gun_4", + "locations": [ "land" ], + "overmaps": [ + { "point": [ 0, 0, 0 ], "overmap": "s_gun_4_north" }, + { "point": [ 0, 0, 1 ], "overmap": "s_gun_2ndfloor_4_north" }, + { "point": [ 0, 0, 2 ], "overmap": "s_gun_roof_4_north" } + ] + }, { "type": "city_building", "id": "s_bookstore", @@ -1008,7 +1093,8 @@ "locations": [ "land" ], "overmaps": [ { "point": [ 0, 0, 0 ], "overmap": "landscapingsupplyco_1a_north" }, - { "point": [ 1, 0, 0 ], "overmap": "landscapingsupplyco_1b_north" } + { "point": [ 1, 0, 0 ], "overmap": "landscapingsupplyco_1b_north" }, + { "point": [ 1, 0, 1 ], "overmap": "landscapingsupplyco_1b_roof_north" } ] }, { @@ -1249,6 +1335,16 @@ { "point": [ 0, 0, 1 ], "overmap": "dispensary_roof_2_north" } ] }, + { + "type": "city_building", + "id": "headshop", + "locations": [ "land" ], + "overmaps": [ + { "point": [ 0, 0, 0 ], "overmap": "headshop_north" }, + { "point": [ 0, 0, 1 ], "overmap": "headshop_roof_north" }, + { "point": [ 0, 0, 2 ], "overmap": "headshop_upper_roof_north" } + ] + }, { "type": "city_building", "id": "abandonedwarehouse", @@ -1345,6 +1441,16 @@ { "point": [ 0, 0, 1 ], "overmap": "cs_car_dealership_roof_north" } ] }, + { + "type": "city_building", + "id": "s_restaurant_foodplace", + "locations": [ "land" ], + "overmaps": [ + { "point": [ 0, 0, 0 ], "overmap": "s_restaurant_foodplace_north" }, + { "point": [ 0, 0, 1 ], "overmap": "s_restaurant_foodplace_roof_north" }, + { "point": [ 0, 0, 2 ], "overmap": "s_restaurant_foodplace_upper_roof_north" } + ] + }, { "type": "city_building", "id": "s_restaurant", @@ -1443,6 +1549,12 @@ { "point": [ 0, 0, 2 ], "overmap": "bakery_upper_roof_north" } ] }, + { + "type": "city_building", + "id": "s_jewelry_shop", + "locations": [ "land" ], + "overmaps": [ { "point": [ 0, 0, 0 ], "overmap": "s_jewelry_north" }, { "point": [ 0, 0, 1 ], "overmap": "s_jewelry_roof_north" } ] + }, { "type": "city_building", "id": "cs_gardening_allotment", @@ -1479,6 +1591,21 @@ "locations": [ "land" ], "overmaps": [ { "point": [ 0, 0, 0 ], "overmap": "bar_1_north" }, { "point": [ 0, 0, 1 ], "overmap": "bar_roof_1_north" } ] }, + { + "type": "city_building", + "id": "lancenter", + "locations": [ "land" ], + "overmaps": [ { "point": [ 0, 0, 0 ], "overmap": "lancenter_north" }, { "point": [ 0, 0, 1 ], "overmap": "lancenter_roof_north" } ] + }, + { + "type": "city_building", + "id": "lancenter_1", + "locations": [ "land" ], + "overmaps": [ + { "point": [ 0, 0, 0 ], "overmap": "lancenter_1_north" }, + { "point": [ 0, 0, 1 ], "overmap": "lancenter_roof_1_north" } + ] + }, { "type": "city_building", "id": "office_doctor", @@ -1639,6 +1766,15 @@ { "point": [ 0, 0, 1 ], "overmap": "s_bike_shop_roof_1_north" } ] }, + { + "type": "city_building", + "id": "home_improvement", + "locations": [ "land" ], + "overmaps": [ + { "point": [ 0, 0, 0 ], "overmap": "home_improvement_north" }, + { "point": [ 0, 0, 1 ], "overmap": "home_improvement_roof_north" } + ] + }, { "type": "city_building", "id": "cs_car_showroom", @@ -1773,5 +1909,30 @@ { "point": [ 1, 0, 3 ], "overmap": "parking_garage_roof_1_north" }, { "point": [ 0, 0, 4 ], "overmap": "parking_garage_roof_top_north" } ] + }, + { + "type": "city_building", + "id": "s_music", + "locations": [ "land" ], + "overmaps": [ { "point": [ 0, 0, 0 ], "overmap": "s_music_north" }, { "point": [ 0, 0, 1 ], "overmap": "s_music_roof_north" } ] + }, + { + "type": "city_building", + "id": "music_venue", + "locations": [ "land" ], + "overmaps": [ + { "point": [ 0, 0, 0 ], "overmap": "music_venue_north" }, + { "point": [ 0, 0, 1 ], "overmap": "music_venue_roof_north" } + ] + }, + { + "type": "city_building", + "id": "music_venue_1", + "locations": [ "land" ], + "overmaps": [ + { "point": [ 0, 0, 0 ], "overmap": "music_venue_1_north" }, + { "point": [ 0, 0, 1 ], "overmap": "music_venue_1_roof_north" }, + { "point": [ 0, 0, 2 ], "overmap": "music_venue_1_roof_top_north" } + ] } ] diff --git a/data/json/overmap_connections.json b/data/json/overmap/overmap_connections.json similarity index 100% rename from data/json/overmap_connections.json rename to data/json/overmap/overmap_connections.json diff --git a/data/json/overmap/campus.json b/data/json/overmap/overmap_special/campus.json similarity index 100% rename from data/json/overmap/campus.json rename to data/json/overmap/overmap_special/campus.json diff --git a/data/json/overmap/specials.json b/data/json/overmap/overmap_special/specials.json similarity index 54% rename from data/json/overmap/specials.json rename to data/json/overmap/overmap_special/specials.json index 5c2594f2265de..8ff2bd738fe90 100644 --- a/data/json/overmap/specials.json +++ b/data/json/overmap/overmap_special/specials.json @@ -114,7 +114,11 @@ { "type": "overmap_special", "id": "LMOE Shelter", - "overmaps": [ { "point": [ 0, 0, 0 ], "overmap": "lmoe" }, { "point": [ 0, 0, -1 ], "overmap": "lmoe_under" } ], + "overmaps": [ + { "point": [ 0, 0, 0 ], "overmap": "lmoe" }, + { "point": [ 0, 0, 1 ], "overmap": "lmoe_roof" }, + { "point": [ 0, 0, -1 ], "overmap": "lmoe_under_empty" } + ], "locations": [ "land" ], "city_distance": [ 20, -1 ], "city_sizes": [ 0, 12 ], @@ -269,7 +273,9 @@ { "point": [ 2, 1, 0 ], "overmap": "farm_4_north" }, { "point": [ 0, 2, 0 ], "overmap": "farm_9_north" }, { "point": [ 1, 2, 0 ], "overmap": "farm_8_north" }, - { "point": [ 2, 2, 0 ], "overmap": "farm_7_north" } + { "point": [ 2, 2, 0 ], "overmap": "farm_7_north" }, + { "point": [ 0, 0, 1 ], "overmap": "farm_3_roof_north" }, + { "point": [ 1, 0, 1 ], "overmap": "farm_2_roof_north" } ], "connections": [ { "point": [ 1, -1, 0 ], "terrain": "road", "existing": true } ], "locations": [ "wilderness" ], @@ -851,7 +857,7 @@ { "point": [ 0, 0, -1 ], "overmap": "shelter_under" }, { "point": [ 0, 0, 1 ], "overmap": "shelter_roof" } ], - "connections": [ { "point": [ 0, -1, 0 ], "terrain": "road" } ], + "connections": [ { "point": [ 0, -1, 0 ], "terrain": "road", "connection": "local_road", "from": [ 0, 0, 0 ] } ], "locations": [ "wilderness" ], "city_distance": [ 5, 10 ], "city_sizes": [ 4, 12 ], @@ -867,7 +873,7 @@ { "point": [ 0, 0, -1 ], "overmap": "shelter_under" }, { "point": [ 0, 0, 1 ], "overmap": "shelter_roof_1" } ], - "connections": [ { "point": [ 0, -1, 0 ], "terrain": "road" } ], + "connections": [ { "point": [ 0, -1, 0 ], "terrain": "road", "connection": "local_road", "from": [ 0, 0, 0 ] } ], "locations": [ "wilderness" ], "city_distance": [ 5, 10 ], "city_sizes": [ 4, 12 ], @@ -883,7 +889,7 @@ { "point": [ 0, 0, -1 ], "overmap": "shelter_under" }, { "point": [ 0, 0, 1 ], "overmap": "shelter_roof_2" } ], - "connections": [ { "point": [ 0, -1, 0 ], "terrain": "road" } ], + "connections": [ { "point": [ 0, -1, 0 ], "terrain": "road", "connection": "local_road", "from": [ 0, 0, 0 ] } ], "locations": [ "wilderness" ], "city_distance": [ 5, 10 ], "city_sizes": [ 4, 12 ], @@ -1276,34 +1282,1584 @@ "type": "overmap_special", "id": "evac_center", "overmaps": [ - { "point": [ 0, 0, 0 ], "overmap": "evac_center_1_north" }, - { "point": [ 1, 0, 0 ], "overmap": "evac_center_2_north" }, - { "point": [ 2, 0, 0 ], "overmap": "evac_center_3_north" }, - { "point": [ 3, 0, 0 ], "overmap": "evac_center_4_north" }, - { "point": [ 4, 0, 0 ], "overmap": "evac_center_5_north" }, - { "point": [ 0, 1, 0 ], "overmap": "evac_center_6_north" }, - { "point": [ 1, 1, 0 ], "overmap": "evac_center_7_north" }, - { "point": [ 2, 1, 0 ], "overmap": "evac_center_8_north" }, - { "point": [ 3, 1, 0 ], "overmap": "evac_center_9_north" }, - { "point": [ 4, 1, 0 ], "overmap": "evac_center_10_north" }, - { "point": [ 0, 2, 0 ], "overmap": "evac_center_11_north" }, - { "point": [ 1, 2, 0 ], "overmap": "evac_center_12_north" }, - { "point": [ 2, 2, 0 ], "overmap": "evac_center_13_north" }, - { "point": [ 3, 2, 0 ], "overmap": "evac_center_14_north" }, - { "point": [ 4, 2, 0 ], "overmap": "evac_center_15_north" }, - { "point": [ 0, 3, 0 ], "overmap": "evac_center_16_north" }, - { "point": [ 1, 3, 0 ], "overmap": "evac_center_17_north" }, - { "point": [ 2, 3, 0 ], "overmap": "evac_center_18_north" }, - { "point": [ 3, 3, 0 ], "overmap": "evac_center_19_north" }, - { "point": [ 4, 3, 0 ], "overmap": "evac_center_20_north" }, - { "point": [ 0, 4, 0 ], "overmap": "evac_center_21_north" }, - { "point": [ 1, 4, 0 ], "overmap": "evac_center_22_north" }, - { "point": [ 2, 4, 0 ], "overmap": "evac_center_23_north" }, - { "point": [ 3, 4, 0 ], "overmap": "evac_center_24_north" }, - { "point": [ 4, 4, 0 ], "overmap": "evac_center_25_north" }, - { "point": [ 2, 5, 0 ], "overmap": "road_end_south" } - ], - "connections": [ { "point": [ 2, 5, 0 ] } ], + { "point": [ 0, 0, 0 ], "overmap": "refctr_NW1a_north" }, + { "point": [ 1, 0, 0 ], "overmap": "refctr_NW2a_north" }, + { "point": [ 2, 0, 0 ], "overmap": "refctr_NW3a_north" }, + { "point": [ 3, 0, 0 ], "overmap": "refctr_NW4a_north" }, + { "point": [ 4, 0, 0 ], "overmap": "refctr_NW5a_north" }, + { "point": [ 0, 1, 0 ], "overmap": "refctr_NW1b_north" }, + { "point": [ 1, 1, 0 ], "overmap": "refctr_NW2b_north" }, + { "point": [ 2, 1, 0 ], "overmap": "refctr_NW3b_north" }, + { "point": [ 3, 1, 0 ], "overmap": "refctr_NW4b_north" }, + { "point": [ 4, 1, 0 ], "overmap": "refctr_NW5b_north" }, + { "point": [ 0, 2, 0 ], "overmap": "refctr_NW1c_north" }, + { "point": [ 1, 2, 0 ], "overmap": "refctr_NW2c_north" }, + { "point": [ 2, 2, 0 ], "overmap": "refctr_NW3c_north" }, + { "point": [ 3, 2, 0 ], "overmap": "refctr_NW4c_north" }, + { "point": [ 4, 2, 0 ], "overmap": "refctr_NW5c_north" }, + { "point": [ 0, 3, 0 ], "overmap": "refctr_NW1d_north" }, + { "point": [ 1, 3, 0 ], "overmap": "refctr_NW2d_north" }, + { "point": [ 2, 3, 0 ], "overmap": "refctr_NW3d_north" }, + { "point": [ 3, 3, 0 ], "overmap": "refctr_NW4d_north" }, + { "point": [ 4, 3, 0 ], "overmap": "refctr_NW5d_north" }, + { "point": [ 0, 4, 0 ], "overmap": "refctr_NW1e_north" }, + { "point": [ 1, 4, 0 ], "overmap": "refctr_NW2e_north" }, + { "point": [ 2, 4, 0 ], "overmap": "refctr_NW3e_north" }, + { "point": [ 3, 4, 0 ], "overmap": "refctr_NW4e_north" }, + { "point": [ 4, 4, 0 ], "overmap": "refctr_NW5e_north" }, + { "point": [ 5, 0, 0 ], "overmap": "refctr_N1a_north" }, + { "point": [ 6, 0, 0 ], "overmap": "refctr_N2a_north" }, + { "point": [ 7, 0, 0 ], "overmap": "refctr_N3a_north" }, + { "point": [ 8, 0, 0 ], "overmap": "refctr_N4a_north" }, + { "point": [ 9, 0, 0 ], "overmap": "refctr_N5a_north" }, + { "point": [ 5, 1, 0 ], "overmap": "refctr_N1b_north" }, + { "point": [ 6, 1, 0 ], "overmap": "refctr_N2b_north" }, + { "point": [ 7, 1, 0 ], "overmap": "refctr_N3b_north" }, + { "point": [ 8, 1, 0 ], "overmap": "refctr_N4b_north" }, + { "point": [ 9, 1, 0 ], "overmap": "refctr_N5b_north" }, + { "point": [ 5, 2, 0 ], "overmap": "refctr_N1c_north" }, + { "point": [ 6, 2, 0 ], "overmap": "refctr_N2c_north" }, + { "point": [ 7, 2, 0 ], "overmap": "refctr_N3c_north" }, + { "point": [ 8, 2, 0 ], "overmap": "refctr_N4c_north" }, + { "point": [ 9, 2, 0 ], "overmap": "refctr_N5c_north" }, + { "point": [ 5, 3, 0 ], "overmap": "refctr_N1d_north" }, + { "point": [ 6, 3, 0 ], "overmap": "refctr_N2d_north" }, + { "point": [ 7, 3, 0 ], "overmap": "refctr_N3d_north" }, + { "point": [ 8, 3, 0 ], "overmap": "refctr_N4d_north" }, + { "point": [ 9, 3, 0 ], "overmap": "refctr_N5d_north" }, + { "point": [ 5, 4, 0 ], "overmap": "refctr_N1e_north" }, + { "point": [ 6, 4, 0 ], "overmap": "refctr_N2e_north" }, + { "point": [ 7, 4, 0 ], "overmap": "refctr_N3e_north" }, + { "point": [ 8, 4, 0 ], "overmap": "refctr_N4e_north" }, + { "point": [ 9, 4, 0 ], "overmap": "refctr_N5e_north" }, + { "point": [ 10, 0, 0 ], "overmap": "refctr_NE1a_north" }, + { "point": [ 11, 0, 0 ], "overmap": "refctr_NE2a_north" }, + { "point": [ 12, 0, 0 ], "overmap": "refctr_NE3a_north" }, + { "point": [ 13, 0, 0 ], "overmap": "refctr_NE4a_north" }, + { "point": [ 14, 0, 0 ], "overmap": "refctr_NE5a_north" }, + { "point": [ 10, 1, 0 ], "overmap": "refctr_NE1b_north" }, + { "point": [ 11, 1, 0 ], "overmap": "refctr_NE2b_north" }, + { "point": [ 12, 1, 0 ], "overmap": "refctr_NE3b_north" }, + { "point": [ 13, 1, 0 ], "overmap": "refctr_NE4b_north" }, + { "point": [ 14, 1, 0 ], "overmap": "refctr_NE5b_north" }, + { "point": [ 10, 2, 0 ], "overmap": "refctr_NE1c_north" }, + { "point": [ 11, 2, 0 ], "overmap": "refctr_NE2c_north" }, + { "point": [ 12, 2, 0 ], "overmap": "refctr_NE3c_north" }, + { "point": [ 13, 2, 0 ], "overmap": "refctr_NE4c_north" }, + { "point": [ 14, 2, 0 ], "overmap": "refctr_NE5c_north" }, + { "point": [ 10, 3, 0 ], "overmap": "refctr_NE1d_north" }, + { "point": [ 11, 3, 0 ], "overmap": "refctr_NE2d_north" }, + { "point": [ 12, 3, 0 ], "overmap": "refctr_NE3d_north" }, + { "point": [ 13, 3, 0 ], "overmap": "refctr_NE4d_north" }, + { "point": [ 14, 3, 0 ], "overmap": "refctr_NE5d_north" }, + { "point": [ 10, 4, 0 ], "overmap": "refctr_NE1e_north" }, + { "point": [ 11, 4, 0 ], "overmap": "refctr_NE2e_north" }, + { "point": [ 12, 4, 0 ], "overmap": "refctr_NE3e_north" }, + { "point": [ 13, 4, 0 ], "overmap": "refctr_NE4e_north" }, + { "point": [ 14, 4, 0 ], "overmap": "refctr_NE5e_north" }, + { "point": [ 0, 5, 0 ], "overmap": "refctr_W1a_north" }, + { "point": [ 1, 5, 0 ], "overmap": "refctr_W2a_north" }, + { "point": [ 2, 5, 0 ], "overmap": "refctr_W3a_north" }, + { "point": [ 3, 5, 0 ], "overmap": "refctr_W4a_north" }, + { "point": [ 4, 5, 0 ], "overmap": "refctr_W5a_north" }, + { "point": [ 0, 6, 0 ], "overmap": "refctr_W1b_north" }, + { "point": [ 1, 6, 0 ], "overmap": "refctr_W2b_north" }, + { "point": [ 2, 6, 0 ], "overmap": "refctr_W3b_north" }, + { "point": [ 3, 6, 0 ], "overmap": "refctr_W4b_north" }, + { "point": [ 4, 6, 0 ], "overmap": "refctr_W5b_north" }, + { "point": [ 0, 7, 0 ], "overmap": "refctr_W1c_north" }, + { "point": [ 1, 7, 0 ], "overmap": "refctr_W2c_north" }, + { "point": [ 2, 7, 0 ], "overmap": "refctr_W3c_north" }, + { "point": [ 3, 7, 0 ], "overmap": "refctr_W4c_north" }, + { "point": [ 4, 7, 0 ], "overmap": "refctr_W5c_north" }, + { "point": [ 0, 8, 0 ], "overmap": "refctr_W1d_north" }, + { "point": [ 1, 8, 0 ], "overmap": "refctr_W2d_north" }, + { "point": [ 2, 8, 0 ], "overmap": "refctr_W3d_north" }, + { "point": [ 3, 8, 0 ], "overmap": "refctr_W4d_north" }, + { "point": [ 4, 8, 0 ], "overmap": "refctr_W5d_north" }, + { "point": [ 0, 9, 0 ], "overmap": "refctr_W1e_north" }, + { "point": [ 1, 9, 0 ], "overmap": "refctr_W2e_north" }, + { "point": [ 2, 9, 0 ], "overmap": "refctr_W3e_north" }, + { "point": [ 3, 9, 0 ], "overmap": "refctr_W4e_north" }, + { "point": [ 4, 9, 0 ], "overmap": "refctr_W5e_north" }, + { "point": [ 5, 5, 0 ], "overmap": "evac_center_1_north" }, + { "point": [ 6, 5, 0 ], "overmap": "evac_center_2_north" }, + { "point": [ 7, 5, 0 ], "overmap": "evac_center_3_north" }, + { "point": [ 8, 5, 0 ], "overmap": "evac_center_4_north" }, + { "point": [ 9, 5, 0 ], "overmap": "evac_center_5_north" }, + { "point": [ 5, 6, 0 ], "overmap": "evac_center_6_north" }, + { "point": [ 6, 6, 0 ], "overmap": "evac_center_7_north" }, + { "point": [ 7, 6, 0 ], "overmap": "evac_center_8_north" }, + { "point": [ 8, 6, 0 ], "overmap": "evac_center_9_north" }, + { "point": [ 9, 6, 0 ], "overmap": "evac_center_10_north" }, + { "point": [ 5, 7, 0 ], "overmap": "evac_center_11_north" }, + { "point": [ 6, 7, 0 ], "overmap": "evac_center_12_north" }, + { "point": [ 7, 7, 0 ], "overmap": "evac_center_13_north" }, + { "point": [ 8, 7, 0 ], "overmap": "evac_center_14_north" }, + { "point": [ 9, 7, 0 ], "overmap": "evac_center_15_north" }, + { "point": [ 5, 8, 0 ], "overmap": "evac_center_16_north" }, + { "point": [ 6, 8, 0 ], "overmap": "evac_center_17_north" }, + { "point": [ 7, 8, 0 ], "overmap": "evac_center_18_north" }, + { "point": [ 8, 8, 0 ], "overmap": "evac_center_19_north" }, + { "point": [ 9, 8, 0 ], "overmap": "evac_center_20_north" }, + { "point": [ 5, 9, 0 ], "overmap": "evac_center_21_north" }, + { "point": [ 6, 9, 0 ], "overmap": "evac_center_22_north" }, + { "point": [ 7, 9, 0 ], "overmap": "evac_center_23_north" }, + { "point": [ 8, 9, 0 ], "overmap": "evac_center_24_north" }, + { "point": [ 9, 9, 0 ], "overmap": "evac_center_25_north" }, + { "point": [ 10, 5, 0 ], "overmap": "refctr_E1a_north" }, + { "point": [ 11, 5, 0 ], "overmap": "refctr_E2a_north" }, + { "point": [ 12, 5, 0 ], "overmap": "refctr_E3a_north" }, + { "point": [ 13, 5, 0 ], "overmap": "refctr_E4a_north" }, + { "point": [ 14, 5, 0 ], "overmap": "refctr_E5a_north" }, + { "point": [ 10, 6, 0 ], "overmap": "refctr_E1b_north" }, + { "point": [ 11, 6, 0 ], "overmap": "refctr_E2b_north" }, + { "point": [ 12, 6, 0 ], "overmap": "refctr_E3b_north" }, + { "point": [ 13, 6, 0 ], "overmap": "refctr_E4b_north" }, + { "point": [ 14, 6, 0 ], "overmap": "refctr_E5b_north" }, + { "point": [ 10, 7, 0 ], "overmap": "refctr_E1c_north" }, + { "point": [ 11, 7, 0 ], "overmap": "refctr_E2c_north" }, + { "point": [ 12, 7, 0 ], "overmap": "refctr_E3c_north" }, + { "point": [ 13, 7, 0 ], "overmap": "refctr_E4c_north" }, + { "point": [ 14, 7, 0 ], "overmap": "refctr_E5c_north" }, + { "point": [ 10, 8, 0 ], "overmap": "refctr_E1d_north" }, + { "point": [ 11, 8, 0 ], "overmap": "refctr_E2d_north" }, + { "point": [ 12, 8, 0 ], "overmap": "refctr_E3d_north" }, + { "point": [ 13, 8, 0 ], "overmap": "refctr_E4d_north" }, + { "point": [ 14, 8, 0 ], "overmap": "refctr_E5d_north" }, + { "point": [ 10, 9, 0 ], "overmap": "refctr_E1e_north" }, + { "point": [ 11, 9, 0 ], "overmap": "refctr_E2e_north" }, + { "point": [ 12, 9, 0 ], "overmap": "refctr_E3e_north" }, + { "point": [ 13, 9, 0 ], "overmap": "refctr_E4e_north" }, + { "point": [ 14, 9, 0 ], "overmap": "refctr_E5e_north" }, + { "point": [ 0, 10, 0 ], "overmap": "refctr_SW1a_north" }, + { "point": [ 1, 10, 0 ], "overmap": "refctr_SW2a_north" }, + { "point": [ 2, 10, 0 ], "overmap": "refctr_SW3a_north" }, + { "point": [ 3, 10, 0 ], "overmap": "refctr_SW4a_north" }, + { "point": [ 4, 10, 0 ], "overmap": "refctr_SW5a_north" }, + { "point": [ 0, 11, 0 ], "overmap": "refctr_SW1b_north" }, + { "point": [ 1, 11, 0 ], "overmap": "refctr_SW2b_north" }, + { "point": [ 2, 11, 0 ], "overmap": "refctr_SW3b_north" }, + { "point": [ 3, 11, 0 ], "overmap": "refctr_SW4b_north" }, + { "point": [ 4, 11, 0 ], "overmap": "refctr_SW5b_north" }, + { "point": [ 0, 12, 0 ], "overmap": "refctr_SW1c_north" }, + { "point": [ 1, 12, 0 ], "overmap": "refctr_SW2c_north" }, + { "point": [ 2, 12, 0 ], "overmap": "refctr_SW3c_north" }, + { "point": [ 3, 12, 0 ], "overmap": "refctr_SW4c_north" }, + { "point": [ 4, 12, 0 ], "overmap": "refctr_SW5c_north" }, + { "point": [ 0, 13, 0 ], "overmap": "refctr_SW1d_north" }, + { "point": [ 1, 13, 0 ], "overmap": "refctr_SW2d_north" }, + { "point": [ 2, 13, 0 ], "overmap": "refctr_SW3d_north" }, + { "point": [ 3, 13, 0 ], "overmap": "refctr_SW4d_north" }, + { "point": [ 4, 13, 0 ], "overmap": "refctr_SW5d_north" }, + { "point": [ 0, 14, 0 ], "overmap": "refctr_SW1e_north" }, + { "point": [ 1, 14, 0 ], "overmap": "refctr_SW2e_north" }, + { "point": [ 2, 14, 0 ], "overmap": "refctr_SW3e_north" }, + { "point": [ 3, 14, 0 ], "overmap": "refctr_SW4e_north" }, + { "point": [ 4, 14, 0 ], "overmap": "refctr_SW5e_north" }, + { "point": [ 5, 10, 0 ], "overmap": "refctr_S1a_north" }, + { "point": [ 6, 10, 0 ], "overmap": "refctr_S2a_north" }, + { "point": [ 7, 10, 0 ], "overmap": "refctr_S3a_north" }, + { "point": [ 8, 10, 0 ], "overmap": "refctr_S4a_north" }, + { "point": [ 9, 10, 0 ], "overmap": "refctr_S5a_north" }, + { "point": [ 5, 11, 0 ], "overmap": "refctr_S1b_north" }, + { "point": [ 6, 11, 0 ], "overmap": "refctr_S2b_north" }, + { "point": [ 7, 11, 0 ], "overmap": "refctr_S3b_north" }, + { "point": [ 8, 11, 0 ], "overmap": "refctr_S4b_north" }, + { "point": [ 9, 11, 0 ], "overmap": "refctr_S5b_north" }, + { "point": [ 5, 12, 0 ], "overmap": "refctr_S1c_north" }, + { "point": [ 6, 12, 0 ], "overmap": "refctr_S2c_north" }, + { "point": [ 7, 12, 0 ], "overmap": "refctr_S3c_north" }, + { "point": [ 8, 12, 0 ], "overmap": "refctr_S4c_north" }, + { "point": [ 9, 12, 0 ], "overmap": "refctr_S5c_north" }, + { "point": [ 5, 13, 0 ], "overmap": "refctr_S1d_north" }, + { "point": [ 6, 13, 0 ], "overmap": "refctr_S2d_north" }, + { "point": [ 7, 13, 0 ], "overmap": "refctr_S3d_north" }, + { "point": [ 8, 13, 0 ], "overmap": "refctr_S4d_north" }, + { "point": [ 9, 13, 0 ], "overmap": "refctr_S5d_north" }, + { "point": [ 5, 14, 0 ], "overmap": "refctr_S1e_north" }, + { "point": [ 6, 14, 0 ], "overmap": "refctr_S2e_north" }, + { "point": [ 7, 14, 0 ], "overmap": "refctr_S3e_north" }, + { "point": [ 8, 14, 0 ], "overmap": "refctr_S4e_north" }, + { "point": [ 9, 14, 0 ], "overmap": "refctr_S5e_north" }, + { "point": [ 10, 10, 0 ], "overmap": "refctr_SE1a_north" }, + { "point": [ 11, 10, 0 ], "overmap": "refctr_SE2a_north" }, + { "point": [ 12, 10, 0 ], "overmap": "refctr_SE3a_north" }, + { "point": [ 13, 10, 0 ], "overmap": "refctr_SE4a_north" }, + { "point": [ 14, 10, 0 ], "overmap": "refctr_SE5a_north" }, + { "point": [ 10, 11, 0 ], "overmap": "refctr_SE1b_north" }, + { "point": [ 11, 11, 0 ], "overmap": "refctr_SE2b_north" }, + { "point": [ 12, 11, 0 ], "overmap": "refctr_SE3b_north" }, + { "point": [ 13, 11, 0 ], "overmap": "refctr_SE4b_north" }, + { "point": [ 14, 11, 0 ], "overmap": "refctr_SE5b_north" }, + { "point": [ 10, 12, 0 ], "overmap": "refctr_SE1c_north" }, + { "point": [ 11, 12, 0 ], "overmap": "refctr_SE2c_north" }, + { "point": [ 12, 12, 0 ], "overmap": "refctr_SE3c_north" }, + { "point": [ 13, 12, 0 ], "overmap": "refctr_SE4c_north" }, + { "point": [ 14, 12, 0 ], "overmap": "refctr_SE5c_north" }, + { "point": [ 10, 13, 0 ], "overmap": "refctr_SE1d_north" }, + { "point": [ 11, 13, 0 ], "overmap": "refctr_SE2d_north" }, + { "point": [ 12, 13, 0 ], "overmap": "refctr_SE3d_north" }, + { "point": [ 13, 13, 0 ], "overmap": "refctr_SE4d_north" }, + { "point": [ 14, 13, 0 ], "overmap": "refctr_SE5d_north" }, + { "point": [ 10, 14, 0 ], "overmap": "refctr_SE1e_north" }, + { "point": [ 11, 14, 0 ], "overmap": "refctr_SE2e_north" }, + { "point": [ 12, 14, 0 ], "overmap": "refctr_SE3e_north" }, + { "point": [ 13, 14, 0 ], "overmap": "refctr_SE4e_north" }, + { "point": [ 14, 14, 0 ], "overmap": "refctr_SE5e_north" }, + { "point": [ 0, 0, 1 ], "overmap": "refctr_NW1a_z1_north" }, + { "point": [ 1, 0, 1 ], "overmap": "refctr_NW2a_z1_north" }, + { "point": [ 2, 0, 1 ], "overmap": "refctr_NW3a_z1_north" }, + { "point": [ 3, 0, 1 ], "overmap": "refctr_NW4a_z1_north" }, + { "point": [ 4, 0, 1 ], "overmap": "refctr_NW5a_z1_north" }, + { "point": [ 0, 1, 1 ], "overmap": "refctr_NW1b_z1_north" }, + { "point": [ 1, 1, 1 ], "overmap": "refctr_NW2b_z1_north" }, + { "point": [ 2, 1, 1 ], "overmap": "refctr_NW3b_z1_north" }, + { "point": [ 3, 1, 1 ], "overmap": "refctr_NW4b_z1_north" }, + { "point": [ 4, 1, 1 ], "overmap": "refctr_NW5b_z1_north" }, + { "point": [ 0, 2, 1 ], "overmap": "refctr_NW1c_z1_north" }, + { "point": [ 1, 2, 1 ], "overmap": "refctr_NW2c_z1_north" }, + { "point": [ 2, 2, 1 ], "overmap": "refctr_NW3c_z1_north" }, + { "point": [ 3, 2, 1 ], "overmap": "refctr_NW4c_z1_north" }, + { "point": [ 4, 2, 1 ], "overmap": "refctr_NW5c_z1_north" }, + { "point": [ 0, 3, 1 ], "overmap": "refctr_NW1d_z1_north" }, + { "point": [ 1, 3, 1 ], "overmap": "refctr_NW2d_z1_north" }, + { "point": [ 2, 3, 1 ], "overmap": "refctr_NW3d_z1_north" }, + { "point": [ 3, 3, 1 ], "overmap": "refctr_NW4d_z1_north" }, + { "point": [ 4, 3, 1 ], "overmap": "refctr_NW5d_z1_north" }, + { "point": [ 0, 4, 1 ], "overmap": "refctr_NW1e_z1_north" }, + { "point": [ 1, 4, 1 ], "overmap": "refctr_NW2e_z1_north" }, + { "point": [ 2, 4, 1 ], "overmap": "refctr_NW3e_z1_north" }, + { "point": [ 3, 4, 1 ], "overmap": "refctr_NW4e_z1_north" }, + { "point": [ 4, 4, 1 ], "overmap": "refctr_NW5e_z1_north" }, + { "point": [ 5, 0, 1 ], "overmap": "refctr_N1a_z1_north" }, + { "point": [ 6, 0, 1 ], "overmap": "refctr_N2a_z1_north" }, + { "point": [ 7, 0, 1 ], "overmap": "refctr_N3a_z1_north" }, + { "point": [ 8, 0, 1 ], "overmap": "refctr_N4a_z1_north" }, + { "point": [ 9, 0, 1 ], "overmap": "refctr_N5a_z1_north" }, + { "point": [ 5, 1, 1 ], "overmap": "refctr_N1b_z1_north" }, + { "point": [ 6, 1, 1 ], "overmap": "refctr_N2b_z1_north" }, + { "point": [ 7, 1, 1 ], "overmap": "refctr_N3b_z1_north" }, + { "point": [ 8, 1, 1 ], "overmap": "refctr_N4b_z1_north" }, + { "point": [ 9, 1, 1 ], "overmap": "refctr_N5b_z1_north" }, + { "point": [ 5, 2, 1 ], "overmap": "refctr_N1c_z1_north" }, + { "point": [ 6, 2, 1 ], "overmap": "refctr_N2c_z1_north" }, + { "point": [ 7, 2, 1 ], "overmap": "refctr_N3c_z1_north" }, + { "point": [ 8, 2, 1 ], "overmap": "refctr_N4c_z1_north" }, + { "point": [ 9, 2, 1 ], "overmap": "refctr_N5c_z1_north" }, + { "point": [ 5, 3, 1 ], "overmap": "refctr_N1d_z1_north" }, + { "point": [ 6, 3, 1 ], "overmap": "refctr_N2d_z1_north" }, + { "point": [ 7, 3, 1 ], "overmap": "refctr_N3d_z1_north" }, + { "point": [ 8, 3, 1 ], "overmap": "refctr_N4d_z1_north" }, + { "point": [ 9, 3, 1 ], "overmap": "refctr_N5d_z1_north" }, + { "point": [ 5, 4, 1 ], "overmap": "refctr_N1e_z1_north" }, + { "point": [ 6, 4, 1 ], "overmap": "refctr_N2e_z1_north" }, + { "point": [ 7, 4, 1 ], "overmap": "refctr_N3e_z1_north" }, + { "point": [ 8, 4, 1 ], "overmap": "refctr_N4e_z1_north" }, + { "point": [ 9, 4, 1 ], "overmap": "refctr_N5e_z1_north" }, + { "point": [ 10, 0, 1 ], "overmap": "refctr_NE1a_z1_north" }, + { "point": [ 11, 0, 1 ], "overmap": "refctr_NE2a_z1_north" }, + { "point": [ 12, 0, 1 ], "overmap": "refctr_NE3a_z1_north" }, + { "point": [ 13, 0, 1 ], "overmap": "refctr_NE4a_z1_north" }, + { "point": [ 14, 0, 1 ], "overmap": "refctr_NE5a_z1_north" }, + { "point": [ 10, 1, 1 ], "overmap": "refctr_NE1b_z1_north" }, + { "point": [ 11, 1, 1 ], "overmap": "refctr_NE2b_z1_north" }, + { "point": [ 12, 1, 1 ], "overmap": "refctr_NE3b_z1_north" }, + { "point": [ 13, 1, 1 ], "overmap": "refctr_NE4b_z1_north" }, + { "point": [ 14, 1, 1 ], "overmap": "refctr_NE5b_z1_north" }, + { "point": [ 10, 2, 1 ], "overmap": "refctr_NE1c_z1_north" }, + { "point": [ 11, 2, 1 ], "overmap": "refctr_NE2c_z1_north" }, + { "point": [ 12, 2, 1 ], "overmap": "refctr_NE3c_z1_north" }, + { "point": [ 13, 2, 1 ], "overmap": "refctr_NE4c_z1_north" }, + { "point": [ 14, 2, 1 ], "overmap": "refctr_NE5c_z1_north" }, + { "point": [ 10, 3, 1 ], "overmap": "refctr_NE1d_z1_north" }, + { "point": [ 11, 3, 1 ], "overmap": "refctr_NE2d_z1_north" }, + { "point": [ 12, 3, 1 ], "overmap": "refctr_NE3d_z1_north" }, + { "point": [ 13, 3, 1 ], "overmap": "refctr_NE4d_z1_north" }, + { "point": [ 14, 3, 1 ], "overmap": "refctr_NE5d_z1_north" }, + { "point": [ 10, 4, 1 ], "overmap": "refctr_NE1e_z1_north" }, + { "point": [ 11, 4, 1 ], "overmap": "refctr_NE2e_z1_north" }, + { "point": [ 12, 4, 1 ], "overmap": "refctr_NE3e_z1_north" }, + { "point": [ 13, 4, 1 ], "overmap": "refctr_NE4e_z1_north" }, + { "point": [ 14, 4, 1 ], "overmap": "refctr_NE5e_z1_north" }, + { "point": [ 0, 5, 1 ], "overmap": "refctr_W1a_z1_north" }, + { "point": [ 1, 5, 1 ], "overmap": "refctr_W2a_z1_north" }, + { "point": [ 2, 5, 1 ], "overmap": "refctr_W3a_z1_north" }, + { "point": [ 3, 5, 1 ], "overmap": "refctr_W4a_z1_north" }, + { "point": [ 4, 5, 1 ], "overmap": "refctr_W5a_z1_north" }, + { "point": [ 0, 6, 1 ], "overmap": "refctr_W1b_z1_north" }, + { "point": [ 1, 6, 1 ], "overmap": "refctr_W2b_z1_north" }, + { "point": [ 2, 6, 1 ], "overmap": "refctr_W3b_z1_north" }, + { "point": [ 3, 6, 1 ], "overmap": "refctr_W4b_z1_north" }, + { "point": [ 4, 6, 1 ], "overmap": "refctr_W5b_z1_north" }, + { "point": [ 0, 7, 1 ], "overmap": "refctr_W1c_z1_north" }, + { "point": [ 1, 7, 1 ], "overmap": "refctr_W2c_z1_north" }, + { "point": [ 2, 7, 1 ], "overmap": "refctr_W3c_z1_north" }, + { "point": [ 3, 7, 1 ], "overmap": "refctr_W4c_z1_north" }, + { "point": [ 4, 7, 1 ], "overmap": "refctr_W5c_z1_north" }, + { "point": [ 0, 8, 1 ], "overmap": "refctr_W1d_z1_north" }, + { "point": [ 1, 8, 1 ], "overmap": "refctr_W2d_z1_north" }, + { "point": [ 2, 8, 1 ], "overmap": "refctr_W3d_z1_north" }, + { "point": [ 3, 8, 1 ], "overmap": "refctr_W4d_z1_north" }, + { "point": [ 4, 8, 1 ], "overmap": "refctr_W5d_z1_north" }, + { "point": [ 0, 9, 1 ], "overmap": "refctr_W1e_z1_north" }, + { "point": [ 1, 9, 1 ], "overmap": "refctr_W2e_z1_north" }, + { "point": [ 2, 9, 1 ], "overmap": "refctr_W3e_z1_north" }, + { "point": [ 3, 9, 1 ], "overmap": "refctr_W4e_z1_north" }, + { "point": [ 4, 9, 1 ], "overmap": "refctr_W5e_z1_north" }, + { "point": [ 5, 5, 1 ], "overmap": "evac_center_1_z1_north" }, + { "point": [ 6, 5, 1 ], "overmap": "evac_center_2_z1_north" }, + { "point": [ 7, 5, 1 ], "overmap": "evac_center_3_z1_north" }, + { "point": [ 8, 5, 1 ], "overmap": "evac_center_4_z1_north" }, + { "point": [ 9, 5, 1 ], "overmap": "evac_center_5_z1_north" }, + { "point": [ 5, 6, 1 ], "overmap": "evac_center_6_z1_north" }, + { "point": [ 6, 6, 1 ], "overmap": "evac_center_7_z1_north" }, + { "point": [ 7, 6, 1 ], "overmap": "evac_center_8_z1_north" }, + { "point": [ 8, 6, 1 ], "overmap": "evac_center_9_z1_north" }, + { "point": [ 9, 6, 1 ], "overmap": "evac_center_10_z1_north" }, + { "point": [ 5, 7, 1 ], "overmap": "evac_center_11_z1_north" }, + { "point": [ 6, 7, 1 ], "overmap": "evac_center_12_z1_north" }, + { "point": [ 7, 7, 1 ], "overmap": "evac_center_13_z1_north" }, + { "point": [ 8, 7, 1 ], "overmap": "evac_center_14_z1_north" }, + { "point": [ 9, 7, 1 ], "overmap": "evac_center_15_z1_north" }, + { "point": [ 5, 8, 1 ], "overmap": "evac_center_16_z1_north" }, + { "point": [ 6, 8, 1 ], "overmap": "evac_center_17_z1_north" }, + { "point": [ 7, 8, 1 ], "overmap": "evac_center_18_z1_north" }, + { "point": [ 8, 8, 1 ], "overmap": "evac_center_19_z1_north" }, + { "point": [ 9, 8, 1 ], "overmap": "evac_center_20_z1_north" }, + { "point": [ 5, 9, 1 ], "overmap": "evac_center_21_z1_north" }, + { "point": [ 6, 9, 1 ], "overmap": "evac_center_22_z1_north" }, + { "point": [ 7, 9, 1 ], "overmap": "evac_center_23_z1_north" }, + { "point": [ 8, 9, 1 ], "overmap": "evac_center_24_z1_north" }, + { "point": [ 9, 9, 1 ], "overmap": "evac_center_25_z1_north" }, + { "point": [ 10, 5, 1 ], "overmap": "refctr_E1a_z1_north" }, + { "point": [ 11, 5, 1 ], "overmap": "refctr_E2a_z1_north" }, + { "point": [ 12, 5, 1 ], "overmap": "refctr_E3a_z1_north" }, + { "point": [ 13, 5, 1 ], "overmap": "refctr_E4a_z1_north" }, + { "point": [ 14, 5, 1 ], "overmap": "refctr_E5a_z1_north" }, + { "point": [ 10, 6, 1 ], "overmap": "refctr_E1b_z1_north" }, + { "point": [ 11, 6, 1 ], "overmap": "refctr_E2b_z1_north" }, + { "point": [ 12, 6, 1 ], "overmap": "refctr_E3b_z1_north" }, + { "point": [ 13, 6, 1 ], "overmap": "refctr_E4b_z1_north" }, + { "point": [ 14, 6, 1 ], "overmap": "refctr_E5b_z1_north" }, + { "point": [ 10, 7, 1 ], "overmap": "refctr_E1c_z1_north" }, + { "point": [ 11, 7, 1 ], "overmap": "refctr_E2c_z1_north" }, + { "point": [ 12, 7, 1 ], "overmap": "refctr_E3c_z1_north" }, + { "point": [ 13, 7, 1 ], "overmap": "refctr_E4c_z1_north" }, + { "point": [ 14, 7, 1 ], "overmap": "refctr_E5c_z1_north" }, + { "point": [ 10, 8, 1 ], "overmap": "refctr_E1d_z1_north" }, + { "point": [ 11, 8, 1 ], "overmap": "refctr_E2d_z1_north" }, + { "point": [ 12, 8, 1 ], "overmap": "refctr_E3d_z1_north" }, + { "point": [ 13, 8, 1 ], "overmap": "refctr_E4d_z1_north" }, + { "point": [ 14, 8, 1 ], "overmap": "refctr_E5d_z1_north" }, + { "point": [ 10, 9, 1 ], "overmap": "refctr_E1e_z1_north" }, + { "point": [ 11, 9, 1 ], "overmap": "refctr_E2e_z1_north" }, + { "point": [ 12, 9, 1 ], "overmap": "refctr_E3e_z1_north" }, + { "point": [ 13, 9, 1 ], "overmap": "refctr_E4e_z1_north" }, + { "point": [ 14, 9, 1 ], "overmap": "refctr_E5e_z1_north" }, + { "point": [ 0, 10, 1 ], "overmap": "refctr_SW1a_z1_north" }, + { "point": [ 1, 10, 1 ], "overmap": "refctr_SW2a_z1_north" }, + { "point": [ 2, 10, 1 ], "overmap": "refctr_SW3a_z1_north" }, + { "point": [ 3, 10, 1 ], "overmap": "refctr_SW4a_z1_north" }, + { "point": [ 4, 10, 1 ], "overmap": "refctr_SW5a_z1_north" }, + { "point": [ 0, 11, 1 ], "overmap": "refctr_SW1b_z1_north" }, + { "point": [ 1, 11, 1 ], "overmap": "refctr_SW2b_z1_north" }, + { "point": [ 2, 11, 1 ], "overmap": "refctr_SW3b_z1_north" }, + { "point": [ 3, 11, 1 ], "overmap": "refctr_SW4b_z1_north" }, + { "point": [ 4, 11, 1 ], "overmap": "refctr_SW5b_z1_north" }, + { "point": [ 0, 12, 1 ], "overmap": "refctr_SW1c_z1_north" }, + { "point": [ 1, 12, 1 ], "overmap": "refctr_SW2c_z1_north" }, + { "point": [ 2, 12, 1 ], "overmap": "refctr_SW3c_z1_north" }, + { "point": [ 3, 12, 1 ], "overmap": "refctr_SW4c_z1_north" }, + { "point": [ 4, 12, 1 ], "overmap": "refctr_SW5c_z1_north" }, + { "point": [ 0, 13, 1 ], "overmap": "refctr_SW1d_z1_north" }, + { "point": [ 1, 13, 1 ], "overmap": "refctr_SW2d_z1_north" }, + { "point": [ 2, 13, 1 ], "overmap": "refctr_SW3d_z1_north" }, + { "point": [ 3, 13, 1 ], "overmap": "refctr_SW4d_z1_north" }, + { "point": [ 4, 13, 1 ], "overmap": "refctr_SW5d_z1_north" }, + { "point": [ 0, 14, 1 ], "overmap": "refctr_SW1e_z1_north" }, + { "point": [ 1, 14, 1 ], "overmap": "refctr_SW2e_z1_north" }, + { "point": [ 2, 14, 1 ], "overmap": "refctr_SW3e_z1_north" }, + { "point": [ 3, 14, 1 ], "overmap": "refctr_SW4e_z1_north" }, + { "point": [ 4, 14, 1 ], "overmap": "refctr_SW5e_z1_north" }, + { "point": [ 5, 10, 1 ], "overmap": "refctr_S1a_z1_north" }, + { "point": [ 6, 10, 1 ], "overmap": "refctr_S2a_z1_north" }, + { "point": [ 7, 10, 1 ], "overmap": "refctr_S3a_z1_north" }, + { "point": [ 8, 10, 1 ], "overmap": "refctr_S4a_z1_north" }, + { "point": [ 9, 10, 1 ], "overmap": "refctr_S5a_z1_north" }, + { "point": [ 5, 11, 1 ], "overmap": "refctr_S1b_z1_north" }, + { "point": [ 6, 11, 1 ], "overmap": "refctr_S2b_z1_north" }, + { "point": [ 7, 11, 1 ], "overmap": "refctr_S3b_z1_north" }, + { "point": [ 8, 11, 1 ], "overmap": "refctr_S4b_z1_north" }, + { "point": [ 9, 11, 1 ], "overmap": "refctr_S5b_z1_north" }, + { "point": [ 5, 12, 1 ], "overmap": "refctr_S1c_z1_north" }, + { "point": [ 6, 12, 1 ], "overmap": "refctr_S2c_z1_north" }, + { "point": [ 7, 12, 1 ], "overmap": "refctr_S3c_z1_north" }, + { "point": [ 8, 12, 1 ], "overmap": "refctr_S4c_z1_north" }, + { "point": [ 9, 12, 1 ], "overmap": "refctr_S5c_z1_north" }, + { "point": [ 5, 13, 1 ], "overmap": "refctr_S1d_z1_north" }, + { "point": [ 6, 13, 1 ], "overmap": "refctr_S2d_z1_north" }, + { "point": [ 7, 13, 1 ], "overmap": "refctr_S3d_z1_north" }, + { "point": [ 8, 13, 1 ], "overmap": "refctr_S4d_z1_north" }, + { "point": [ 9, 13, 1 ], "overmap": "refctr_S5d_z1_north" }, + { "point": [ 5, 14, 1 ], "overmap": "refctr_S1e_z1_north" }, + { "point": [ 6, 14, 1 ], "overmap": "refctr_S2e_z1_north" }, + { "point": [ 7, 14, 1 ], "overmap": "refctr_S3e_z1_north" }, + { "point": [ 8, 14, 1 ], "overmap": "refctr_S4e_z1_north" }, + { "point": [ 9, 14, 1 ], "overmap": "refctr_S5e_z1_north" }, + { "point": [ 10, 10, 1 ], "overmap": "refctr_SE1a_z1_north" }, + { "point": [ 11, 10, 1 ], "overmap": "refctr_SE2a_z1_north" }, + { "point": [ 12, 10, 1 ], "overmap": "refctr_SE3a_z1_north" }, + { "point": [ 13, 10, 1 ], "overmap": "refctr_SE4a_z1_north" }, + { "point": [ 14, 10, 1 ], "overmap": "refctr_SE5a_z1_north" }, + { "point": [ 10, 11, 1 ], "overmap": "refctr_SE1b_z1_north" }, + { "point": [ 11, 11, 1 ], "overmap": "refctr_SE2b_z1_north" }, + { "point": [ 12, 11, 1 ], "overmap": "refctr_SE3b_z1_north" }, + { "point": [ 13, 11, 1 ], "overmap": "refctr_SE4b_z1_north" }, + { "point": [ 14, 11, 1 ], "overmap": "refctr_SE5b_z1_north" }, + { "point": [ 10, 12, 1 ], "overmap": "refctr_SE1c_z1_north" }, + { "point": [ 11, 12, 1 ], "overmap": "refctr_SE2c_z1_north" }, + { "point": [ 12, 12, 1 ], "overmap": "refctr_SE3c_z1_north" }, + { "point": [ 13, 12, 1 ], "overmap": "refctr_SE4c_z1_north" }, + { "point": [ 14, 12, 1 ], "overmap": "refctr_SE5c_z1_north" }, + { "point": [ 10, 13, 1 ], "overmap": "refctr_SE1d_z1_north" }, + { "point": [ 11, 13, 1 ], "overmap": "refctr_SE2d_z1_north" }, + { "point": [ 12, 13, 1 ], "overmap": "refctr_SE3d_z1_north" }, + { "point": [ 13, 13, 1 ], "overmap": "refctr_SE4d_z1_north" }, + { "point": [ 14, 13, 1 ], "overmap": "refctr_SE5d_z1_north" }, + { "point": [ 10, 14, 1 ], "overmap": "refctr_SE1e_z1_north" }, + { "point": [ 11, 14, 1 ], "overmap": "refctr_SE2e_z1_north" }, + { "point": [ 12, 14, 1 ], "overmap": "refctr_SE3e_z1_north" }, + { "point": [ 13, 14, 1 ], "overmap": "refctr_SE4e_z1_north" }, + { "point": [ 14, 14, 1 ], "overmap": "refctr_SE5e_z1_north" }, + { "point": [ 0, 0, 2 ], "overmap": "refctr_NW1a_z2_north" }, + { "point": [ 1, 0, 2 ], "overmap": "refctr_NW2a_z2_north" }, + { "point": [ 2, 0, 2 ], "overmap": "refctr_NW3a_z2_north" }, + { "point": [ 3, 0, 2 ], "overmap": "refctr_NW4a_z2_north" }, + { "point": [ 4, 0, 2 ], "overmap": "refctr_NW5a_z2_north" }, + { "point": [ 0, 1, 2 ], "overmap": "refctr_NW1b_z2_north" }, + { "point": [ 1, 1, 2 ], "overmap": "refctr_NW2b_z2_north" }, + { "point": [ 2, 1, 2 ], "overmap": "refctr_NW3b_z2_north" }, + { "point": [ 3, 1, 2 ], "overmap": "refctr_NW4b_z2_north" }, + { "point": [ 4, 1, 2 ], "overmap": "refctr_NW5b_z2_north" }, + { "point": [ 0, 2, 2 ], "overmap": "refctr_NW1c_z2_north" }, + { "point": [ 1, 2, 2 ], "overmap": "refctr_NW2c_z2_north" }, + { "point": [ 2, 2, 2 ], "overmap": "refctr_NW3c_z2_north" }, + { "point": [ 3, 2, 2 ], "overmap": "refctr_NW4c_z2_north" }, + { "point": [ 4, 2, 2 ], "overmap": "refctr_NW5c_z2_north" }, + { "point": [ 0, 3, 2 ], "overmap": "refctr_NW1d_z2_north" }, + { "point": [ 1, 3, 2 ], "overmap": "refctr_NW2d_z2_north" }, + { "point": [ 2, 3, 2 ], "overmap": "refctr_NW3d_z2_north" }, + { "point": [ 3, 3, 2 ], "overmap": "refctr_NW4d_z2_north" }, + { "point": [ 4, 3, 2 ], "overmap": "refctr_NW5d_z2_north" }, + { "point": [ 0, 4, 2 ], "overmap": "refctr_NW1e_z2_north" }, + { "point": [ 1, 4, 2 ], "overmap": "refctr_NW2e_z2_north" }, + { "point": [ 2, 4, 2 ], "overmap": "refctr_NW3e_z2_north" }, + { "point": [ 3, 4, 2 ], "overmap": "refctr_NW4e_z2_north" }, + { "point": [ 4, 4, 2 ], "overmap": "refctr_NW5e_z2_north" }, + { "point": [ 5, 0, 2 ], "overmap": "refctr_N1a_z2_north" }, + { "point": [ 6, 0, 2 ], "overmap": "refctr_N2a_z2_north" }, + { "point": [ 7, 0, 2 ], "overmap": "refctr_N3a_z2_north" }, + { "point": [ 8, 0, 2 ], "overmap": "refctr_N4a_z2_north" }, + { "point": [ 9, 0, 2 ], "overmap": "refctr_N5a_z2_north" }, + { "point": [ 5, 1, 2 ], "overmap": "refctr_N1b_z2_north" }, + { "point": [ 6, 1, 2 ], "overmap": "refctr_N2b_z2_north" }, + { "point": [ 7, 1, 2 ], "overmap": "refctr_N3b_z2_north" }, + { "point": [ 8, 1, 2 ], "overmap": "refctr_N4b_z2_north" }, + { "point": [ 9, 1, 2 ], "overmap": "refctr_N5b_z2_north" }, + { "point": [ 5, 2, 2 ], "overmap": "refctr_N1c_z2_north" }, + { "point": [ 6, 2, 2 ], "overmap": "refctr_N2c_z2_north" }, + { "point": [ 7, 2, 2 ], "overmap": "refctr_N3c_z2_north" }, + { "point": [ 8, 2, 2 ], "overmap": "refctr_N4c_z2_north" }, + { "point": [ 9, 2, 2 ], "overmap": "refctr_N5c_z2_north" }, + { "point": [ 5, 3, 2 ], "overmap": "refctr_N1d_z2_north" }, + { "point": [ 6, 3, 2 ], "overmap": "refctr_N2d_z2_north" }, + { "point": [ 7, 3, 2 ], "overmap": "refctr_N3d_z2_north" }, + { "point": [ 8, 3, 2 ], "overmap": "refctr_N4d_z2_north" }, + { "point": [ 9, 3, 2 ], "overmap": "refctr_N5d_z2_north" }, + { "point": [ 5, 4, 2 ], "overmap": "refctr_N1e_z2_north" }, + { "point": [ 6, 4, 2 ], "overmap": "refctr_N2e_z2_north" }, + { "point": [ 7, 4, 2 ], "overmap": "refctr_N3e_z2_north" }, + { "point": [ 8, 4, 2 ], "overmap": "refctr_N4e_z2_north" }, + { "point": [ 9, 4, 2 ], "overmap": "refctr_N5e_z2_north" }, + { "point": [ 10, 0, 2 ], "overmap": "refctr_NE1a_z2_north" }, + { "point": [ 11, 0, 2 ], "overmap": "refctr_NE2a_z2_north" }, + { "point": [ 12, 0, 2 ], "overmap": "refctr_NE3a_z2_north" }, + { "point": [ 13, 0, 2 ], "overmap": "refctr_NE4a_z2_north" }, + { "point": [ 14, 0, 2 ], "overmap": "refctr_NE5a_z2_north" }, + { "point": [ 10, 1, 2 ], "overmap": "refctr_NE1b_z2_north" }, + { "point": [ 11, 1, 2 ], "overmap": "refctr_NE2b_z2_north" }, + { "point": [ 12, 1, 2 ], "overmap": "refctr_NE3b_z2_north" }, + { "point": [ 13, 1, 2 ], "overmap": "refctr_NE4b_z2_north" }, + { "point": [ 14, 1, 2 ], "overmap": "refctr_NE5b_z2_north" }, + { "point": [ 10, 2, 2 ], "overmap": "refctr_NE1c_z2_north" }, + { "point": [ 11, 2, 2 ], "overmap": "refctr_NE2c_z2_north" }, + { "point": [ 12, 2, 2 ], "overmap": "refctr_NE3c_z2_north" }, + { "point": [ 13, 2, 2 ], "overmap": "refctr_NE4c_z2_north" }, + { "point": [ 14, 2, 2 ], "overmap": "refctr_NE5c_z2_north" }, + { "point": [ 10, 3, 2 ], "overmap": "refctr_NE1d_z2_north" }, + { "point": [ 11, 3, 2 ], "overmap": "refctr_NE2d_z2_north" }, + { "point": [ 12, 3, 2 ], "overmap": "refctr_NE3d_z2_north" }, + { "point": [ 13, 3, 2 ], "overmap": "refctr_NE4d_z2_north" }, + { "point": [ 14, 3, 2 ], "overmap": "refctr_NE5d_z2_north" }, + { "point": [ 10, 4, 2 ], "overmap": "refctr_NE1e_z2_north" }, + { "point": [ 11, 4, 2 ], "overmap": "refctr_NE2e_z2_north" }, + { "point": [ 12, 4, 2 ], "overmap": "refctr_NE3e_z2_north" }, + { "point": [ 13, 4, 2 ], "overmap": "refctr_NE4e_z2_north" }, + { "point": [ 14, 4, 2 ], "overmap": "refctr_NE5e_z2_north" }, + { "point": [ 0, 5, 2 ], "overmap": "refctr_W1a_z2_north" }, + { "point": [ 1, 5, 2 ], "overmap": "refctr_W2a_z2_north" }, + { "point": [ 2, 5, 2 ], "overmap": "refctr_W3a_z2_north" }, + { "point": [ 3, 5, 2 ], "overmap": "refctr_W4a_z2_north" }, + { "point": [ 4, 5, 2 ], "overmap": "refctr_W5a_z2_north" }, + { "point": [ 0, 6, 2 ], "overmap": "refctr_W1b_z2_north" }, + { "point": [ 1, 6, 2 ], "overmap": "refctr_W2b_z2_north" }, + { "point": [ 2, 6, 2 ], "overmap": "refctr_W3b_z2_north" }, + { "point": [ 3, 6, 2 ], "overmap": "refctr_W4b_z2_north" }, + { "point": [ 4, 6, 2 ], "overmap": "refctr_W5b_z2_north" }, + { "point": [ 0, 7, 2 ], "overmap": "refctr_W1c_z2_north" }, + { "point": [ 1, 7, 2 ], "overmap": "refctr_W2c_z2_north" }, + { "point": [ 2, 7, 2 ], "overmap": "refctr_W3c_z2_north" }, + { "point": [ 3, 7, 2 ], "overmap": "refctr_W4c_z2_north" }, + { "point": [ 4, 7, 2 ], "overmap": "refctr_W5c_z2_north" }, + { "point": [ 0, 8, 2 ], "overmap": "refctr_W1d_z2_north" }, + { "point": [ 1, 8, 2 ], "overmap": "refctr_W2d_z2_north" }, + { "point": [ 2, 8, 2 ], "overmap": "refctr_W3d_z2_north" }, + { "point": [ 3, 8, 2 ], "overmap": "refctr_W4d_z2_north" }, + { "point": [ 4, 8, 2 ], "overmap": "refctr_W5d_z2_north" }, + { "point": [ 0, 9, 2 ], "overmap": "refctr_W1e_z2_north" }, + { "point": [ 1, 9, 2 ], "overmap": "refctr_W2e_z2_north" }, + { "point": [ 2, 9, 2 ], "overmap": "refctr_W3e_z2_north" }, + { "point": [ 3, 9, 2 ], "overmap": "refctr_W4e_z2_north" }, + { "point": [ 4, 9, 2 ], "overmap": "refctr_W5e_z2_north" }, + { "point": [ 5, 5, 2 ], "overmap": "evac_center_1_z2_north" }, + { "point": [ 6, 5, 2 ], "overmap": "evac_center_2_z2_north" }, + { "point": [ 7, 5, 2 ], "overmap": "evac_center_3_z2_north" }, + { "point": [ 8, 5, 2 ], "overmap": "evac_center_4_z2_north" }, + { "point": [ 9, 5, 2 ], "overmap": "evac_center_5_z2_north" }, + { "point": [ 5, 6, 2 ], "overmap": "evac_center_6_z2_north" }, + { "point": [ 6, 6, 2 ], "overmap": "evac_center_7_z2_north" }, + { "point": [ 7, 6, 2 ], "overmap": "evac_center_8_z2_north" }, + { "point": [ 8, 6, 2 ], "overmap": "evac_center_9_z2_north" }, + { "point": [ 9, 6, 2 ], "overmap": "evac_center_10_z2_north" }, + { "point": [ 5, 7, 2 ], "overmap": "evac_center_11_z2_north" }, + { "point": [ 6, 7, 2 ], "overmap": "evac_center_12_z2_north" }, + { "point": [ 7, 7, 2 ], "overmap": "evac_center_13_z2_north" }, + { "point": [ 8, 7, 2 ], "overmap": "evac_center_14_z2_north" }, + { "point": [ 9, 7, 2 ], "overmap": "evac_center_15_z2_north" }, + { "point": [ 5, 8, 2 ], "overmap": "evac_center_16_z2_north" }, + { "point": [ 6, 8, 2 ], "overmap": "evac_center_17_z2_north" }, + { "point": [ 7, 8, 2 ], "overmap": "evac_center_18_z2_north" }, + { "point": [ 8, 8, 2 ], "overmap": "evac_center_19_z2_north" }, + { "point": [ 9, 8, 2 ], "overmap": "evac_center_20_z2_north" }, + { "point": [ 5, 9, 2 ], "overmap": "evac_center_21_z2_north" }, + { "point": [ 6, 9, 2 ], "overmap": "evac_center_22_z2_north" }, + { "point": [ 7, 9, 2 ], "overmap": "evac_center_23_z2_north" }, + { "point": [ 8, 9, 2 ], "overmap": "evac_center_24_z2_north" }, + { "point": [ 9, 9, 2 ], "overmap": "evac_center_25_z2_north" }, + { "point": [ 10, 5, 2 ], "overmap": "refctr_E1a_z2_north" }, + { "point": [ 11, 5, 2 ], "overmap": "refctr_E2a_z2_north" }, + { "point": [ 12, 5, 2 ], "overmap": "refctr_E3a_z2_north" }, + { "point": [ 13, 5, 2 ], "overmap": "refctr_E4a_z2_north" }, + { "point": [ 14, 5, 2 ], "overmap": "refctr_E5a_z2_north" }, + { "point": [ 10, 6, 2 ], "overmap": "refctr_E1b_z2_north" }, + { "point": [ 11, 6, 2 ], "overmap": "refctr_E2b_z2_north" }, + { "point": [ 12, 6, 2 ], "overmap": "refctr_E3b_z2_north" }, + { "point": [ 13, 6, 2 ], "overmap": "refctr_E4b_z2_north" }, + { "point": [ 14, 6, 2 ], "overmap": "refctr_E5b_z2_north" }, + { "point": [ 10, 7, 2 ], "overmap": "refctr_E1c_z2_north" }, + { "point": [ 11, 7, 2 ], "overmap": "refctr_E2c_z2_north" }, + { "point": [ 12, 7, 2 ], "overmap": "refctr_E3c_z2_north" }, + { "point": [ 13, 7, 2 ], "overmap": "refctr_E4c_z2_north" }, + { "point": [ 14, 7, 2 ], "overmap": "refctr_E5c_z2_north" }, + { "point": [ 10, 8, 2 ], "overmap": "refctr_E1d_z2_north" }, + { "point": [ 11, 8, 2 ], "overmap": "refctr_E2d_z2_north" }, + { "point": [ 12, 8, 2 ], "overmap": "refctr_E3d_z2_north" }, + { "point": [ 13, 8, 2 ], "overmap": "refctr_E4d_z2_north" }, + { "point": [ 14, 8, 2 ], "overmap": "refctr_E5d_z2_north" }, + { "point": [ 10, 9, 2 ], "overmap": "refctr_E1e_z2_north" }, + { "point": [ 11, 9, 2 ], "overmap": "refctr_E2e_z2_north" }, + { "point": [ 12, 9, 2 ], "overmap": "refctr_E3e_z2_north" }, + { "point": [ 13, 9, 2 ], "overmap": "refctr_E4e_z2_north" }, + { "point": [ 14, 9, 2 ], "overmap": "refctr_E5e_z2_north" }, + { "point": [ 0, 10, 2 ], "overmap": "refctr_SW1a_z2_north" }, + { "point": [ 1, 10, 2 ], "overmap": "refctr_SW2a_z2_north" }, + { "point": [ 2, 10, 2 ], "overmap": "refctr_SW3a_z2_north" }, + { "point": [ 3, 10, 2 ], "overmap": "refctr_SW4a_z2_north" }, + { "point": [ 4, 10, 2 ], "overmap": "refctr_SW5a_z2_north" }, + { "point": [ 0, 11, 2 ], "overmap": "refctr_SW1b_z2_north" }, + { "point": [ 1, 11, 2 ], "overmap": "refctr_SW2b_z2_north" }, + { "point": [ 2, 11, 2 ], "overmap": "refctr_SW3b_z2_north" }, + { "point": [ 3, 11, 2 ], "overmap": "refctr_SW4b_z2_north" }, + { "point": [ 4, 11, 2 ], "overmap": "refctr_SW5b_z2_north" }, + { "point": [ 0, 12, 2 ], "overmap": "refctr_SW1c_z2_north" }, + { "point": [ 1, 12, 2 ], "overmap": "refctr_SW2c_z2_north" }, + { "point": [ 2, 12, 2 ], "overmap": "refctr_SW3c_z2_north" }, + { "point": [ 3, 12, 2 ], "overmap": "refctr_SW4c_z2_north" }, + { "point": [ 4, 12, 2 ], "overmap": "refctr_SW5c_z2_north" }, + { "point": [ 0, 13, 2 ], "overmap": "refctr_SW1d_z2_north" }, + { "point": [ 1, 13, 2 ], "overmap": "refctr_SW2d_z2_north" }, + { "point": [ 2, 13, 2 ], "overmap": "refctr_SW3d_z2_north" }, + { "point": [ 3, 13, 2 ], "overmap": "refctr_SW4d_z2_north" }, + { "point": [ 4, 13, 2 ], "overmap": "refctr_SW5d_z2_north" }, + { "point": [ 0, 14, 2 ], "overmap": "refctr_SW1e_z2_north" }, + { "point": [ 1, 14, 2 ], "overmap": "refctr_SW2e_z2_north" }, + { "point": [ 2, 14, 2 ], "overmap": "refctr_SW3e_z2_north" }, + { "point": [ 3, 14, 2 ], "overmap": "refctr_SW4e_z2_north" }, + { "point": [ 4, 14, 2 ], "overmap": "refctr_SW5e_z2_north" }, + { "point": [ 5, 10, 2 ], "overmap": "refctr_S1a_z2_north" }, + { "point": [ 6, 10, 2 ], "overmap": "refctr_S2a_z2_north" }, + { "point": [ 7, 10, 2 ], "overmap": "refctr_S3a_z2_north" }, + { "point": [ 8, 10, 2 ], "overmap": "refctr_S4a_z2_north" }, + { "point": [ 9, 10, 2 ], "overmap": "refctr_S5a_z2_north" }, + { "point": [ 5, 11, 2 ], "overmap": "refctr_S1b_z2_north" }, + { "point": [ 6, 11, 2 ], "overmap": "refctr_S2b_z2_north" }, + { "point": [ 7, 11, 2 ], "overmap": "refctr_S3b_z2_north" }, + { "point": [ 8, 11, 2 ], "overmap": "refctr_S4b_z2_north" }, + { "point": [ 9, 11, 2 ], "overmap": "refctr_S5b_z2_north" }, + { "point": [ 5, 12, 2 ], "overmap": "refctr_S1c_z2_north" }, + { "point": [ 6, 12, 2 ], "overmap": "refctr_S2c_z2_north" }, + { "point": [ 7, 12, 2 ], "overmap": "refctr_S3c_z2_north" }, + { "point": [ 8, 12, 2 ], "overmap": "refctr_S4c_z2_north" }, + { "point": [ 9, 12, 2 ], "overmap": "refctr_S5c_z2_north" }, + { "point": [ 5, 13, 2 ], "overmap": "refctr_S1d_z2_north" }, + { "point": [ 6, 13, 2 ], "overmap": "refctr_S2d_z2_north" }, + { "point": [ 7, 13, 2 ], "overmap": "refctr_S3d_z2_north" }, + { "point": [ 8, 13, 2 ], "overmap": "refctr_S4d_z2_north" }, + { "point": [ 9, 13, 2 ], "overmap": "refctr_S5d_z2_north" }, + { "point": [ 5, 14, 2 ], "overmap": "refctr_S1e_z2_north" }, + { "point": [ 6, 14, 2 ], "overmap": "refctr_S2e_z2_north" }, + { "point": [ 7, 14, 2 ], "overmap": "refctr_S3e_z2_north" }, + { "point": [ 8, 14, 2 ], "overmap": "refctr_S4e_z2_north" }, + { "point": [ 9, 14, 2 ], "overmap": "refctr_S5e_z2_north" }, + { "point": [ 10, 10, 2 ], "overmap": "refctr_SE1a_z2_north" }, + { "point": [ 11, 10, 2 ], "overmap": "refctr_SE2a_z2_north" }, + { "point": [ 12, 10, 2 ], "overmap": "refctr_SE3a_z2_north" }, + { "point": [ 13, 10, 2 ], "overmap": "refctr_SE4a_z2_north" }, + { "point": [ 14, 10, 2 ], "overmap": "refctr_SE5a_z2_north" }, + { "point": [ 10, 11, 2 ], "overmap": "refctr_SE1b_z2_north" }, + { "point": [ 11, 11, 2 ], "overmap": "refctr_SE2b_z2_north" }, + { "point": [ 12, 11, 2 ], "overmap": "refctr_SE3b_z2_north" }, + { "point": [ 13, 11, 2 ], "overmap": "refctr_SE4b_z2_north" }, + { "point": [ 14, 11, 2 ], "overmap": "refctr_SE5b_z2_north" }, + { "point": [ 10, 12, 2 ], "overmap": "refctr_SE1c_z2_north" }, + { "point": [ 11, 12, 2 ], "overmap": "refctr_SE2c_z2_north" }, + { "point": [ 12, 12, 2 ], "overmap": "refctr_SE3c_z2_north" }, + { "point": [ 13, 12, 2 ], "overmap": "refctr_SE4c_z2_north" }, + { "point": [ 14, 12, 2 ], "overmap": "refctr_SE5c_z2_north" }, + { "point": [ 10, 13, 2 ], "overmap": "refctr_SE1d_z2_north" }, + { "point": [ 11, 13, 2 ], "overmap": "refctr_SE2d_z2_north" }, + { "point": [ 12, 13, 2 ], "overmap": "refctr_SE3d_z2_north" }, + { "point": [ 13, 13, 2 ], "overmap": "refctr_SE4d_z2_north" }, + { "point": [ 14, 13, 2 ], "overmap": "refctr_SE5d_z2_north" }, + { "point": [ 10, 14, 2 ], "overmap": "refctr_SE1e_z2_north" }, + { "point": [ 11, 14, 2 ], "overmap": "refctr_SE2e_z2_north" }, + { "point": [ 12, 14, 2 ], "overmap": "refctr_SE3e_z2_north" }, + { "point": [ 13, 14, 2 ], "overmap": "refctr_SE4e_z2_north" }, + { "point": [ 14, 14, 2 ], "overmap": "refctr_SE5e_z2_north" }, + { "point": [ 0, 0, -1 ], "overmap": "refctr_NW1a_z-1_north" }, + { "point": [ 1, 0, -1 ], "overmap": "refctr_NW2a_z-1_north" }, + { "point": [ 2, 0, -1 ], "overmap": "refctr_NW3a_z-1_north" }, + { "point": [ 3, 0, -1 ], "overmap": "refctr_NW4a_z-1_north" }, + { "point": [ 4, 0, -1 ], "overmap": "refctr_NW5a_z-1_north" }, + { "point": [ 0, 1, -1 ], "overmap": "refctr_NW1b_z-1_north" }, + { "point": [ 1, 1, -1 ], "overmap": "refctr_NW2b_z-1_north" }, + { "point": [ 2, 1, -1 ], "overmap": "refctr_NW3b_z-1_north" }, + { "point": [ 3, 1, -1 ], "overmap": "refctr_NW4b_z-1_north" }, + { "point": [ 4, 1, -1 ], "overmap": "refctr_NW5b_z-1_north" }, + { "point": [ 0, 2, -1 ], "overmap": "refctr_NW1c_z-1_north" }, + { "point": [ 1, 2, -1 ], "overmap": "refctr_NW2c_z-1_north" }, + { "point": [ 2, 2, -1 ], "overmap": "refctr_NW3c_z-1_north" }, + { "point": [ 3, 2, -1 ], "overmap": "refctr_NW4c_z-1_north" }, + { "point": [ 4, 2, -1 ], "overmap": "refctr_NW5c_z-1_north" }, + { "point": [ 0, 3, -1 ], "overmap": "refctr_NW1d_z-1_north" }, + { "point": [ 1, 3, -1 ], "overmap": "refctr_NW2d_z-1_north" }, + { "point": [ 2, 3, -1 ], "overmap": "refctr_NW3d_z-1_north" }, + { "point": [ 3, 3, -1 ], "overmap": "refctr_NW4d_z-1_north" }, + { "point": [ 4, 3, -1 ], "overmap": "refctr_NW5d_z-1_north" }, + { "point": [ 0, 4, -1 ], "overmap": "refctr_NW1e_z-1_north" }, + { "point": [ 1, 4, -1 ], "overmap": "refctr_NW2e_z-1_north" }, + { "point": [ 2, 4, -1 ], "overmap": "refctr_NW3e_z-1_north" }, + { "point": [ 3, 4, -1 ], "overmap": "refctr_NW4e_z-1_north" }, + { "point": [ 4, 4, -1 ], "overmap": "refctr_NW5e_z-1_north" }, + { "point": [ 5, 0, -1 ], "overmap": "refctr_N1a_z-1_north" }, + { "point": [ 6, 0, -1 ], "overmap": "refctr_N2a_z-1_north" }, + { "point": [ 7, 0, -1 ], "overmap": "refctr_N3a_z-1_north" }, + { "point": [ 8, 0, -1 ], "overmap": "refctr_N4a_z-1_north" }, + { "point": [ 9, 0, -1 ], "overmap": "refctr_N5a_z-1_north" }, + { "point": [ 5, 1, -1 ], "overmap": "refctr_N1b_z-1_north" }, + { "point": [ 6, 1, -1 ], "overmap": "refctr_N2b_z-1_north" }, + { "point": [ 7, 1, -1 ], "overmap": "refctr_N3b_z-1_north" }, + { "point": [ 8, 1, -1 ], "overmap": "refctr_N4b_z-1_north" }, + { "point": [ 9, 1, -1 ], "overmap": "refctr_N5b_z-1_north" }, + { "point": [ 5, 2, -1 ], "overmap": "refctr_N1c_z-1_north" }, + { "point": [ 6, 2, -1 ], "overmap": "refctr_N2c_z-1_north" }, + { "point": [ 7, 2, -1 ], "overmap": "refctr_N3c_z-1_north" }, + { "point": [ 8, 2, -1 ], "overmap": "refctr_N4c_z-1_north" }, + { "point": [ 9, 2, -1 ], "overmap": "refctr_N5c_z-1_north" }, + { "point": [ 5, 3, -1 ], "overmap": "refctr_N1d_z-1_north" }, + { "point": [ 6, 3, -1 ], "overmap": "refctr_N2d_z-1_north" }, + { "point": [ 7, 3, -1 ], "overmap": "refctr_N3d_z-1_north" }, + { "point": [ 8, 3, -1 ], "overmap": "refctr_N4d_z-1_north" }, + { "point": [ 9, 3, -1 ], "overmap": "refctr_N5d_z-1_north" }, + { "point": [ 5, 4, -1 ], "overmap": "refctr_N1e_z-1_north" }, + { "point": [ 6, 4, -1 ], "overmap": "refctr_N2e_z-1_north" }, + { "point": [ 7, 4, -1 ], "overmap": "refctr_N3e_z-1_north" }, + { "point": [ 8, 4, -1 ], "overmap": "refctr_N4e_z-1_north" }, + { "point": [ 9, 4, -1 ], "overmap": "refctr_N5e_z-1_north" }, + { "point": [ 10, 0, -1 ], "overmap": "refctr_NE1a_z-1_north" }, + { "point": [ 11, 0, -1 ], "overmap": "refctr_NE2a_z-1_north" }, + { "point": [ 12, 0, -1 ], "overmap": "refctr_NE3a_z-1_north" }, + { "point": [ 13, 0, -1 ], "overmap": "refctr_NE4a_z-1_north" }, + { "point": [ 14, 0, -1 ], "overmap": "refctr_NE5a_z-1_north" }, + { "point": [ 10, 1, -1 ], "overmap": "refctr_NE1b_z-1_north" }, + { "point": [ 11, 1, -1 ], "overmap": "refctr_NE2b_z-1_north" }, + { "point": [ 12, 1, -1 ], "overmap": "refctr_NE3b_z-1_north" }, + { "point": [ 13, 1, -1 ], "overmap": "refctr_NE4b_z-1_north" }, + { "point": [ 14, 1, -1 ], "overmap": "refctr_NE5b_z-1_north" }, + { "point": [ 10, 2, -1 ], "overmap": "refctr_NE1c_z-1_north" }, + { "point": [ 11, 2, -1 ], "overmap": "refctr_NE2c_z-1_north" }, + { "point": [ 12, 2, -1 ], "overmap": "refctr_NE3c_z-1_north" }, + { "point": [ 13, 2, -1 ], "overmap": "refctr_NE4c_z-1_north" }, + { "point": [ 14, 2, -1 ], "overmap": "refctr_NE5c_z-1_north" }, + { "point": [ 10, 3, -1 ], "overmap": "refctr_NE1d_z-1_north" }, + { "point": [ 11, 3, -1 ], "overmap": "refctr_NE2d_z-1_north" }, + { "point": [ 12, 3, -1 ], "overmap": "refctr_NE3d_z-1_north" }, + { "point": [ 13, 3, -1 ], "overmap": "refctr_NE4d_z-1_north" }, + { "point": [ 14, 3, -1 ], "overmap": "refctr_NE5d_z-1_north" }, + { "point": [ 10, 4, -1 ], "overmap": "refctr_NE1e_z-1_north" }, + { "point": [ 11, 4, -1 ], "overmap": "refctr_NE2e_z-1_north" }, + { "point": [ 12, 4, -1 ], "overmap": "refctr_NE3e_z-1_north" }, + { "point": [ 13, 4, -1 ], "overmap": "refctr_NE4e_z-1_north" }, + { "point": [ 14, 4, -1 ], "overmap": "refctr_NE5e_z-1_north" }, + { "point": [ 0, 5, -1 ], "overmap": "refctr_W1a_z-1_north" }, + { "point": [ 1, 5, -1 ], "overmap": "refctr_W2a_z-1_north" }, + { "point": [ 2, 5, -1 ], "overmap": "refctr_W3a_z-1_north" }, + { "point": [ 3, 5, -1 ], "overmap": "refctr_W4a_z-1_north" }, + { "point": [ 4, 5, -1 ], "overmap": "refctr_W5a_z-1_north" }, + { "point": [ 0, 6, -1 ], "overmap": "refctr_W1b_z-1_north" }, + { "point": [ 1, 6, -1 ], "overmap": "refctr_W2b_z-1_north" }, + { "point": [ 2, 6, -1 ], "overmap": "refctr_W3b_z-1_north" }, + { "point": [ 3, 6, -1 ], "overmap": "refctr_W4b_z-1_north" }, + { "point": [ 4, 6, -1 ], "overmap": "refctr_W5b_z-1_north" }, + { "point": [ 0, 7, -1 ], "overmap": "refctr_W1c_z-1_north" }, + { "point": [ 1, 7, -1 ], "overmap": "refctr_W2c_z-1_north" }, + { "point": [ 2, 7, -1 ], "overmap": "refctr_W3c_z-1_north" }, + { "point": [ 3, 7, -1 ], "overmap": "refctr_W4c_z-1_north" }, + { "point": [ 4, 7, -1 ], "overmap": "refctr_W5c_z-1_north" }, + { "point": [ 0, 8, -1 ], "overmap": "refctr_W1d_z-1_north" }, + { "point": [ 1, 8, -1 ], "overmap": "refctr_W2d_z-1_north" }, + { "point": [ 2, 8, -1 ], "overmap": "refctr_W3d_z-1_north" }, + { "point": [ 3, 8, -1 ], "overmap": "refctr_W4d_z-1_north" }, + { "point": [ 4, 8, -1 ], "overmap": "refctr_W5d_z-1_north" }, + { "point": [ 0, 9, -1 ], "overmap": "refctr_W1e_z-1_north" }, + { "point": [ 1, 9, -1 ], "overmap": "refctr_W2e_z-1_north" }, + { "point": [ 2, 9, -1 ], "overmap": "refctr_W3e_z-1_north" }, + { "point": [ 3, 9, -1 ], "overmap": "refctr_W4e_z-1_north" }, + { "point": [ 4, 9, -1 ], "overmap": "refctr_W5e_z-1_north" }, + { "point": [ 5, 5, -1 ], "overmap": "evac_center_1_z-1_north" }, + { "point": [ 6, 5, -1 ], "overmap": "evac_center_2_z-1_north" }, + { "point": [ 7, 5, -1 ], "overmap": "evac_center_3_z-1_north" }, + { "point": [ 8, 5, -1 ], "overmap": "evac_center_4_z-1_north" }, + { "point": [ 9, 5, -1 ], "overmap": "evac_center_5_z-1_north" }, + { "point": [ 5, 6, -1 ], "overmap": "evac_center_6_z-1_north" }, + { "point": [ 6, 6, -1 ], "overmap": "evac_center_7_z-1_north" }, + { "point": [ 7, 6, -1 ], "overmap": "evac_center_8_z-1_north" }, + { "point": [ 8, 6, -1 ], "overmap": "evac_center_9_z-1_north" }, + { "point": [ 9, 6, -1 ], "overmap": "evac_center_10_z-1_north" }, + { "point": [ 5, 7, -1 ], "overmap": "evac_center_11_z-1_north" }, + { "point": [ 6, 7, -1 ], "overmap": "evac_center_12_z-1_north" }, + { "point": [ 7, 7, -1 ], "overmap": "evac_center_13_z-1_north" }, + { "point": [ 8, 7, -1 ], "overmap": "evac_center_14_z-1_north" }, + { "point": [ 9, 7, -1 ], "overmap": "evac_center_15_z-1_north" }, + { "point": [ 5, 8, -1 ], "overmap": "evac_center_16_z-1_north" }, + { "point": [ 6, 8, -1 ], "overmap": "evac_center_17_z-1_north" }, + { "point": [ 7, 8, -1 ], "overmap": "evac_center_18_z-1_north" }, + { "point": [ 8, 8, -1 ], "overmap": "evac_center_19_z-1_north" }, + { "point": [ 9, 8, -1 ], "overmap": "evac_center_20_z-1_north" }, + { "point": [ 5, 9, -1 ], "overmap": "evac_center_21_z-1_north" }, + { "point": [ 6, 9, -1 ], "overmap": "evac_center_22_z-1_north" }, + { "point": [ 7, 9, -1 ], "overmap": "evac_center_23_z-1_north" }, + { "point": [ 8, 9, -1 ], "overmap": "evac_center_24_z-1_north" }, + { "point": [ 9, 9, -1 ], "overmap": "evac_center_25_z-1_north" }, + { "point": [ 10, 5, -1 ], "overmap": "refctr_E1a_z-1_north" }, + { "point": [ 11, 5, -1 ], "overmap": "refctr_E2a_z-1_north" }, + { "point": [ 12, 5, -1 ], "overmap": "refctr_E3a_z-1_north" }, + { "point": [ 13, 5, -1 ], "overmap": "refctr_E4a_z-1_north" }, + { "point": [ 14, 5, -1 ], "overmap": "refctr_E5a_z-1_north" }, + { "point": [ 10, 6, -1 ], "overmap": "refctr_E1b_z-1_north" }, + { "point": [ 11, 6, -1 ], "overmap": "refctr_E2b_z-1_north" }, + { "point": [ 12, 6, -1 ], "overmap": "refctr_E3b_z-1_north" }, + { "point": [ 13, 6, -1 ], "overmap": "refctr_E4b_z-1_north" }, + { "point": [ 14, 6, -1 ], "overmap": "refctr_E5b_z-1_north" }, + { "point": [ 10, 7, -1 ], "overmap": "refctr_E1c_z-1_north" }, + { "point": [ 11, 7, -1 ], "overmap": "refctr_E2c_z-1_north" }, + { "point": [ 12, 7, -1 ], "overmap": "refctr_E3c_z-1_north" }, + { "point": [ 13, 7, -1 ], "overmap": "refctr_E4c_z-1_north" }, + { "point": [ 14, 7, -1 ], "overmap": "refctr_E5c_z-1_north" }, + { "point": [ 10, 8, -1 ], "overmap": "refctr_E1d_z-1_north" }, + { "point": [ 11, 8, -1 ], "overmap": "refctr_E2d_z-1_north" }, + { "point": [ 12, 8, -1 ], "overmap": "refctr_E3d_z-1_north" }, + { "point": [ 13, 8, -1 ], "overmap": "refctr_E4d_z-1_north" }, + { "point": [ 14, 8, -1 ], "overmap": "refctr_E5d_z-1_north" }, + { "point": [ 10, 9, -1 ], "overmap": "refctr_E1e_z-1_north" }, + { "point": [ 11, 9, -1 ], "overmap": "refctr_E2e_z-1_north" }, + { "point": [ 12, 9, -1 ], "overmap": "refctr_E3e_z-1_north" }, + { "point": [ 13, 9, -1 ], "overmap": "refctr_E4e_z-1_north" }, + { "point": [ 14, 9, -1 ], "overmap": "refctr_E5e_z-1_north" }, + { "point": [ 0, 10, -1 ], "overmap": "refctr_SW1a_z-1_north" }, + { "point": [ 1, 10, -1 ], "overmap": "refctr_SW2a_z-1_north" }, + { "point": [ 2, 10, -1 ], "overmap": "refctr_SW3a_z-1_north" }, + { "point": [ 3, 10, -1 ], "overmap": "refctr_SW4a_z-1_north" }, + { "point": [ 4, 10, -1 ], "overmap": "refctr_SW5a_z-1_north" }, + { "point": [ 0, 11, -1 ], "overmap": "refctr_SW1b_z-1_north" }, + { "point": [ 1, 11, -1 ], "overmap": "refctr_SW2b_z-1_north" }, + { "point": [ 2, 11, -1 ], "overmap": "refctr_SW3b_z-1_north" }, + { "point": [ 3, 11, -1 ], "overmap": "refctr_SW4b_z-1_north" }, + { "point": [ 4, 11, -1 ], "overmap": "refctr_SW5b_z-1_north" }, + { "point": [ 0, 12, -1 ], "overmap": "refctr_SW1c_z-1_north" }, + { "point": [ 1, 12, -1 ], "overmap": "refctr_SW2c_z-1_north" }, + { "point": [ 2, 12, -1 ], "overmap": "refctr_SW3c_z-1_north" }, + { "point": [ 3, 12, -1 ], "overmap": "refctr_SW4c_z-1_north" }, + { "point": [ 4, 12, -1 ], "overmap": "refctr_SW5c_z-1_north" }, + { "point": [ 0, 13, -1 ], "overmap": "refctr_SW1d_z-1_north" }, + { "point": [ 1, 13, -1 ], "overmap": "refctr_SW2d_z-1_north" }, + { "point": [ 2, 13, -1 ], "overmap": "refctr_SW3d_z-1_north" }, + { "point": [ 3, 13, -1 ], "overmap": "refctr_SW4d_z-1_north" }, + { "point": [ 4, 13, -1 ], "overmap": "refctr_SW5d_z-1_north" }, + { "point": [ 0, 14, -1 ], "overmap": "refctr_SW1e_z-1_north" }, + { "point": [ 1, 14, -1 ], "overmap": "refctr_SW2e_z-1_north" }, + { "point": [ 2, 14, -1 ], "overmap": "refctr_SW3e_z-1_north" }, + { "point": [ 3, 14, -1 ], "overmap": "refctr_SW4e_z-1_north" }, + { "point": [ 4, 14, -1 ], "overmap": "refctr_SW5e_z-1_north" }, + { "point": [ 5, 10, -1 ], "overmap": "refctr_S1a_z-1_north" }, + { "point": [ 6, 10, -1 ], "overmap": "refctr_S2a_z-1_north" }, + { "point": [ 7, 10, -1 ], "overmap": "refctr_S3a_z-1_north" }, + { "point": [ 8, 10, -1 ], "overmap": "refctr_S4a_z-1_north" }, + { "point": [ 9, 10, -1 ], "overmap": "refctr_S5a_z-1_north" }, + { "point": [ 5, 11, -1 ], "overmap": "refctr_S1b_z-1_north" }, + { "point": [ 6, 11, -1 ], "overmap": "refctr_S2b_z-1_north" }, + { "point": [ 7, 11, -1 ], "overmap": "refctr_S3b_z-1_north" }, + { "point": [ 8, 11, -1 ], "overmap": "refctr_S4b_z-1_north" }, + { "point": [ 9, 11, -1 ], "overmap": "refctr_S5b_z-1_north" }, + { "point": [ 5, 12, -1 ], "overmap": "refctr_S1c_z-1_north" }, + { "point": [ 6, 12, -1 ], "overmap": "refctr_S2c_z-1_north" }, + { "point": [ 7, 12, -1 ], "overmap": "refctr_S3c_z-1_north" }, + { "point": [ 8, 12, -1 ], "overmap": "refctr_S4c_z-1_north" }, + { "point": [ 9, 12, -1 ], "overmap": "refctr_S5c_z-1_north" }, + { "point": [ 5, 13, -1 ], "overmap": "refctr_S1d_z-1_north" }, + { "point": [ 6, 13, -1 ], "overmap": "refctr_S2d_z-1_north" }, + { "point": [ 7, 13, -1 ], "overmap": "refctr_S3d_z-1_north" }, + { "point": [ 8, 13, -1 ], "overmap": "refctr_S4d_z-1_north" }, + { "point": [ 9, 13, -1 ], "overmap": "refctr_S5d_z-1_north" }, + { "point": [ 5, 14, -1 ], "overmap": "refctr_S1e_z-1_north" }, + { "point": [ 6, 14, -1 ], "overmap": "refctr_S2e_z-1_north" }, + { "point": [ 7, 14, -1 ], "overmap": "refctr_S3e_z-1_north" }, + { "point": [ 8, 14, -1 ], "overmap": "refctr_S4e_z-1_north" }, + { "point": [ 9, 14, -1 ], "overmap": "refctr_S5e_z-1_north" }, + { "point": [ 10, 10, -1 ], "overmap": "refctr_SE1a_z-1_north" }, + { "point": [ 11, 10, -1 ], "overmap": "refctr_SE2a_z-1_north" }, + { "point": [ 12, 10, -1 ], "overmap": "refctr_SE3a_z-1_north" }, + { "point": [ 13, 10, -1 ], "overmap": "refctr_SE4a_z-1_north" }, + { "point": [ 14, 10, -1 ], "overmap": "refctr_SE5a_z-1_north" }, + { "point": [ 10, 11, -1 ], "overmap": "refctr_SE1b_z-1_north" }, + { "point": [ 11, 11, -1 ], "overmap": "refctr_SE2b_z-1_north" }, + { "point": [ 12, 11, -1 ], "overmap": "refctr_SE3b_z-1_north" }, + { "point": [ 13, 11, -1 ], "overmap": "refctr_SE4b_z-1_north" }, + { "point": [ 14, 11, -1 ], "overmap": "refctr_SE5b_z-1_north" }, + { "point": [ 10, 12, -1 ], "overmap": "refctr_SE1c_z-1_north" }, + { "point": [ 11, 12, -1 ], "overmap": "refctr_SE2c_z-1_north" }, + { "point": [ 12, 12, -1 ], "overmap": "refctr_SE3c_z-1_north" }, + { "point": [ 13, 12, -1 ], "overmap": "refctr_SE4c_z-1_north" }, + { "point": [ 14, 12, -1 ], "overmap": "refctr_SE5c_z-1_north" }, + { "point": [ 10, 13, -1 ], "overmap": "refctr_SE1d_z-1_north" }, + { "point": [ 11, 13, -1 ], "overmap": "refctr_SE2d_z-1_north" }, + { "point": [ 12, 13, -1 ], "overmap": "refctr_SE3d_z-1_north" }, + { "point": [ 13, 13, -1 ], "overmap": "refctr_SE4d_z-1_north" }, + { "point": [ 14, 13, -1 ], "overmap": "refctr_SE5d_z-1_north" }, + { "point": [ 10, 14, -1 ], "overmap": "refctr_SE1e_z-1_north" }, + { "point": [ 11, 14, -1 ], "overmap": "refctr_SE2e_z-1_north" }, + { "point": [ 12, 14, -1 ], "overmap": "refctr_SE3e_z-1_north" }, + { "point": [ 13, 14, -1 ], "overmap": "refctr_SE4e_z-1_north" }, + { "point": [ 14, 14, -1 ], "overmap": "refctr_SE5e_z-1_north" }, + { "point": [ 0, 0, -2 ], "overmap": "refctr_NW1a_z-2_north" }, + { "point": [ 1, 0, -2 ], "overmap": "refctr_NW2a_z-2_north" }, + { "point": [ 2, 0, -2 ], "overmap": "refctr_NW3a_z-2_north" }, + { "point": [ 3, 0, -2 ], "overmap": "refctr_NW4a_z-2_north" }, + { "point": [ 4, 0, -2 ], "overmap": "refctr_NW5a_z-2_north" }, + { "point": [ 0, 1, -2 ], "overmap": "refctr_NW1b_z-2_north" }, + { "point": [ 1, 1, -2 ], "overmap": "refctr_NW2b_z-2_north" }, + { "point": [ 2, 1, -2 ], "overmap": "refctr_NW3b_z-2_north" }, + { "point": [ 3, 1, -2 ], "overmap": "refctr_NW4b_z-2_north" }, + { "point": [ 4, 1, -2 ], "overmap": "refctr_NW5b_z-2_north" }, + { "point": [ 0, 2, -2 ], "overmap": "refctr_NW1c_z-2_north" }, + { "point": [ 1, 2, -2 ], "overmap": "refctr_NW2c_z-2_north" }, + { "point": [ 2, 2, -2 ], "overmap": "refctr_NW3c_z-2_north" }, + { "point": [ 3, 2, -2 ], "overmap": "refctr_NW4c_z-2_north" }, + { "point": [ 4, 2, -2 ], "overmap": "refctr_NW5c_z-2_north" }, + { "point": [ 0, 3, -2 ], "overmap": "refctr_NW1d_z-2_north" }, + { "point": [ 1, 3, -2 ], "overmap": "refctr_NW2d_z-2_north" }, + { "point": [ 2, 3, -2 ], "overmap": "refctr_NW3d_z-2_north" }, + { "point": [ 3, 3, -2 ], "overmap": "refctr_NW4d_z-2_north" }, + { "point": [ 4, 3, -2 ], "overmap": "refctr_NW5d_z-2_north" }, + { "point": [ 0, 4, -2 ], "overmap": "refctr_NW1e_z-2_north" }, + { "point": [ 1, 4, -2 ], "overmap": "refctr_NW2e_z-2_north" }, + { "point": [ 2, 4, -2 ], "overmap": "refctr_NW3e_z-2_north" }, + { "point": [ 3, 4, -2 ], "overmap": "refctr_NW4e_z-2_north" }, + { "point": [ 4, 4, -2 ], "overmap": "refctr_NW5e_z-2_north" }, + { "point": [ 5, 0, -2 ], "overmap": "refctr_N1a_z-2_north" }, + { "point": [ 6, 0, -2 ], "overmap": "refctr_N2a_z-2_north" }, + { "point": [ 7, 0, -2 ], "overmap": "refctr_N3a_z-2_north" }, + { "point": [ 8, 0, -2 ], "overmap": "refctr_N4a_z-2_north" }, + { "point": [ 9, 0, -2 ], "overmap": "refctr_N5a_z-2_north" }, + { "point": [ 5, 1, -2 ], "overmap": "refctr_N1b_z-2_north" }, + { "point": [ 6, 1, -2 ], "overmap": "refctr_N2b_z-2_north" }, + { "point": [ 7, 1, -2 ], "overmap": "refctr_N3b_z-2_north" }, + { "point": [ 8, 1, -2 ], "overmap": "refctr_N4b_z-2_north" }, + { "point": [ 9, 1, -2 ], "overmap": "refctr_N5b_z-2_north" }, + { "point": [ 5, 2, -2 ], "overmap": "refctr_N1c_z-2_north" }, + { "point": [ 6, 2, -2 ], "overmap": "refctr_N2c_z-2_north" }, + { "point": [ 7, 2, -2 ], "overmap": "refctr_N3c_z-2_north" }, + { "point": [ 8, 2, -2 ], "overmap": "refctr_N4c_z-2_north" }, + { "point": [ 9, 2, -2 ], "overmap": "refctr_N5c_z-2_north" }, + { "point": [ 5, 3, -2 ], "overmap": "refctr_N1d_z-2_north" }, + { "point": [ 6, 3, -2 ], "overmap": "refctr_N2d_z-2_north" }, + { "point": [ 7, 3, -2 ], "overmap": "refctr_N3d_z-2_north" }, + { "point": [ 8, 3, -2 ], "overmap": "refctr_N4d_z-2_north" }, + { "point": [ 9, 3, -2 ], "overmap": "refctr_N5d_z-2_north" }, + { "point": [ 5, 4, -2 ], "overmap": "refctr_N1e_z-2_north" }, + { "point": [ 6, 4, -2 ], "overmap": "refctr_N2e_z-2_north" }, + { "point": [ 7, 4, -2 ], "overmap": "refctr_N3e_z-2_north" }, + { "point": [ 8, 4, -2 ], "overmap": "refctr_N4e_z-2_north" }, + { "point": [ 9, 4, -2 ], "overmap": "refctr_N5e_z-2_north" }, + { "point": [ 10, 0, -2 ], "overmap": "refctr_NE1a_z-2_north" }, + { "point": [ 11, 0, -2 ], "overmap": "refctr_NE2a_z-2_north" }, + { "point": [ 12, 0, -2 ], "overmap": "refctr_NE3a_z-2_north" }, + { "point": [ 13, 0, -2 ], "overmap": "refctr_NE4a_z-2_north" }, + { "point": [ 14, 0, -2 ], "overmap": "refctr_NE5a_z-2_north" }, + { "point": [ 10, 1, -2 ], "overmap": "refctr_NE1b_z-2_north" }, + { "point": [ 11, 1, -2 ], "overmap": "refctr_NE2b_z-2_north" }, + { "point": [ 12, 1, -2 ], "overmap": "refctr_NE3b_z-2_north" }, + { "point": [ 13, 1, -2 ], "overmap": "refctr_NE4b_z-2_north" }, + { "point": [ 14, 1, -2 ], "overmap": "refctr_NE5b_z-2_north" }, + { "point": [ 10, 2, -2 ], "overmap": "refctr_NE1c_z-2_north" }, + { "point": [ 11, 2, -2 ], "overmap": "refctr_NE2c_z-2_north" }, + { "point": [ 12, 2, -2 ], "overmap": "refctr_NE3c_z-2_north" }, + { "point": [ 13, 2, -2 ], "overmap": "refctr_NE4c_z-2_north" }, + { "point": [ 14, 2, -2 ], "overmap": "refctr_NE5c_z-2_north" }, + { "point": [ 10, 3, -2 ], "overmap": "refctr_NE1d_z-2_north" }, + { "point": [ 11, 3, -2 ], "overmap": "refctr_NE2d_z-2_north" }, + { "point": [ 12, 3, -2 ], "overmap": "refctr_NE3d_z-2_north" }, + { "point": [ 13, 3, -2 ], "overmap": "refctr_NE4d_z-2_north" }, + { "point": [ 14, 3, -2 ], "overmap": "refctr_NE5d_z-2_north" }, + { "point": [ 10, 4, -2 ], "overmap": "refctr_NE1e_z-2_north" }, + { "point": [ 11, 4, -2 ], "overmap": "refctr_NE2e_z-2_north" }, + { "point": [ 12, 4, -2 ], "overmap": "refctr_NE3e_z-2_north" }, + { "point": [ 13, 4, -2 ], "overmap": "refctr_NE4e_z-2_north" }, + { "point": [ 14, 4, -2 ], "overmap": "refctr_NE5e_z-2_north" }, + { "point": [ 0, 5, -2 ], "overmap": "refctr_W1a_z-2_north" }, + { "point": [ 1, 5, -2 ], "overmap": "refctr_W2a_z-2_north" }, + { "point": [ 2, 5, -2 ], "overmap": "refctr_W3a_z-2_north" }, + { "point": [ 3, 5, -2 ], "overmap": "refctr_W4a_z-2_north" }, + { "point": [ 4, 5, -2 ], "overmap": "refctr_W5a_z-2_north" }, + { "point": [ 0, 6, -2 ], "overmap": "refctr_W1b_z-2_north" }, + { "point": [ 1, 6, -2 ], "overmap": "refctr_W2b_z-2_north" }, + { "point": [ 2, 6, -2 ], "overmap": "refctr_W3b_z-2_north" }, + { "point": [ 3, 6, -2 ], "overmap": "refctr_W4b_z-2_north" }, + { "point": [ 4, 6, -2 ], "overmap": "refctr_W5b_z-2_north" }, + { "point": [ 0, 7, -2 ], "overmap": "refctr_W1c_z-2_north" }, + { "point": [ 1, 7, -2 ], "overmap": "refctr_W2c_z-2_north" }, + { "point": [ 2, 7, -2 ], "overmap": "refctr_W3c_z-2_north" }, + { "point": [ 3, 7, -2 ], "overmap": "refctr_W4c_z-2_north" }, + { "point": [ 4, 7, -2 ], "overmap": "refctr_W5c_z-2_north" }, + { "point": [ 0, 8, -2 ], "overmap": "refctr_W1d_z-2_north" }, + { "point": [ 1, 8, -2 ], "overmap": "refctr_W2d_z-2_north" }, + { "point": [ 2, 8, -2 ], "overmap": "refctr_W3d_z-2_north" }, + { "point": [ 3, 8, -2 ], "overmap": "refctr_W4d_z-2_north" }, + { "point": [ 4, 8, -2 ], "overmap": "refctr_W5d_z-2_north" }, + { "point": [ 0, 9, -2 ], "overmap": "refctr_W1e_z-2_north" }, + { "point": [ 1, 9, -2 ], "overmap": "refctr_W2e_z-2_north" }, + { "point": [ 2, 9, -2 ], "overmap": "refctr_W3e_z-2_north" }, + { "point": [ 3, 9, -2 ], "overmap": "refctr_W4e_z-2_north" }, + { "point": [ 4, 9, -2 ], "overmap": "refctr_W5e_z-2_north" }, + { "point": [ 5, 5, -2 ], "overmap": "evac_center_1_z-2_north" }, + { "point": [ 6, 5, -2 ], "overmap": "evac_center_2_z-2_north" }, + { "point": [ 7, 5, -2 ], "overmap": "evac_center_3_z-2_north" }, + { "point": [ 8, 5, -2 ], "overmap": "evac_center_4_z-2_north" }, + { "point": [ 9, 5, -2 ], "overmap": "evac_center_5_z-2_north" }, + { "point": [ 5, 6, -2 ], "overmap": "evac_center_6_z-2_north" }, + { "point": [ 6, 6, -2 ], "overmap": "evac_center_7_z-2_north" }, + { "point": [ 7, 6, -2 ], "overmap": "evac_center_8_z-2_north" }, + { "point": [ 8, 6, -2 ], "overmap": "evac_center_9_z-2_north" }, + { "point": [ 9, 6, -2 ], "overmap": "evac_center_10_z-2_north" }, + { "point": [ 5, 7, -2 ], "overmap": "evac_center_11_z-2_north" }, + { "point": [ 6, 7, -2 ], "overmap": "evac_center_12_z-2_north" }, + { "point": [ 7, 7, -2 ], "overmap": "evac_center_13_z-2_north" }, + { "point": [ 8, 7, -2 ], "overmap": "evac_center_14_z-2_north" }, + { "point": [ 9, 7, -2 ], "overmap": "evac_center_15_z-2_north" }, + { "point": [ 5, 8, -2 ], "overmap": "evac_center_16_z-2_north" }, + { "point": [ 6, 8, -2 ], "overmap": "evac_center_17_z-2_north" }, + { "point": [ 7, 8, -2 ], "overmap": "evac_center_18_z-2_north" }, + { "point": [ 8, 8, -2 ], "overmap": "evac_center_19_z-2_north" }, + { "point": [ 9, 8, -2 ], "overmap": "evac_center_20_z-2_north" }, + { "point": [ 5, 9, -2 ], "overmap": "evac_center_21_z-2_north" }, + { "point": [ 6, 9, -2 ], "overmap": "evac_center_22_z-2_north" }, + { "point": [ 7, 9, -2 ], "overmap": "evac_center_23_z-2_north" }, + { "point": [ 8, 9, -2 ], "overmap": "evac_center_24_z-2_north" }, + { "point": [ 9, 9, -2 ], "overmap": "evac_center_25_z-2_north" }, + { "point": [ 10, 5, -2 ], "overmap": "refctr_E1a_z-2_north" }, + { "point": [ 11, 5, -2 ], "overmap": "refctr_E2a_z-2_north" }, + { "point": [ 12, 5, -2 ], "overmap": "refctr_E3a_z-2_north" }, + { "point": [ 13, 5, -2 ], "overmap": "refctr_E4a_z-2_north" }, + { "point": [ 14, 5, -2 ], "overmap": "refctr_E5a_z-2_north" }, + { "point": [ 10, 6, -2 ], "overmap": "refctr_E1b_z-2_north" }, + { "point": [ 11, 6, -2 ], "overmap": "refctr_E2b_z-2_north" }, + { "point": [ 12, 6, -2 ], "overmap": "refctr_E3b_z-2_north" }, + { "point": [ 13, 6, -2 ], "overmap": "refctr_E4b_z-2_north" }, + { "point": [ 14, 6, -2 ], "overmap": "refctr_E5b_z-2_north" }, + { "point": [ 10, 7, -2 ], "overmap": "refctr_E1c_z-2_north" }, + { "point": [ 11, 7, -2 ], "overmap": "refctr_E2c_z-2_north" }, + { "point": [ 12, 7, -2 ], "overmap": "refctr_E3c_z-2_north" }, + { "point": [ 13, 7, -2 ], "overmap": "refctr_E4c_z-2_north" }, + { "point": [ 14, 7, -2 ], "overmap": "refctr_E5c_z-2_north" }, + { "point": [ 10, 8, -2 ], "overmap": "refctr_E1d_z-2_north" }, + { "point": [ 11, 8, -2 ], "overmap": "refctr_E2d_z-2_north" }, + { "point": [ 12, 8, -2 ], "overmap": "refctr_E3d_z-2_north" }, + { "point": [ 13, 8, -2 ], "overmap": "refctr_E4d_z-2_north" }, + { "point": [ 14, 8, -2 ], "overmap": "refctr_E5d_z-2_north" }, + { "point": [ 10, 9, -2 ], "overmap": "refctr_E1e_z-2_north" }, + { "point": [ 11, 9, -2 ], "overmap": "refctr_E2e_z-2_north" }, + { "point": [ 12, 9, -2 ], "overmap": "refctr_E3e_z-2_north" }, + { "point": [ 13, 9, -2 ], "overmap": "refctr_E4e_z-2_north" }, + { "point": [ 14, 9, -2 ], "overmap": "refctr_E5e_z-2_north" }, + { "point": [ 0, 10, -2 ], "overmap": "refctr_SW1a_z-2_north" }, + { "point": [ 1, 10, -2 ], "overmap": "refctr_SW2a_z-2_north" }, + { "point": [ 2, 10, -2 ], "overmap": "refctr_SW3a_z-2_north" }, + { "point": [ 3, 10, -2 ], "overmap": "refctr_SW4a_z-2_north" }, + { "point": [ 4, 10, -2 ], "overmap": "refctr_SW5a_z-2_north" }, + { "point": [ 0, 11, -2 ], "overmap": "refctr_SW1b_z-2_north" }, + { "point": [ 1, 11, -2 ], "overmap": "refctr_SW2b_z-2_north" }, + { "point": [ 2, 11, -2 ], "overmap": "refctr_SW3b_z-2_north" }, + { "point": [ 3, 11, -2 ], "overmap": "refctr_SW4b_z-2_north" }, + { "point": [ 4, 11, -2 ], "overmap": "refctr_SW5b_z-2_north" }, + { "point": [ 0, 12, -2 ], "overmap": "refctr_SW1c_z-2_north" }, + { "point": [ 1, 12, -2 ], "overmap": "refctr_SW2c_z-2_north" }, + { "point": [ 2, 12, -2 ], "overmap": "refctr_SW3c_z-2_north" }, + { "point": [ 3, 12, -2 ], "overmap": "refctr_SW4c_z-2_north" }, + { "point": [ 4, 12, -2 ], "overmap": "refctr_SW5c_z-2_north" }, + { "point": [ 0, 13, -2 ], "overmap": "refctr_SW1d_z-2_north" }, + { "point": [ 1, 13, -2 ], "overmap": "refctr_SW2d_z-2_north" }, + { "point": [ 2, 13, -2 ], "overmap": "refctr_SW3d_z-2_north" }, + { "point": [ 3, 13, -2 ], "overmap": "refctr_SW4d_z-2_north" }, + { "point": [ 4, 13, -2 ], "overmap": "refctr_SW5d_z-2_north" }, + { "point": [ 0, 14, -2 ], "overmap": "refctr_SW1e_z-2_north" }, + { "point": [ 1, 14, -2 ], "overmap": "refctr_SW2e_z-2_north" }, + { "point": [ 2, 14, -2 ], "overmap": "refctr_SW3e_z-2_north" }, + { "point": [ 3, 14, -2 ], "overmap": "refctr_SW4e_z-2_north" }, + { "point": [ 4, 14, -2 ], "overmap": "refctr_SW5e_z-2_north" }, + { "point": [ 5, 10, -2 ], "overmap": "refctr_S1a_z-2_north" }, + { "point": [ 6, 10, -2 ], "overmap": "refctr_S2a_z-2_north" }, + { "point": [ 7, 10, -2 ], "overmap": "refctr_S3a_z-2_north" }, + { "point": [ 8, 10, -2 ], "overmap": "refctr_S4a_z-2_north" }, + { "point": [ 9, 10, -2 ], "overmap": "refctr_S5a_z-2_north" }, + { "point": [ 5, 11, -2 ], "overmap": "refctr_S1b_z-2_north" }, + { "point": [ 6, 11, -2 ], "overmap": "refctr_S2b_z-2_north" }, + { "point": [ 7, 11, -2 ], "overmap": "refctr_S3b_z-2_north" }, + { "point": [ 8, 11, -2 ], "overmap": "refctr_S4b_z-2_north" }, + { "point": [ 9, 11, -2 ], "overmap": "refctr_S5b_z-2_north" }, + { "point": [ 5, 12, -2 ], "overmap": "refctr_S1c_z-2_north" }, + { "point": [ 6, 12, -2 ], "overmap": "refctr_S2c_z-2_north" }, + { "point": [ 7, 12, -2 ], "overmap": "refctr_S3c_z-2_north" }, + { "point": [ 8, 12, -2 ], "overmap": "refctr_S4c_z-2_north" }, + { "point": [ 9, 12, -2 ], "overmap": "refctr_S5c_z-2_north" }, + { "point": [ 5, 13, -2 ], "overmap": "refctr_S1d_z-2_north" }, + { "point": [ 6, 13, -2 ], "overmap": "refctr_S2d_z-2_north" }, + { "point": [ 7, 13, -2 ], "overmap": "refctr_S3d_z-2_north" }, + { "point": [ 8, 13, -2 ], "overmap": "refctr_S4d_z-2_north" }, + { "point": [ 9, 13, -2 ], "overmap": "refctr_S5d_z-2_north" }, + { "point": [ 5, 14, -2 ], "overmap": "refctr_S1e_z-2_north" }, + { "point": [ 6, 14, -2 ], "overmap": "refctr_S2e_z-2_north" }, + { "point": [ 7, 14, -2 ], "overmap": "refctr_S3e_z-2_north" }, + { "point": [ 8, 14, -2 ], "overmap": "refctr_S4e_z-2_north" }, + { "point": [ 9, 14, -2 ], "overmap": "refctr_S5e_z-2_north" }, + { "point": [ 10, 10, -2 ], "overmap": "refctr_SE1a_z-2_north" }, + { "point": [ 11, 10, -2 ], "overmap": "refctr_SE2a_z-2_north" }, + { "point": [ 12, 10, -2 ], "overmap": "refctr_SE3a_z-2_north" }, + { "point": [ 13, 10, -2 ], "overmap": "refctr_SE4a_z-2_north" }, + { "point": [ 14, 10, -2 ], "overmap": "refctr_SE5a_z-2_north" }, + { "point": [ 10, 11, -2 ], "overmap": "refctr_SE1b_z-2_north" }, + { "point": [ 11, 11, -2 ], "overmap": "refctr_SE2b_z-2_north" }, + { "point": [ 12, 11, -2 ], "overmap": "refctr_SE3b_z-2_north" }, + { "point": [ 13, 11, -2 ], "overmap": "refctr_SE4b_z-2_north" }, + { "point": [ 14, 11, -2 ], "overmap": "refctr_SE5b_z-2_north" }, + { "point": [ 10, 12, -2 ], "overmap": "refctr_SE1c_z-2_north" }, + { "point": [ 11, 12, -2 ], "overmap": "refctr_SE2c_z-2_north" }, + { "point": [ 12, 12, -2 ], "overmap": "refctr_SE3c_z-2_north" }, + { "point": [ 13, 12, -2 ], "overmap": "refctr_SE4c_z-2_north" }, + { "point": [ 14, 12, -2 ], "overmap": "refctr_SE5c_z-2_north" }, + { "point": [ 10, 13, -2 ], "overmap": "refctr_SE1d_z-2_north" }, + { "point": [ 11, 13, -2 ], "overmap": "refctr_SE2d_z-2_north" }, + { "point": [ 12, 13, -2 ], "overmap": "refctr_SE3d_z-2_north" }, + { "point": [ 13, 13, -2 ], "overmap": "refctr_SE4d_z-2_north" }, + { "point": [ 14, 13, -2 ], "overmap": "refctr_SE5d_z-2_north" }, + { "point": [ 10, 14, -2 ], "overmap": "refctr_SE1e_z-2_north" }, + { "point": [ 11, 14, -2 ], "overmap": "refctr_SE2e_z-2_north" }, + { "point": [ 12, 14, -2 ], "overmap": "refctr_SE3e_z-2_north" }, + { "point": [ 13, 14, -2 ], "overmap": "refctr_SE4e_z-2_north" }, + { "point": [ 14, 14, -2 ], "overmap": "refctr_SE5e_z-2_north" }, + { "point": [ 0, 0, -3 ], "overmap": "refctr_NW1a_z-3_north" }, + { "point": [ 1, 0, -3 ], "overmap": "refctr_NW2a_z-3_north" }, + { "point": [ 2, 0, -3 ], "overmap": "refctr_NW3a_z-3_north" }, + { "point": [ 3, 0, -3 ], "overmap": "refctr_NW4a_z-3_north" }, + { "point": [ 4, 0, -3 ], "overmap": "refctr_NW5a_z-3_north" }, + { "point": [ 0, 1, -3 ], "overmap": "refctr_NW1b_z-3_north" }, + { "point": [ 1, 1, -3 ], "overmap": "refctr_NW2b_z-3_north" }, + { "point": [ 2, 1, -3 ], "overmap": "refctr_NW3b_z-3_north" }, + { "point": [ 3, 1, -3 ], "overmap": "refctr_NW4b_z-3_north" }, + { "point": [ 4, 1, -3 ], "overmap": "refctr_NW5b_z-3_north" }, + { "point": [ 0, 2, -3 ], "overmap": "refctr_NW1c_z-3_north" }, + { "point": [ 1, 2, -3 ], "overmap": "refctr_NW2c_z-3_north" }, + { "point": [ 2, 2, -3 ], "overmap": "refctr_NW3c_z-3_north" }, + { "point": [ 3, 2, -3 ], "overmap": "refctr_NW4c_z-3_north" }, + { "point": [ 4, 2, -3 ], "overmap": "refctr_NW5c_z-3_north" }, + { "point": [ 0, 3, -3 ], "overmap": "refctr_NW1d_z-3_north" }, + { "point": [ 1, 3, -3 ], "overmap": "refctr_NW2d_z-3_north" }, + { "point": [ 2, 3, -3 ], "overmap": "refctr_NW3d_z-3_north" }, + { "point": [ 3, 3, -3 ], "overmap": "refctr_NW4d_z-3_north" }, + { "point": [ 4, 3, -3 ], "overmap": "refctr_NW5d_z-3_north" }, + { "point": [ 0, 4, -3 ], "overmap": "refctr_NW1e_z-3_north" }, + { "point": [ 1, 4, -3 ], "overmap": "refctr_NW2e_z-3_north" }, + { "point": [ 2, 4, -3 ], "overmap": "refctr_NW3e_z-3_north" }, + { "point": [ 3, 4, -3 ], "overmap": "refctr_NW4e_z-3_north" }, + { "point": [ 4, 4, -3 ], "overmap": "refctr_NW5e_z-3_north" }, + { "point": [ 5, 0, -3 ], "overmap": "refctr_N1a_z-3_north" }, + { "point": [ 6, 0, -3 ], "overmap": "refctr_N2a_z-3_north" }, + { "point": [ 7, 0, -3 ], "overmap": "refctr_N3a_z-3_north" }, + { "point": [ 8, 0, -3 ], "overmap": "refctr_N4a_z-3_north" }, + { "point": [ 9, 0, -3 ], "overmap": "refctr_N5a_z-3_north" }, + { "point": [ 5, 1, -3 ], "overmap": "refctr_N1b_z-3_north" }, + { "point": [ 6, 1, -3 ], "overmap": "refctr_N2b_z-3_north" }, + { "point": [ 7, 1, -3 ], "overmap": "refctr_N3b_z-3_north" }, + { "point": [ 8, 1, -3 ], "overmap": "refctr_N4b_z-3_north" }, + { "point": [ 9, 1, -3 ], "overmap": "refctr_N5b_z-3_north" }, + { "point": [ 5, 2, -3 ], "overmap": "refctr_N1c_z-3_north" }, + { "point": [ 6, 2, -3 ], "overmap": "refctr_N2c_z-3_north" }, + { "point": [ 7, 2, -3 ], "overmap": "refctr_N3c_z-3_north" }, + { "point": [ 8, 2, -3 ], "overmap": "refctr_N4c_z-3_north" }, + { "point": [ 9, 2, -3 ], "overmap": "refctr_N5c_z-3_north" }, + { "point": [ 5, 3, -3 ], "overmap": "refctr_N1d_z-3_north" }, + { "point": [ 6, 3, -3 ], "overmap": "refctr_N2d_z-3_north" }, + { "point": [ 7, 3, -3 ], "overmap": "refctr_N3d_z-3_north" }, + { "point": [ 8, 3, -3 ], "overmap": "refctr_N4d_z-3_north" }, + { "point": [ 9, 3, -3 ], "overmap": "refctr_N5d_z-3_north" }, + { "point": [ 5, 4, -3 ], "overmap": "refctr_N1e_z-3_north" }, + { "point": [ 6, 4, -3 ], "overmap": "refctr_N2e_z-3_north" }, + { "point": [ 7, 4, -3 ], "overmap": "refctr_N3e_z-3_north" }, + { "point": [ 8, 4, -3 ], "overmap": "refctr_N4e_z-3_north" }, + { "point": [ 9, 4, -3 ], "overmap": "refctr_N5e_z-3_north" }, + { "point": [ 10, 0, -3 ], "overmap": "refctr_NE1a_z-3_north" }, + { "point": [ 11, 0, -3 ], "overmap": "refctr_NE2a_z-3_north" }, + { "point": [ 12, 0, -3 ], "overmap": "refctr_NE3a_z-3_north" }, + { "point": [ 13, 0, -3 ], "overmap": "refctr_NE4a_z-3_north" }, + { "point": [ 14, 0, -3 ], "overmap": "refctr_NE5a_z-3_north" }, + { "point": [ 10, 1, -3 ], "overmap": "refctr_NE1b_z-3_north" }, + { "point": [ 11, 1, -3 ], "overmap": "refctr_NE2b_z-3_north" }, + { "point": [ 12, 1, -3 ], "overmap": "refctr_NE3b_z-3_north" }, + { "point": [ 13, 1, -3 ], "overmap": "refctr_NE4b_z-3_north" }, + { "point": [ 14, 1, -3 ], "overmap": "refctr_NE5b_z-3_north" }, + { "point": [ 10, 2, -3 ], "overmap": "refctr_NE1c_z-3_north" }, + { "point": [ 11, 2, -3 ], "overmap": "refctr_NE2c_z-3_north" }, + { "point": [ 12, 2, -3 ], "overmap": "refctr_NE3c_z-3_north" }, + { "point": [ 13, 2, -3 ], "overmap": "refctr_NE4c_z-3_north" }, + { "point": [ 14, 2, -3 ], "overmap": "refctr_NE5c_z-3_north" }, + { "point": [ 10, 3, -3 ], "overmap": "refctr_NE1d_z-3_north" }, + { "point": [ 11, 3, -3 ], "overmap": "refctr_NE2d_z-3_north" }, + { "point": [ 12, 3, -3 ], "overmap": "refctr_NE3d_z-3_north" }, + { "point": [ 13, 3, -3 ], "overmap": "refctr_NE4d_z-3_north" }, + { "point": [ 14, 3, -3 ], "overmap": "refctr_NE5d_z-3_north" }, + { "point": [ 10, 4, -3 ], "overmap": "refctr_NE1e_z-3_north" }, + { "point": [ 11, 4, -3 ], "overmap": "refctr_NE2e_z-3_north" }, + { "point": [ 12, 4, -3 ], "overmap": "refctr_NE3e_z-3_north" }, + { "point": [ 13, 4, -3 ], "overmap": "refctr_NE4e_z-3_north" }, + { "point": [ 14, 4, -3 ], "overmap": "refctr_NE5e_z-3_north" }, + { "point": [ 0, 5, -3 ], "overmap": "refctr_W1a_z-3_north" }, + { "point": [ 1, 5, -3 ], "overmap": "refctr_W2a_z-3_north" }, + { "point": [ 2, 5, -3 ], "overmap": "refctr_W3a_z-3_north" }, + { "point": [ 3, 5, -3 ], "overmap": "refctr_W4a_z-3_north" }, + { "point": [ 4, 5, -3 ], "overmap": "refctr_W5a_z-3_north" }, + { "point": [ 0, 6, -3 ], "overmap": "refctr_W1b_z-3_north" }, + { "point": [ 1, 6, -3 ], "overmap": "refctr_W2b_z-3_north" }, + { "point": [ 2, 6, -3 ], "overmap": "refctr_W3b_z-3_north" }, + { "point": [ 3, 6, -3 ], "overmap": "refctr_W4b_z-3_north" }, + { "point": [ 4, 6, -3 ], "overmap": "refctr_W5b_z-3_north" }, + { "point": [ 0, 7, -3 ], "overmap": "refctr_W1c_z-3_north" }, + { "point": [ 1, 7, -3 ], "overmap": "refctr_W2c_z-3_north" }, + { "point": [ 2, 7, -3 ], "overmap": "refctr_W3c_z-3_north" }, + { "point": [ 3, 7, -3 ], "overmap": "refctr_W4c_z-3_north" }, + { "point": [ 4, 7, -3 ], "overmap": "refctr_W5c_z-3_north" }, + { "point": [ 0, 8, -3 ], "overmap": "refctr_W1d_z-3_north" }, + { "point": [ 1, 8, -3 ], "overmap": "refctr_W2d_z-3_north" }, + { "point": [ 2, 8, -3 ], "overmap": "refctr_W3d_z-3_north" }, + { "point": [ 3, 8, -3 ], "overmap": "refctr_W4d_z-3_north" }, + { "point": [ 4, 8, -3 ], "overmap": "refctr_W5d_z-3_north" }, + { "point": [ 0, 9, -3 ], "overmap": "refctr_W1e_z-3_north" }, + { "point": [ 1, 9, -3 ], "overmap": "refctr_W2e_z-3_north" }, + { "point": [ 2, 9, -3 ], "overmap": "refctr_W3e_z-3_north" }, + { "point": [ 3, 9, -3 ], "overmap": "refctr_W4e_z-3_north" }, + { "point": [ 4, 9, -3 ], "overmap": "refctr_W5e_z-3_north" }, + { "point": [ 5, 5, -3 ], "overmap": "evac_center_1_z-3_north" }, + { "point": [ 6, 5, -3 ], "overmap": "evac_center_2_z-3_north" }, + { "point": [ 7, 5, -3 ], "overmap": "evac_center_3_z-3_north" }, + { "point": [ 8, 5, -3 ], "overmap": "evac_center_4_z-3_north" }, + { "point": [ 9, 5, -3 ], "overmap": "evac_center_5_z-3_north" }, + { "point": [ 5, 6, -3 ], "overmap": "evac_center_6_z-3_north" }, + { "point": [ 6, 6, -3 ], "overmap": "evac_center_7_z-3_north" }, + { "point": [ 7, 6, -3 ], "overmap": "evac_center_8_z-3_north" }, + { "point": [ 8, 6, -3 ], "overmap": "evac_center_9_z-3_north" }, + { "point": [ 9, 6, -3 ], "overmap": "evac_center_10_z-3_north" }, + { "point": [ 5, 7, -3 ], "overmap": "evac_center_11_z-3_north" }, + { "point": [ 6, 7, -3 ], "overmap": "evac_center_12_z-3_north" }, + { "point": [ 7, 7, -3 ], "overmap": "evac_center_13_z-3_north" }, + { "point": [ 8, 7, -3 ], "overmap": "evac_center_14_z-3_north" }, + { "point": [ 9, 7, -3 ], "overmap": "evac_center_15_z-3_north" }, + { "point": [ 5, 8, -3 ], "overmap": "evac_center_16_z-3_north" }, + { "point": [ 6, 8, -3 ], "overmap": "evac_center_17_z-3_north" }, + { "point": [ 7, 8, -3 ], "overmap": "evac_center_18_z-3_north" }, + { "point": [ 8, 8, -3 ], "overmap": "evac_center_19_z-3_north" }, + { "point": [ 9, 8, -3 ], "overmap": "evac_center_20_z-3_north" }, + { "point": [ 5, 9, -3 ], "overmap": "evac_center_21_z-3_north" }, + { "point": [ 6, 9, -3 ], "overmap": "evac_center_22_z-3_north" }, + { "point": [ 7, 9, -3 ], "overmap": "evac_center_23_z-3_north" }, + { "point": [ 8, 9, -3 ], "overmap": "evac_center_24_z-3_north" }, + { "point": [ 9, 9, -3 ], "overmap": "evac_center_25_z-3_north" }, + { "point": [ 10, 5, -3 ], "overmap": "refctr_E1a_z-3_north" }, + { "point": [ 11, 5, -3 ], "overmap": "refctr_E2a_z-3_north" }, + { "point": [ 12, 5, -3 ], "overmap": "refctr_E3a_z-3_north" }, + { "point": [ 13, 5, -3 ], "overmap": "refctr_E4a_z-3_north" }, + { "point": [ 14, 5, -3 ], "overmap": "refctr_E5a_z-3_north" }, + { "point": [ 10, 6, -3 ], "overmap": "refctr_E1b_z-3_north" }, + { "point": [ 11, 6, -3 ], "overmap": "refctr_E2b_z-3_north" }, + { "point": [ 12, 6, -3 ], "overmap": "refctr_E3b_z-3_north" }, + { "point": [ 13, 6, -3 ], "overmap": "refctr_E4b_z-3_north" }, + { "point": [ 14, 6, -3 ], "overmap": "refctr_E5b_z-3_north" }, + { "point": [ 10, 7, -3 ], "overmap": "refctr_E1c_z-3_north" }, + { "point": [ 11, 7, -3 ], "overmap": "refctr_E2c_z-3_north" }, + { "point": [ 12, 7, -3 ], "overmap": "refctr_E3c_z-3_north" }, + { "point": [ 13, 7, -3 ], "overmap": "refctr_E4c_z-3_north" }, + { "point": [ 14, 7, -3 ], "overmap": "refctr_E5c_z-3_north" }, + { "point": [ 10, 8, -3 ], "overmap": "refctr_E1d_z-3_north" }, + { "point": [ 11, 8, -3 ], "overmap": "refctr_E2d_z-3_north" }, + { "point": [ 12, 8, -3 ], "overmap": "refctr_E3d_z-3_north" }, + { "point": [ 13, 8, -3 ], "overmap": "refctr_E4d_z-3_north" }, + { "point": [ 14, 8, -3 ], "overmap": "refctr_E5d_z-3_north" }, + { "point": [ 10, 9, -3 ], "overmap": "refctr_E1e_z-3_north" }, + { "point": [ 11, 9, -3 ], "overmap": "refctr_E2e_z-3_north" }, + { "point": [ 12, 9, -3 ], "overmap": "refctr_E3e_z-3_north" }, + { "point": [ 13, 9, -3 ], "overmap": "refctr_E4e_z-3_north" }, + { "point": [ 14, 9, -3 ], "overmap": "refctr_E5e_z-3_north" }, + { "point": [ 0, 10, -3 ], "overmap": "refctr_SW1a_z-3_north" }, + { "point": [ 1, 10, -3 ], "overmap": "refctr_SW2a_z-3_north" }, + { "point": [ 2, 10, -3 ], "overmap": "refctr_SW3a_z-3_north" }, + { "point": [ 3, 10, -3 ], "overmap": "refctr_SW4a_z-3_north" }, + { "point": [ 4, 10, -3 ], "overmap": "refctr_SW5a_z-3_north" }, + { "point": [ 0, 11, -3 ], "overmap": "refctr_SW1b_z-3_north" }, + { "point": [ 1, 11, -3 ], "overmap": "refctr_SW2b_z-3_north" }, + { "point": [ 2, 11, -3 ], "overmap": "refctr_SW3b_z-3_north" }, + { "point": [ 3, 11, -3 ], "overmap": "refctr_SW4b_z-3_north" }, + { "point": [ 4, 11, -3 ], "overmap": "refctr_SW5b_z-3_north" }, + { "point": [ 0, 12, -3 ], "overmap": "refctr_SW1c_z-3_north" }, + { "point": [ 1, 12, -3 ], "overmap": "refctr_SW2c_z-3_north" }, + { "point": [ 2, 12, -3 ], "overmap": "refctr_SW3c_z-3_north" }, + { "point": [ 3, 12, -3 ], "overmap": "refctr_SW4c_z-3_north" }, + { "point": [ 4, 12, -3 ], "overmap": "refctr_SW5c_z-3_north" }, + { "point": [ 0, 13, -3 ], "overmap": "refctr_SW1d_z-3_north" }, + { "point": [ 1, 13, -3 ], "overmap": "refctr_SW2d_z-3_north" }, + { "point": [ 2, 13, -3 ], "overmap": "refctr_SW3d_z-3_north" }, + { "point": [ 3, 13, -3 ], "overmap": "refctr_SW4d_z-3_north" }, + { "point": [ 4, 13, -3 ], "overmap": "refctr_SW5d_z-3_north" }, + { "point": [ 0, 14, -3 ], "overmap": "refctr_SW1e_z-3_north" }, + { "point": [ 1, 14, -3 ], "overmap": "refctr_SW2e_z-3_north" }, + { "point": [ 2, 14, -3 ], "overmap": "refctr_SW3e_z-3_north" }, + { "point": [ 3, 14, -3 ], "overmap": "refctr_SW4e_z-3_north" }, + { "point": [ 4, 14, -3 ], "overmap": "refctr_SW5e_z-3_north" }, + { "point": [ 5, 10, -3 ], "overmap": "refctr_S1a_z-3_north" }, + { "point": [ 6, 10, -3 ], "overmap": "refctr_S2a_z-3_north" }, + { "point": [ 7, 10, -3 ], "overmap": "refctr_S3a_z-3_north" }, + { "point": [ 8, 10, -3 ], "overmap": "refctr_S4a_z-3_north" }, + { "point": [ 9, 10, -3 ], "overmap": "refctr_S5a_z-3_north" }, + { "point": [ 5, 11, -3 ], "overmap": "refctr_S1b_z-3_north" }, + { "point": [ 6, 11, -3 ], "overmap": "refctr_S2b_z-3_north" }, + { "point": [ 7, 11, -3 ], "overmap": "refctr_S3b_z-3_north" }, + { "point": [ 8, 11, -3 ], "overmap": "refctr_S4b_z-3_north" }, + { "point": [ 9, 11, -3 ], "overmap": "refctr_S5b_z-3_north" }, + { "point": [ 5, 12, -3 ], "overmap": "refctr_S1c_z-3_north" }, + { "point": [ 6, 12, -3 ], "overmap": "refctr_S2c_z-3_north" }, + { "point": [ 7, 12, -3 ], "overmap": "refctr_S3c_z-3_north" }, + { "point": [ 8, 12, -3 ], "overmap": "refctr_S4c_z-3_north" }, + { "point": [ 9, 12, -3 ], "overmap": "refctr_S5c_z-3_north" }, + { "point": [ 5, 13, -3 ], "overmap": "refctr_S1d_z-3_north" }, + { "point": [ 6, 13, -3 ], "overmap": "refctr_S2d_z-3_north" }, + { "point": [ 7, 13, -3 ], "overmap": "refctr_S3d_z-3_north" }, + { "point": [ 8, 13, -3 ], "overmap": "refctr_S4d_z-3_north" }, + { "point": [ 9, 13, -3 ], "overmap": "refctr_S5d_z-3_north" }, + { "point": [ 5, 14, -3 ], "overmap": "refctr_S1e_z-3_north" }, + { "point": [ 6, 14, -3 ], "overmap": "refctr_S2e_z-3_north" }, + { "point": [ 7, 14, -3 ], "overmap": "refctr_S3e_z-3_north" }, + { "point": [ 8, 14, -3 ], "overmap": "refctr_S4e_z-3_north" }, + { "point": [ 9, 14, -3 ], "overmap": "refctr_S5e_z-3_north" }, + { "point": [ 10, 10, -3 ], "overmap": "refctr_SE1a_z-3_north" }, + { "point": [ 11, 10, -3 ], "overmap": "refctr_SE2a_z-3_north" }, + { "point": [ 12, 10, -3 ], "overmap": "refctr_SE3a_z-3_north" }, + { "point": [ 13, 10, -3 ], "overmap": "refctr_SE4a_z-3_north" }, + { "point": [ 14, 10, -3 ], "overmap": "refctr_SE5a_z-3_north" }, + { "point": [ 10, 11, -3 ], "overmap": "refctr_SE1b_z-3_north" }, + { "point": [ 11, 11, -3 ], "overmap": "refctr_SE2b_z-3_north" }, + { "point": [ 12, 11, -3 ], "overmap": "refctr_SE3b_z-3_north" }, + { "point": [ 13, 11, -3 ], "overmap": "refctr_SE4b_z-3_north" }, + { "point": [ 14, 11, -3 ], "overmap": "refctr_SE5b_z-3_north" }, + { "point": [ 10, 12, -3 ], "overmap": "refctr_SE1c_z-3_north" }, + { "point": [ 11, 12, -3 ], "overmap": "refctr_SE2c_z-3_north" }, + { "point": [ 12, 12, -3 ], "overmap": "refctr_SE3c_z-3_north" }, + { "point": [ 13, 12, -3 ], "overmap": "refctr_SE4c_z-3_north" }, + { "point": [ 14, 12, -3 ], "overmap": "refctr_SE5c_z-3_north" }, + { "point": [ 10, 13, -3 ], "overmap": "refctr_SE1d_z-3_north" }, + { "point": [ 11, 13, -3 ], "overmap": "refctr_SE2d_z-3_north" }, + { "point": [ 12, 13, -3 ], "overmap": "refctr_SE3d_z-3_north" }, + { "point": [ 13, 13, -3 ], "overmap": "refctr_SE4d_z-3_north" }, + { "point": [ 14, 13, -3 ], "overmap": "refctr_SE5d_z-3_north" }, + { "point": [ 10, 14, -3 ], "overmap": "refctr_SE1e_z-3_north" }, + { "point": [ 11, 14, -3 ], "overmap": "refctr_SE2e_z-3_north" }, + { "point": [ 12, 14, -3 ], "overmap": "refctr_SE3e_z-3_north" }, + { "point": [ 13, 14, -3 ], "overmap": "refctr_SE4e_z-3_north" }, + { "point": [ 14, 14, -3 ], "overmap": "refctr_SE5e_z-3_north" }, + { "point": [ 0, 0, -4 ], "overmap": "refctr_NW1a_z-4_north" }, + { "point": [ 1, 0, -4 ], "overmap": "refctr_NW2a_z-4_north" }, + { "point": [ 2, 0, -4 ], "overmap": "refctr_NW3a_z-4_north" }, + { "point": [ 3, 0, -4 ], "overmap": "refctr_NW4a_z-4_north" }, + { "point": [ 4, 0, -4 ], "overmap": "refctr_NW5a_z-4_north" }, + { "point": [ 0, 1, -4 ], "overmap": "refctr_NW1b_z-4_north" }, + { "point": [ 1, 1, -4 ], "overmap": "refctr_NW2b_z-4_north" }, + { "point": [ 2, 1, -4 ], "overmap": "refctr_NW3b_z-4_north" }, + { "point": [ 3, 1, -4 ], "overmap": "refctr_NW4b_z-4_north" }, + { "point": [ 4, 1, -4 ], "overmap": "refctr_NW5b_z-4_north" }, + { "point": [ 0, 2, -4 ], "overmap": "refctr_NW1c_z-4_north" }, + { "point": [ 1, 2, -4 ], "overmap": "refctr_NW2c_z-4_north" }, + { "point": [ 2, 2, -4 ], "overmap": "refctr_NW3c_z-4_north" }, + { "point": [ 3, 2, -4 ], "overmap": "refctr_NW4c_z-4_north" }, + { "point": [ 4, 2, -4 ], "overmap": "refctr_NW5c_z-4_north" }, + { "point": [ 0, 3, -4 ], "overmap": "refctr_NW1d_z-4_north" }, + { "point": [ 1, 3, -4 ], "overmap": "refctr_NW2d_z-4_north" }, + { "point": [ 2, 3, -4 ], "overmap": "refctr_NW3d_z-4_north" }, + { "point": [ 3, 3, -4 ], "overmap": "refctr_NW4d_z-4_north" }, + { "point": [ 4, 3, -4 ], "overmap": "refctr_NW5d_z-4_north" }, + { "point": [ 0, 4, -4 ], "overmap": "refctr_NW1e_z-4_north" }, + { "point": [ 1, 4, -4 ], "overmap": "refctr_NW2e_z-4_north" }, + { "point": [ 2, 4, -4 ], "overmap": "refctr_NW3e_z-4_north" }, + { "point": [ 3, 4, -4 ], "overmap": "refctr_NW4e_z-4_north" }, + { "point": [ 4, 4, -4 ], "overmap": "refctr_NW5e_z-4_north" }, + { "point": [ 5, 0, -4 ], "overmap": "refctr_N1a_z-4_north" }, + { "point": [ 6, 0, -4 ], "overmap": "refctr_N2a_z-4_north" }, + { "point": [ 7, 0, -4 ], "overmap": "refctr_N3a_z-4_north" }, + { "point": [ 8, 0, -4 ], "overmap": "refctr_N4a_z-4_north" }, + { "point": [ 9, 0, -4 ], "overmap": "refctr_N5a_z-4_north" }, + { "point": [ 5, 1, -4 ], "overmap": "refctr_N1b_z-4_north" }, + { "point": [ 6, 1, -4 ], "overmap": "refctr_N2b_z-4_north" }, + { "point": [ 7, 1, -4 ], "overmap": "refctr_N3b_z-4_north" }, + { "point": [ 8, 1, -4 ], "overmap": "refctr_N4b_z-4_north" }, + { "point": [ 9, 1, -4 ], "overmap": "refctr_N5b_z-4_north" }, + { "point": [ 5, 2, -4 ], "overmap": "refctr_N1c_z-4_north" }, + { "point": [ 6, 2, -4 ], "overmap": "refctr_N2c_z-4_north" }, + { "point": [ 7, 2, -4 ], "overmap": "refctr_N3c_z-4_north" }, + { "point": [ 8, 2, -4 ], "overmap": "refctr_N4c_z-4_north" }, + { "point": [ 9, 2, -4 ], "overmap": "refctr_N5c_z-4_north" }, + { "point": [ 5, 3, -4 ], "overmap": "refctr_N1d_z-4_north" }, + { "point": [ 6, 3, -4 ], "overmap": "refctr_N2d_z-4_north" }, + { "point": [ 7, 3, -4 ], "overmap": "refctr_N3d_z-4_north" }, + { "point": [ 8, 3, -4 ], "overmap": "refctr_N4d_z-4_north" }, + { "point": [ 9, 3, -4 ], "overmap": "refctr_N5d_z-4_north" }, + { "point": [ 5, 4, -4 ], "overmap": "refctr_N1e_z-4_north" }, + { "point": [ 6, 4, -4 ], "overmap": "refctr_N2e_z-4_north" }, + { "point": [ 7, 4, -4 ], "overmap": "refctr_N3e_z-4_north" }, + { "point": [ 8, 4, -4 ], "overmap": "refctr_N4e_z-4_north" }, + { "point": [ 9, 4, -4 ], "overmap": "refctr_N5e_z-4_north" }, + { "point": [ 10, 0, -4 ], "overmap": "refctr_NE1a_z-4_north" }, + { "point": [ 11, 0, -4 ], "overmap": "refctr_NE2a_z-4_north" }, + { "point": [ 12, 0, -4 ], "overmap": "refctr_NE3a_z-4_north" }, + { "point": [ 13, 0, -4 ], "overmap": "refctr_NE4a_z-4_north" }, + { "point": [ 14, 0, -4 ], "overmap": "refctr_NE5a_z-4_north" }, + { "point": [ 10, 1, -4 ], "overmap": "refctr_NE1b_z-4_north" }, + { "point": [ 11, 1, -4 ], "overmap": "refctr_NE2b_z-4_north" }, + { "point": [ 12, 1, -4 ], "overmap": "refctr_NE3b_z-4_north" }, + { "point": [ 13, 1, -4 ], "overmap": "refctr_NE4b_z-4_north" }, + { "point": [ 14, 1, -4 ], "overmap": "refctr_NE5b_z-4_north" }, + { "point": [ 10, 2, -4 ], "overmap": "refctr_NE1c_z-4_north" }, + { "point": [ 11, 2, -4 ], "overmap": "refctr_NE2c_z-4_north" }, + { "point": [ 12, 2, -4 ], "overmap": "refctr_NE3c_z-4_north" }, + { "point": [ 13, 2, -4 ], "overmap": "refctr_NE4c_z-4_north" }, + { "point": [ 14, 2, -4 ], "overmap": "refctr_NE5c_z-4_north" }, + { "point": [ 10, 3, -4 ], "overmap": "refctr_NE1d_z-4_north" }, + { "point": [ 11, 3, -4 ], "overmap": "refctr_NE2d_z-4_north" }, + { "point": [ 12, 3, -4 ], "overmap": "refctr_NE3d_z-4_north" }, + { "point": [ 13, 3, -4 ], "overmap": "refctr_NE4d_z-4_north" }, + { "point": [ 14, 3, -4 ], "overmap": "refctr_NE5d_z-4_north" }, + { "point": [ 10, 4, -4 ], "overmap": "refctr_NE1e_z-4_north" }, + { "point": [ 11, 4, -4 ], "overmap": "refctr_NE2e_z-4_north" }, + { "point": [ 12, 4, -4 ], "overmap": "refctr_NE3e_z-4_north" }, + { "point": [ 13, 4, -4 ], "overmap": "refctr_NE4e_z-4_north" }, + { "point": [ 14, 4, -4 ], "overmap": "refctr_NE5e_z-4_north" }, + { "point": [ 0, 5, -4 ], "overmap": "refctr_W1a_z-4_north" }, + { "point": [ 1, 5, -4 ], "overmap": "refctr_W2a_z-4_north" }, + { "point": [ 2, 5, -4 ], "overmap": "refctr_W3a_z-4_north" }, + { "point": [ 3, 5, -4 ], "overmap": "refctr_W4a_z-4_north" }, + { "point": [ 4, 5, -4 ], "overmap": "refctr_W5a_z-4_north" }, + { "point": [ 0, 6, -4 ], "overmap": "refctr_W1b_z-4_north" }, + { "point": [ 1, 6, -4 ], "overmap": "refctr_W2b_z-4_north" }, + { "point": [ 2, 6, -4 ], "overmap": "refctr_W3b_z-4_north" }, + { "point": [ 3, 6, -4 ], "overmap": "refctr_W4b_z-4_north" }, + { "point": [ 4, 6, -4 ], "overmap": "refctr_W5b_z-4_north" }, + { "point": [ 0, 7, -4 ], "overmap": "refctr_W1c_z-4_north" }, + { "point": [ 1, 7, -4 ], "overmap": "refctr_W2c_z-4_north" }, + { "point": [ 2, 7, -4 ], "overmap": "refctr_W3c_z-4_north" }, + { "point": [ 3, 7, -4 ], "overmap": "refctr_W4c_z-4_north" }, + { "point": [ 4, 7, -4 ], "overmap": "refctr_W5c_z-4_north" }, + { "point": [ 0, 8, -4 ], "overmap": "refctr_W1d_z-4_north" }, + { "point": [ 1, 8, -4 ], "overmap": "refctr_W2d_z-4_north" }, + { "point": [ 2, 8, -4 ], "overmap": "refctr_W3d_z-4_north" }, + { "point": [ 3, 8, -4 ], "overmap": "refctr_W4d_z-4_north" }, + { "point": [ 4, 8, -4 ], "overmap": "refctr_W5d_z-4_north" }, + { "point": [ 0, 9, -4 ], "overmap": "refctr_W1e_z-4_north" }, + { "point": [ 1, 9, -4 ], "overmap": "refctr_W2e_z-4_north" }, + { "point": [ 2, 9, -4 ], "overmap": "refctr_W3e_z-4_north" }, + { "point": [ 3, 9, -4 ], "overmap": "refctr_W4e_z-4_north" }, + { "point": [ 4, 9, -4 ], "overmap": "refctr_W5e_z-4_north" }, + { "point": [ 5, 5, -4 ], "overmap": "evac_center_1_z-4_north" }, + { "point": [ 6, 5, -4 ], "overmap": "evac_center_2_z-4_north" }, + { "point": [ 7, 5, -4 ], "overmap": "evac_center_3_z-4_north" }, + { "point": [ 8, 5, -4 ], "overmap": "evac_center_4_z-4_north" }, + { "point": [ 9, 5, -4 ], "overmap": "evac_center_5_z-4_north" }, + { "point": [ 5, 6, -4 ], "overmap": "evac_center_6_z-4_north" }, + { "point": [ 6, 6, -4 ], "overmap": "evac_center_7_z-4_north" }, + { "point": [ 7, 6, -4 ], "overmap": "evac_center_8_z-4_north" }, + { "point": [ 8, 6, -4 ], "overmap": "evac_center_9_z-4_north" }, + { "point": [ 9, 6, -4 ], "overmap": "evac_center_10_z-4_north" }, + { "point": [ 5, 7, -4 ], "overmap": "evac_center_11_z-4_north" }, + { "point": [ 6, 7, -4 ], "overmap": "evac_center_12_z-4_north" }, + { "point": [ 7, 7, -4 ], "overmap": "evac_center_13_z-4_north" }, + { "point": [ 8, 7, -4 ], "overmap": "evac_center_14_z-4_north" }, + { "point": [ 9, 7, -4 ], "overmap": "evac_center_15_z-4_north" }, + { "point": [ 5, 8, -4 ], "overmap": "evac_center_16_z-4_north" }, + { "point": [ 6, 8, -4 ], "overmap": "evac_center_17_z-4_north" }, + { "point": [ 7, 8, -4 ], "overmap": "evac_center_18_z-4_north" }, + { "point": [ 8, 8, -4 ], "overmap": "evac_center_19_z-4_north" }, + { "point": [ 9, 8, -4 ], "overmap": "evac_center_20_z-4_north" }, + { "point": [ 5, 9, -4 ], "overmap": "evac_center_21_z-4_north" }, + { "point": [ 6, 9, -4 ], "overmap": "evac_center_22_z-4_north" }, + { "point": [ 7, 9, -4 ], "overmap": "evac_center_23_z-4_north" }, + { "point": [ 8, 9, -4 ], "overmap": "evac_center_24_z-4_north" }, + { "point": [ 9, 9, -4 ], "overmap": "evac_center_25_z-4_north" }, + { "point": [ 10, 5, -4 ], "overmap": "refctr_E1a_z-4_north" }, + { "point": [ 11, 5, -4 ], "overmap": "refctr_E2a_z-4_north" }, + { "point": [ 12, 5, -4 ], "overmap": "refctr_E3a_z-4_north" }, + { "point": [ 13, 5, -4 ], "overmap": "refctr_E4a_z-4_north" }, + { "point": [ 14, 5, -4 ], "overmap": "refctr_E5a_z-4_north" }, + { "point": [ 10, 6, -4 ], "overmap": "refctr_E1b_z-4_north" }, + { "point": [ 11, 6, -4 ], "overmap": "refctr_E2b_z-4_north" }, + { "point": [ 12, 6, -4 ], "overmap": "refctr_E3b_z-4_north" }, + { "point": [ 13, 6, -4 ], "overmap": "refctr_E4b_z-4_north" }, + { "point": [ 14, 6, -4 ], "overmap": "refctr_E5b_z-4_north" }, + { "point": [ 10, 7, -4 ], "overmap": "refctr_E1c_z-4_north" }, + { "point": [ 11, 7, -4 ], "overmap": "refctr_E2c_z-4_north" }, + { "point": [ 12, 7, -4 ], "overmap": "refctr_E3c_z-4_north" }, + { "point": [ 13, 7, -4 ], "overmap": "refctr_E4c_z-4_north" }, + { "point": [ 14, 7, -4 ], "overmap": "refctr_E5c_z-4_north" }, + { "point": [ 10, 8, -4 ], "overmap": "refctr_E1d_z-4_north" }, + { "point": [ 11, 8, -4 ], "overmap": "refctr_E2d_z-4_north" }, + { "point": [ 12, 8, -4 ], "overmap": "refctr_E3d_z-4_north" }, + { "point": [ 13, 8, -4 ], "overmap": "refctr_E4d_z-4_north" }, + { "point": [ 14, 8, -4 ], "overmap": "refctr_E5d_z-4_north" }, + { "point": [ 10, 9, -4 ], "overmap": "refctr_E1e_z-4_north" }, + { "point": [ 11, 9, -4 ], "overmap": "refctr_E2e_z-4_north" }, + { "point": [ 12, 9, -4 ], "overmap": "refctr_E3e_z-4_north" }, + { "point": [ 13, 9, -4 ], "overmap": "refctr_E4e_z-4_north" }, + { "point": [ 14, 9, -4 ], "overmap": "refctr_E5e_z-4_north" }, + { "point": [ 0, 10, -4 ], "overmap": "refctr_SW1a_z-4_north" }, + { "point": [ 1, 10, -4 ], "overmap": "refctr_SW2a_z-4_north" }, + { "point": [ 2, 10, -4 ], "overmap": "refctr_SW3a_z-4_north" }, + { "point": [ 3, 10, -4 ], "overmap": "refctr_SW4a_z-4_north" }, + { "point": [ 4, 10, -4 ], "overmap": "refctr_SW5a_z-4_north" }, + { "point": [ 0, 11, -4 ], "overmap": "refctr_SW1b_z-4_north" }, + { "point": [ 1, 11, -4 ], "overmap": "refctr_SW2b_z-4_north" }, + { "point": [ 2, 11, -4 ], "overmap": "refctr_SW3b_z-4_north" }, + { "point": [ 3, 11, -4 ], "overmap": "refctr_SW4b_z-4_north" }, + { "point": [ 4, 11, -4 ], "overmap": "refctr_SW5b_z-4_north" }, + { "point": [ 0, 12, -4 ], "overmap": "refctr_SW1c_z-4_north" }, + { "point": [ 1, 12, -4 ], "overmap": "refctr_SW2c_z-4_north" }, + { "point": [ 2, 12, -4 ], "overmap": "refctr_SW3c_z-4_north" }, + { "point": [ 3, 12, -4 ], "overmap": "refctr_SW4c_z-4_north" }, + { "point": [ 4, 12, -4 ], "overmap": "refctr_SW5c_z-4_north" }, + { "point": [ 0, 13, -4 ], "overmap": "refctr_SW1d_z-4_north" }, + { "point": [ 1, 13, -4 ], "overmap": "refctr_SW2d_z-4_north" }, + { "point": [ 2, 13, -4 ], "overmap": "refctr_SW3d_z-4_north" }, + { "point": [ 3, 13, -4 ], "overmap": "refctr_SW4d_z-4_north" }, + { "point": [ 4, 13, -4 ], "overmap": "refctr_SW5d_z-4_north" }, + { "point": [ 0, 14, -4 ], "overmap": "refctr_SW1e_z-4_north" }, + { "point": [ 1, 14, -4 ], "overmap": "refctr_SW2e_z-4_north" }, + { "point": [ 2, 14, -4 ], "overmap": "refctr_SW3e_z-4_north" }, + { "point": [ 3, 14, -4 ], "overmap": "refctr_SW4e_z-4_north" }, + { "point": [ 4, 14, -4 ], "overmap": "refctr_SW5e_z-4_north" }, + { "point": [ 5, 10, -4 ], "overmap": "refctr_S1a_z-4_north" }, + { "point": [ 6, 10, -4 ], "overmap": "refctr_S2a_z-4_north" }, + { "point": [ 7, 10, -4 ], "overmap": "refctr_S3a_z-4_north" }, + { "point": [ 8, 10, -4 ], "overmap": "refctr_S4a_z-4_north" }, + { "point": [ 9, 10, -4 ], "overmap": "refctr_S5a_z-4_north" }, + { "point": [ 5, 11, -4 ], "overmap": "refctr_S1b_z-4_north" }, + { "point": [ 6, 11, -4 ], "overmap": "refctr_S2b_z-4_north" }, + { "point": [ 7, 11, -4 ], "overmap": "refctr_S3b_z-4_north" }, + { "point": [ 8, 11, -4 ], "overmap": "refctr_S4b_z-4_north" }, + { "point": [ 9, 11, -4 ], "overmap": "refctr_S5b_z-4_north" }, + { "point": [ 5, 12, -4 ], "overmap": "refctr_S1c_z-4_north" }, + { "point": [ 6, 12, -4 ], "overmap": "refctr_S2c_z-4_north" }, + { "point": [ 7, 12, -4 ], "overmap": "refctr_S3c_z-4_north" }, + { "point": [ 8, 12, -4 ], "overmap": "refctr_S4c_z-4_north" }, + { "point": [ 9, 12, -4 ], "overmap": "refctr_S5c_z-4_north" }, + { "point": [ 5, 13, -4 ], "overmap": "refctr_S1d_z-4_north" }, + { "point": [ 6, 13, -4 ], "overmap": "refctr_S2d_z-4_north" }, + { "point": [ 7, 13, -4 ], "overmap": "refctr_S3d_z-4_north" }, + { "point": [ 8, 13, -4 ], "overmap": "refctr_S4d_z-4_north" }, + { "point": [ 9, 13, -4 ], "overmap": "refctr_S5d_z-4_north" }, + { "point": [ 5, 14, -4 ], "overmap": "refctr_S1e_z-4_north" }, + { "point": [ 6, 14, -4 ], "overmap": "refctr_S2e_z-4_north" }, + { "point": [ 7, 14, -4 ], "overmap": "refctr_S3e_z-4_north" }, + { "point": [ 8, 14, -4 ], "overmap": "refctr_S4e_z-4_north" }, + { "point": [ 9, 14, -4 ], "overmap": "refctr_S5e_z-4_north" }, + { "point": [ 10, 10, -4 ], "overmap": "refctr_SE1a_z-4_north" }, + { "point": [ 11, 10, -4 ], "overmap": "refctr_SE2a_z-4_north" }, + { "point": [ 12, 10, -4 ], "overmap": "refctr_SE3a_z-4_north" }, + { "point": [ 13, 10, -4 ], "overmap": "refctr_SE4a_z-4_north" }, + { "point": [ 14, 10, -4 ], "overmap": "refctr_SE5a_z-4_north" }, + { "point": [ 10, 11, -4 ], "overmap": "refctr_SE1b_z-4_north" }, + { "point": [ 11, 11, -4 ], "overmap": "refctr_SE2b_z-4_north" }, + { "point": [ 12, 11, -4 ], "overmap": "refctr_SE3b_z-4_north" }, + { "point": [ 13, 11, -4 ], "overmap": "refctr_SE4b_z-4_north" }, + { "point": [ 14, 11, -4 ], "overmap": "refctr_SE5b_z-4_north" }, + { "point": [ 10, 12, -4 ], "overmap": "refctr_SE1c_z-4_north" }, + { "point": [ 11, 12, -4 ], "overmap": "refctr_SE2c_z-4_north" }, + { "point": [ 12, 12, -4 ], "overmap": "refctr_SE3c_z-4_north" }, + { "point": [ 13, 12, -4 ], "overmap": "refctr_SE4c_z-4_north" }, + { "point": [ 14, 12, -4 ], "overmap": "refctr_SE5c_z-4_north" }, + { "point": [ 10, 13, -4 ], "overmap": "refctr_SE1d_z-4_north" }, + { "point": [ 11, 13, -4 ], "overmap": "refctr_SE2d_z-4_north" }, + { "point": [ 12, 13, -4 ], "overmap": "refctr_SE3d_z-4_north" }, + { "point": [ 13, 13, -4 ], "overmap": "refctr_SE4d_z-4_north" }, + { "point": [ 14, 13, -4 ], "overmap": "refctr_SE5d_z-4_north" }, + { "point": [ 10, 14, -4 ], "overmap": "refctr_SE1e_z-4_north" }, + { "point": [ 11, 14, -4 ], "overmap": "refctr_SE2e_z-4_north" }, + { "point": [ 12, 14, -4 ], "overmap": "refctr_SE3e_z-4_north" }, + { "point": [ 13, 14, -4 ], "overmap": "refctr_SE4e_z-4_north" }, + { "point": [ 14, 14, -4 ], "overmap": "refctr_SE5e_z-4_north" }, + { "point": [ 7, 15, 0 ], "overmap": "road_end_south" } + ], + "connections": [ { "point": [ 7, 15, 0 ] } ], "locations": [ "wilderness" ], "city_distance": [ 3, -1 ], "city_sizes": [ 1, 16 ], @@ -1813,9 +3369,10 @@ ], "connections": [ { "point": [ 1, -1, 0 ], "terrain": "road" } ], "locations": [ "land" ], - "city_sizes": [ 4, 12 ], - "occurrences": [ 1, 4 ], - "flags": [ "CLASSIC" ] + "city_distance": [ 0, 3 ], + "city_sizes": [ 8, 16 ], + "occurrences": [ 75, 100 ], + "flags": [ "UNIQUE" ] }, { "type": "overmap_special", @@ -1851,9 +3408,10 @@ ], "connections": [ { "point": [ 1, -1, 0 ], "terrain": "road" } ], "locations": [ "land" ], - "city_sizes": [ 4, 12 ], - "occurrences": [ 0, 4 ], - "flags": [ "CLASSIC" ] + "city_distance": [ 0, 3 ], + "city_sizes": [ 4, 16 ], + "occurrences": [ 50, 100 ], + "flags": [ "UNIQUE" ] }, { "type": "overmap_special", @@ -1889,8 +3447,8 @@ ], "locations": [ "land" ], "city_distance": [ 10, -1 ], - "city_sizes": [ 4, 12 ], - "occurrences": [ 1, 5 ], + "city_sizes": [ 4, 16 ], + "occurrences": [ 75, 100 ], "flags": [ "UNIQUE" ] }, { @@ -1927,8 +3485,8 @@ ], "locations": [ "land" ], "city_distance": [ 10, -1 ], - "city_sizes": [ 4, 12 ], - "occurrences": [ 1, 5 ], + "city_sizes": [ 4, 16 ], + "occurrences": [ 50, 100 ], "flags": [ "UNIQUE" ] }, { diff --git a/data/json/overmap_terrain.json b/data/json/overmap/overmap_terrain/overmap_terrain.json similarity index 100% rename from data/json/overmap_terrain.json rename to data/json/overmap/overmap_terrain/overmap_terrain.json diff --git a/data/json/overmap_terrain_abstract.json b/data/json/overmap/overmap_terrain/overmap_terrain_abstract.json similarity index 99% rename from data/json/overmap_terrain_abstract.json rename to data/json/overmap/overmap_terrain/overmap_terrain_abstract.json index 8204e99c57ea2..5af142174dfeb 100644 --- a/data/json/overmap_terrain_abstract.json +++ b/data/json/overmap/overmap_terrain/overmap_terrain_abstract.json @@ -164,7 +164,7 @@ "color": "white", "extras": "field", "see_cost": 5, - "monster_density": 2 + "mondensity": 2 }, { "type": "overmap_terrain", diff --git a/data/json/overmap_terrain_agricultural.json b/data/json/overmap/overmap_terrain/overmap_terrain_agricultural.json similarity index 97% rename from data/json/overmap_terrain_agricultural.json rename to data/json/overmap/overmap_terrain/overmap_terrain_agricultural.json index cc117542d377c..0aabc49dee016 100644 --- a/data/json/overmap_terrain_agricultural.json +++ b/data/json/overmap/overmap_terrain/overmap_terrain_agricultural.json @@ -27,10 +27,30 @@ "extras": "build", "mondensity": 2 }, + { + "type": "overmap_terrain", + "id": "farm_2_roof", + "name": "farm house roof", + "sym": "^", + "color": "i_brown", + "see_cost": 5, + "extras": "build", + "mondensity": 2 + }, { "type": "overmap_terrain", "id": "farm_3", - "name": "farm field", + "name": "farm barn", + "sym": "#", + "color": "i_brown", + "see_cost": 5, + "extras": "field", + "mondensity": 2 + }, + { + "type": "overmap_terrain", + "id": "farm_3_roof", + "name": "farm barn roof", "sym": "#", "color": "i_brown", "see_cost": 5, diff --git a/data/json/overmap_terrain_campus.json b/data/json/overmap/overmap_terrain/overmap_terrain_campus.json similarity index 100% rename from data/json/overmap_terrain_campus.json rename to data/json/overmap/overmap_terrain/overmap_terrain_campus.json diff --git a/data/json/overmap_terrain_cemetery.json b/data/json/overmap/overmap_terrain/overmap_terrain_cemetery.json similarity index 100% rename from data/json/overmap_terrain_cemetery.json rename to data/json/overmap/overmap_terrain/overmap_terrain_cemetery.json diff --git a/data/json/overmap_terrain_commercial.json b/data/json/overmap/overmap_terrain/overmap_terrain_commercial.json similarity index 90% rename from data/json/overmap_terrain_commercial.json rename to data/json/overmap/overmap_terrain/overmap_terrain_commercial.json index a8de2c94acdd0..3fb570c31f5d7 100644 --- a/data/json/overmap_terrain_commercial.json +++ b/data/json/overmap/overmap_terrain/overmap_terrain_commercial.json @@ -277,6 +277,69 @@ "copy-from": "generic_city_building", "color": "red" }, + { + "type": "overmap_terrain", + "id": "s_gun_roof", + "name": "gun store roof", + "copy-from": "generic_city_building", + "color": "red" + }, + { + "type": "overmap_terrain", + "id": "s_gun_1", + "name": "gun store", + "copy-from": "generic_city_building", + "color": "red" + }, + { + "type": "overmap_terrain", + "id": "s_gun_roof_1", + "name": "gun store roof", + "copy-from": "generic_city_building", + "color": "red" + }, + { + "type": "overmap_terrain", + "id": "s_gun_2", + "name": "gun store", + "copy-from": "generic_city_building", + "color": "red" + }, + { + "type": "overmap_terrain", + "id": "s_gun_3", + "name": "gun store", + "copy-from": "generic_city_building", + "color": "red" + }, + { + "type": "overmap_terrain", + "id": "s_gun_roof_3", + "name": "gun store roof", + "copy-from": "generic_city_building", + "color": "red" + }, + { + "type": "overmap_terrain", + "id": "s_gun_4", + "name": "gun store", + "copy-from": "generic_city_building", + "color": "red" + }, + { + "type": "overmap_terrain", + "id": "s_gun_2ndfloor_4", + "name": "gun store 2nd floor", + "copy-from": "generic_city_building", + "color": "red" + }, + { + "type": "overmap_terrain", + "id": "s_gun_roof_4", + "name": "gun store roof", + "copy-from": "generic_city_building", + "color": "red" + }, { "type": "overmap_terrain", "id": "s_clothes", @@ -438,6 +501,27 @@ "copy-from": "generic_city_building", "color": "i_brown" }, + { + "type": "overmap_terrain", + "id": "s_restaurant_foodplace", + "name": "restaurant", + "copy-from": "generic_city_building", + "color": "pink" + }, + { + "type": "overmap_terrain", + "id": "s_restaurant_foodplace_roof", + "name": "restaurant roof", + "copy-from": "generic_city_building", + "color": "pink" + }, + { + "type": "overmap_terrain", + "id": "s_restaurant_foodplace_upper_roof", + "name": "restaurant roof", + "copy-from": "generic_city_building", + "color": "pink" + }, { "type": "overmap_terrain", "id": "s_restaurant", @@ -792,6 +876,46 @@ "copy-from": "generic_city_building", "color": "i_light_gray" }, + { + "type": "overmap_terrain", + "id": "mil_surplus_roof", + "name": "mil. surplus roof", + "sym": "M", + "copy-from": "generic_city_building", + "color": "i_light_gray" + }, + { + "type": "overmap_terrain", + "id": "mil_surplus_1", + "name": "mil. surplus", + "sym": "M", + "copy-from": "generic_city_building", + "color": "i_light_gray" + }, + { + "type": "overmap_terrain", + "id": "mil_surplus_roof_1", + "name": "mil. surplus roof", + "sym": "M", + "copy-from": "generic_city_building", + "color": "i_light_gray" + }, + { + "type": "overmap_terrain", + "id": "mil_surplus_2", + "name": "mil. surplus", + "sym": "M", + "copy-from": "generic_city_building", + "color": "i_light_gray" + }, + { + "type": "overmap_terrain", + "id": "mil_surplus_roof_2", + "name": "mil. surplus roof", + "sym": "M", + "copy-from": "generic_city_building", + "color": "i_light_gray" + }, { "type": "overmap_terrain", "id": "furniture", @@ -821,6 +945,14 @@ "sym": "m", "color": "brown" }, + { + "type": "overmap_terrain", + "id": "s_music_roof", + "copy-from": "generic_city_building", + "name": "music store roof", + "sym": "m", + "color": "brown" + }, { "type": "overmap_terrain", "id": "megastore_entrance", @@ -1416,6 +1548,30 @@ "sym": "L", "color": "light_gray" }, + { + "type": "overmap_terrain", + "id": "lancenter_roof", + "name": "LAN center roof", + "copy-from": "generic_city_building", + "sym": "L", + "color": "light_gray" + }, + { + "type": "overmap_terrain", + "id": "lancenter_1", + "name": "LAN center", + "copy-from": "generic_city_building", + "sym": "L", + "color": "light_gray" + }, + { + "type": "overmap_terrain", + "id": "lancenter_roof_1", + "name": "LAN center roof", + "copy-from": "generic_city_building", + "sym": "L", + "color": "light_gray" + }, { "type": "overmap_terrain", "id": "landscapingsupplyco_1a", @@ -1432,6 +1588,14 @@ "sym": "L", "color": "i_green" }, + { + "type": "overmap_terrain", + "id": "landscapingsupplyco_1b_roof", + "copy-from": "generic_city_building", + "name": "landscaping supply co roof", + "sym": "L", + "color": "i_green" + }, { "type": "overmap_terrain", "id": "s_vfw", @@ -1577,6 +1741,27 @@ "copy-from": "generic_city_building", "color": "white_white" }, + { + "type": "overmap_terrain", + "id": "s_laundromat_roof", + "name": "laundromat roof", + "copy-from": "generic_city_building", + "color": "white_white" + }, + { + "type": "overmap_terrain", + "id": "s_laundromat_1", + "name": "laundromat", + "copy-from": "generic_city_building", + "color": "white_white" + }, + { + "type": "overmap_terrain", + "id": "s_laundromat_roof_1", + "name": "laundromat roof", + "copy-from": "generic_city_building", + "color": "white_white" + }, { "type": "overmap_terrain", "id": "s_jewelry", @@ -1585,6 +1770,14 @@ "sym": "J", "color": "white" }, + { + "type": "overmap_terrain", + "id": "s_jewelry_roof", + "name": "jewelry store roof", + "copy-from": "generic_city_building", + "sym": "J", + "color": "white" + }, { "type": "overmap_terrain", "abstract": "generic_motel", @@ -1663,6 +1856,13 @@ "copy-from": "generic_city_building", "color": "c_yellow_green" }, + { + "type": "overmap_terrain", + "id": "home_improvement_roof", + "name": "home improvement store roof", + "copy-from": "generic_city_building", + "color": "c_yellow_green" + }, { "type": "overmap_terrain", "id": "loffice_tower_1", @@ -2005,6 +2205,30 @@ "sym": "0", "color": "i_white" }, + { + "type": "overmap_terrain", + "id": "headshop", + "copy-from": "generic_city_building", + "name": "Head Shop", + "sym": "0", + "color": "i_white" + }, + { + "type": "overmap_terrain", + "id": "headshop_roof", + "copy-from": "generic_city_building", + "name": "head shop roof", + "sym": "0", + "color": "i_white" + }, + { + "type": "overmap_terrain", + "id": "headshop_upper_roof", + "copy-from": "generic_city_building", + "name": "head shop roof", + "sym": "0", + "color": "i_white" + }, { "type": "overmap_terrain", "id": "abstorefront", diff --git a/data/json/overmap/overmap_terrain/overmap_terrain_evac_center.json b/data/json/overmap/overmap_terrain/overmap_terrain_evac_center.json new file mode 100644 index 0000000000000..73e8d545dda74 --- /dev/null +++ b/data/json/overmap/overmap_terrain/overmap_terrain_evac_center.json @@ -0,0 +1,7996 @@ +[ + { + "type": "overmap_terrain", + "abstract": "generic_evac_center", + "see_cost": 5 + }, + { + "type": "overmap_terrain", + "id": "evac_center_1", + "copy-from": "generic_evac_center", + "name": "road", + "sym": "┌", + "color": "dark_gray" + }, + { + "type": "overmap_terrain", + "id": "evac_center_2", + "copy-from": "generic_evac_center", + "name": "road", + "sym": "─", + "color": "dark_gray" + }, + { + "type": "overmap_terrain", + "id": "evac_center_3", + "copy-from": "generic_evac_center", + "name": "road", + "sym": "─", + "color": "dark_gray" + }, + { + "type": "overmap_terrain", + "id": "evac_center_4", + "copy-from": "generic_evac_center", + "name": "road", + "sym": "─", + "color": "dark_gray" + }, + { + "type": "overmap_terrain", + "id": "evac_center_5", + "copy-from": "generic_evac_center", + "name": "road", + "sym": "┐", + "color": "dark_gray" + }, + { + "type": "overmap_terrain", + "id": "evac_center_6", + "copy-from": "generic_evac_center", + "name": "road", + "sym": "│", + "color": "dark_gray" + }, + { + "type": "overmap_terrain", + "id": "evac_center_7", + "copy-from": "generic_evac_center", + "name": "refugee center", + "sym": "┼", + "color": "white" + }, + { + "type": "overmap_terrain", + "id": "evac_center_8", + "copy-from": "generic_evac_center", + "name": "refugee center", + "sym": "┼", + "color": "white" + }, + { + "type": "overmap_terrain", + "id": "evac_center_9", + "copy-from": "generic_evac_center", + "name": "refugee center", + "sym": "┼", + "color": "white" + }, + { + "type": "overmap_terrain", + "id": "evac_center_10", + "copy-from": "generic_evac_center", + "name": "road", + "sym": "│", + "color": "dark_gray" + }, + { + "type": "overmap_terrain", + "id": "evac_center_11", + "copy-from": "generic_evac_center", + "name": "road", + "sym": "│", + "color": "dark_gray" + }, + { + "type": "overmap_terrain", + "id": "evac_center_12", + "copy-from": "generic_evac_center", + "name": "refugee center", + "sym": "┼", + "color": "white" + }, + { + "type": "overmap_terrain", + "id": "evac_center_13", + "copy-from": "generic_evac_center", + "name": "refugee center", + "sym": "┼", + "color": "white" + }, + { + "type": "overmap_terrain", + "id": "evac_center_14", + "copy-from": "generic_evac_center", + "name": "refugee center", + "sym": "┼", + "color": "white" + }, + { + "type": "overmap_terrain", + "id": "evac_center_15", + "copy-from": "generic_evac_center", + "name": "road", + "sym": "│", + "color": "dark_gray" + }, + { + "type": "overmap_terrain", + "id": "evac_center_16", + "copy-from": "generic_evac_center", + "name": "road", + "sym": "│", + "color": "dark_gray" + }, + { + "type": "overmap_terrain", + "id": "evac_center_17", + "copy-from": "generic_evac_center", + "name": "refugee center", + "sym": "┼", + "color": "white" + }, + { + "type": "overmap_terrain", + "id": "evac_center_18", + "copy-from": "generic_evac_center", + "name": "refugee center", + "sym": "┼", + "color": "white" + }, + { + "type": "overmap_terrain", + "id": "evac_center_19", + "copy-from": "generic_evac_center", + "name": "refugee center", + "sym": "┼", + "color": "white" + }, + { + "type": "overmap_terrain", + "id": "evac_center_20", + "copy-from": "generic_evac_center", + "name": "road", + "sym": "│", + "color": "dark_gray" + }, + { + "type": "overmap_terrain", + "id": "evac_center_21", + "copy-from": "generic_evac_center", + "name": "road", + "sym": "└", + "color": "dark_gray" + }, + { + "type": "overmap_terrain", + "id": "evac_center_22", + "copy-from": "generic_evac_center", + "name": "road", + "sym": "─", + "color": "dark_gray" + }, + { + "type": "overmap_terrain", + "id": "evac_center_23", + "copy-from": "generic_evac_center", + "name": "road", + "sym": "┬", + "color": "dark_gray" + }, + { + "type": "overmap_terrain", + "id": "evac_center_24", + "copy-from": "generic_evac_center", + "name": "road", + "sym": "─", + "color": "dark_gray" + }, + { + "type": "overmap_terrain", + "id": "evac_center_25", + "copy-from": "generic_evac_center", + "name": "road", + "sym": "┘", + "color": "dark_gray" + }, + { + "type": "overmap_terrain", + "abstract": "generic_refctr", + "see_cost": 2, + "name": "field", + "sym": ".", + "color": "brown" + }, + { + "type": "overmap_terrain", + "id": "refctr_NW1a", + "copy-from": "generic_refctr" + }, + { + "type": "overmap_terrain", + "id": "refctr_NW2a", + "copy-from": "generic_refctr" + }, + { + "type": "overmap_terrain", + "id": "refctr_NW3a", + "copy-from": "generic_refctr" + }, + { + "type": "overmap_terrain", + "id": "refctr_NW4a", + "copy-from": "generic_refctr" + }, + { + "type": "overmap_terrain", + "id": "refctr_NW5a", + "copy-from": "generic_refctr" + }, + { + "type": "overmap_terrain", + "id": "refctr_NW1b", + "copy-from": "generic_refctr" + }, + { + "type": "overmap_terrain", + "id": "refctr_NW2b", + "copy-from": "generic_refctr" + }, + { + "type": "overmap_terrain", + "id": "refctr_NW3b", + "copy-from": "generic_refctr" + }, + { + "type": "overmap_terrain", + "id": "refctr_NW4b", + "copy-from": "generic_refctr" + }, + { + "type": "overmap_terrain", + "id": "refctr_NW5b", + "copy-from": "generic_refctr" + }, + { + "type": "overmap_terrain", + "id": "refctr_NW1c", + "copy-from": "generic_refctr" + }, + { + "type": "overmap_terrain", + "id": "refctr_NW2c", + "copy-from": "generic_refctr" + }, + { + "type": "overmap_terrain", + "id": "refctr_NW3c", + "copy-from": "generic_refctr" + }, + { + "type": "overmap_terrain", + "id": "refctr_NW4c", + "copy-from": "generic_refctr" + }, + { + "type": "overmap_terrain", + "id": "refctr_NW5c", + "copy-from": "generic_refctr" + }, + { + "type": "overmap_terrain", + "id": "refctr_NW1d", + "copy-from": "generic_refctr" + }, + { + "type": "overmap_terrain", + "id": "refctr_NW2d", + "copy-from": "generic_refctr" + }, + { + "type": "overmap_terrain", + "id": "refctr_NW3d", + "copy-from": "generic_refctr" + }, + { + "type": "overmap_terrain", + "id": "refctr_NW4d", + "copy-from": "generic_refctr" + }, + { + "type": "overmap_terrain", + "id": "refctr_NW5d", + "copy-from": "generic_refctr" + }, + { + "type": "overmap_terrain", + "id": "refctr_NW1e", + "copy-from": "generic_refctr" + }, + { + "type": "overmap_terrain", + "id": "refctr_NW2e", + "copy-from": "generic_refctr" + }, + { + "type": "overmap_terrain", + "id": "refctr_NW3e", + "copy-from": "generic_refctr" + }, + { + "type": "overmap_terrain", + "id": "refctr_NW4e", + "copy-from": "generic_refctr" + }, + { + "type": "overmap_terrain", + "id": "refctr_NW5e", + "copy-from": "generic_refctr" + }, + { + "type": "overmap_terrain", + "id": "refctr_N1a", + "copy-from": "generic_refctr" + }, + { + "type": "overmap_terrain", + "id": "refctr_N2a", + "copy-from": "generic_refctr" + }, + { + "type": "overmap_terrain", + "id": "refctr_N3a", + "copy-from": "generic_refctr" + }, + { + "type": "overmap_terrain", + "id": "refctr_N4a", + "copy-from": "generic_refctr" + }, + { + "type": "overmap_terrain", + "id": "refctr_N5a", + "copy-from": "generic_refctr" + }, + { + "type": "overmap_terrain", + "id": "refctr_N1b", + "copy-from": "generic_refctr" + }, + { + "type": "overmap_terrain", + "id": "refctr_N2b", + "copy-from": "generic_refctr" + }, + { + "type": "overmap_terrain", + "id": "refctr_N3b", + "copy-from": "generic_refctr" + }, + { + "type": "overmap_terrain", + "id": "refctr_N4b", + "copy-from": "generic_refctr" + }, + { + "type": "overmap_terrain", + "id": "refctr_N5b", + "copy-from": "generic_refctr" + }, + { + "type": "overmap_terrain", + "id": "refctr_N1c", + "copy-from": "generic_refctr" + }, + { + "type": "overmap_terrain", + "id": "refctr_N2c", + "copy-from": "generic_refctr" + }, + { + "type": "overmap_terrain", + "id": "refctr_N3c", + "copy-from": "generic_refctr" + }, + { + "type": "overmap_terrain", + "id": "refctr_N4c", + "copy-from": "generic_refctr" + }, + { + "type": "overmap_terrain", + "id": "refctr_N5c", + "copy-from": "generic_refctr" + }, + { + "type": "overmap_terrain", + "id": "refctr_N1d", + "copy-from": "generic_refctr" + }, + { + "type": "overmap_terrain", + "id": "refctr_N2d", + "copy-from": "generic_refctr" + }, + { + "type": "overmap_terrain", + "id": "refctr_N3d", + "copy-from": "generic_refctr" + }, + { + "type": "overmap_terrain", + "id": "refctr_N4d", + "copy-from": "generic_refctr" + }, + { + "type": "overmap_terrain", + "id": "refctr_N5d", + "copy-from": "generic_refctr" + }, + { + "type": "overmap_terrain", + "id": "refctr_N1e", + "copy-from": "generic_refctr" + }, + { + "type": "overmap_terrain", + "id": "refctr_N2e", + "copy-from": "generic_refctr" + }, + { + "type": "overmap_terrain", + "id": "refctr_N3e", + "copy-from": "generic_refctr" + }, + { + "type": "overmap_terrain", + "id": "refctr_N4e", + "copy-from": "generic_refctr" + }, + { + "type": "overmap_terrain", + "id": "refctr_N5e", + "copy-from": "generic_refctr" + }, + { + "type": "overmap_terrain", + "id": "refctr_NE1a", + "copy-from": "generic_refctr" + }, + { + "type": "overmap_terrain", + "id": "refctr_NE2a", + "copy-from": "generic_refctr" + }, + { + "type": "overmap_terrain", + "id": "refctr_NE3a", + "copy-from": "generic_refctr" + }, + { + "type": "overmap_terrain", + "id": "refctr_NE4a", + "copy-from": "generic_refctr" + }, + { + "type": "overmap_terrain", + "id": "refctr_NE5a", + "copy-from": "generic_refctr" + }, + { + "type": "overmap_terrain", + "id": "refctr_NE1b", + "copy-from": "generic_refctr" + }, + { + "type": "overmap_terrain", + "id": "refctr_NE2b", + "copy-from": "generic_refctr" + }, + { + "type": "overmap_terrain", + "id": "refctr_NE3b", + "copy-from": "generic_refctr" + }, + { + "type": "overmap_terrain", + "id": "refctr_NE4b", + "copy-from": "generic_refctr" + }, + { + "type": "overmap_terrain", + "id": "refctr_NE5b", + "copy-from": "generic_refctr" + }, + { + "type": "overmap_terrain", + "id": "refctr_NE1c", + "copy-from": "generic_refctr" + }, + { + "type": "overmap_terrain", + "id": "refctr_NE2c", + "copy-from": "generic_refctr" + }, + { + "type": "overmap_terrain", + "id": "refctr_NE3c", + "copy-from": "generic_refctr" + }, + { + "type": "overmap_terrain", + "id": "refctr_NE4c", + "copy-from": "generic_refctr" + }, + { + "type": "overmap_terrain", + "id": "refctr_NE5c", + "copy-from": "generic_refctr" + }, + { + "type": "overmap_terrain", + "id": "refctr_NE1d", + "copy-from": "generic_refctr" + }, + { + "type": "overmap_terrain", + "id": "refctr_NE2d", + "copy-from": "generic_refctr" + }, + { + "type": "overmap_terrain", + "id": "refctr_NE3d", + "copy-from": "generic_refctr" + }, + { + "type": "overmap_terrain", + "id": "refctr_NE4d", + "copy-from": "generic_refctr" + }, + { + "type": "overmap_terrain", + "id": "refctr_NE5d", + "copy-from": "generic_refctr" + }, + { + "type": "overmap_terrain", + "id": "refctr_NE1e", + "copy-from": "generic_refctr" + }, + { + "type": "overmap_terrain", + "id": "refctr_NE2e", + "copy-from": "generic_refctr" + }, + { + "type": "overmap_terrain", + "id": "refctr_NE3e", + "copy-from": "generic_refctr" + }, + { + "type": "overmap_terrain", + "id": "refctr_NE4e", + "copy-from": "generic_refctr" + }, + { + "type": "overmap_terrain", + "id": "refctr_NE5e", + "copy-from": "generic_refctr" + }, + { + "type": "overmap_terrain", + "id": "refctr_W1a", + "copy-from": "generic_refctr" + }, + { + "type": "overmap_terrain", + "id": "refctr_W2a", + "copy-from": "generic_refctr" + }, + { + "type": "overmap_terrain", + "id": "refctr_W3a", + "copy-from": "generic_refctr" + }, + { + "type": "overmap_terrain", + "id": "refctr_W4a", + "copy-from": "generic_refctr" + }, + { + "type": "overmap_terrain", + "id": "refctr_W5a", + "copy-from": "generic_refctr" + }, + { + "type": "overmap_terrain", + "id": "refctr_W1b", + "copy-from": "generic_refctr" + }, + { + "type": "overmap_terrain", + "id": "refctr_W2b", + "copy-from": "generic_refctr" + }, + { + "type": "overmap_terrain", + "id": "refctr_W3b", + "copy-from": "generic_refctr" + }, + { + "type": "overmap_terrain", + "id": "refctr_W4b", + "copy-from": "generic_refctr" + }, + { + "type": "overmap_terrain", + "id": "refctr_W5b", + "copy-from": "generic_refctr" + }, + { + "type": "overmap_terrain", + "id": "refctr_W1c", + "copy-from": "generic_refctr" + }, + { + "type": "overmap_terrain", + "id": "refctr_W2c", + "copy-from": "generic_refctr" + }, + { + "type": "overmap_terrain", + "id": "refctr_W3c", + "copy-from": "generic_refctr" + }, + { + "type": "overmap_terrain", + "id": "refctr_W4c", + "copy-from": "generic_refctr" + }, + { + "type": "overmap_terrain", + "id": "refctr_W5c", + "copy-from": "generic_refctr" + }, + { + "type": "overmap_terrain", + "id": "refctr_W1d", + "copy-from": "generic_refctr" + }, + { + "type": "overmap_terrain", + "id": "refctr_W2d", + "copy-from": "generic_refctr" + }, + { + "type": "overmap_terrain", + "id": "refctr_W3d", + "copy-from": "generic_refctr" + }, + { + "type": "overmap_terrain", + "id": "refctr_W4d", + "copy-from": "generic_refctr" + }, + { + "type": "overmap_terrain", + "id": "refctr_W5d", + "copy-from": "generic_refctr" + }, + { + "type": "overmap_terrain", + "id": "refctr_W1e", + "copy-from": "generic_refctr" + }, + { + "type": "overmap_terrain", + "id": "refctr_W2e", + "copy-from": "generic_refctr" + }, + { + "type": "overmap_terrain", + "id": "refctr_W3e", + "copy-from": "generic_refctr" + }, + { + "type": "overmap_terrain", + "id": "refctr_W4e", + "copy-from": "generic_refctr" + }, + { + "type": "overmap_terrain", + "id": "refctr_W5e", + "copy-from": "generic_refctr" + }, + { + "type": "overmap_terrain", + "id": "refctr_E1a", + "copy-from": "generic_refctr" + }, + { + "type": "overmap_terrain", + "id": "refctr_E2a", + "copy-from": "generic_refctr" + }, + { + "type": "overmap_terrain", + "id": "refctr_E3a", + "copy-from": "generic_refctr" + }, + { + "type": "overmap_terrain", + "id": "refctr_E4a", + "copy-from": "generic_refctr" + }, + { + "type": "overmap_terrain", + "id": "refctr_E5a", + "copy-from": "generic_refctr" + }, + { + "type": "overmap_terrain", + "id": "refctr_E1b", + "copy-from": "generic_refctr" + }, + { + "type": "overmap_terrain", + "id": "refctr_E2b", + "copy-from": "generic_refctr" + }, + { + "type": "overmap_terrain", + "id": "refctr_E3b", + "copy-from": "generic_refctr" + }, + { + "type": "overmap_terrain", + "id": "refctr_E4b", + "copy-from": "generic_refctr" + }, + { + "type": "overmap_terrain", + "id": "refctr_E5b", + "copy-from": "generic_refctr" + }, + { + "type": "overmap_terrain", + "id": "refctr_E1c", + "copy-from": "generic_refctr" + }, + { + "type": "overmap_terrain", + "id": "refctr_E2c", + "copy-from": "generic_refctr" + }, + { + "type": "overmap_terrain", + "id": "refctr_E3c", + "copy-from": "generic_refctr" + }, + { + "type": "overmap_terrain", + "id": "refctr_E4c", + "copy-from": "generic_refctr" + }, + { + "type": "overmap_terrain", + "id": "refctr_E5c", + "copy-from": "generic_refctr" + }, + { + "type": "overmap_terrain", + "id": "refctr_E1d", + "copy-from": "generic_refctr" + }, + { + "type": "overmap_terrain", + "id": "refctr_E2d", + "copy-from": "generic_refctr" + }, + { + "type": "overmap_terrain", + "id": "refctr_E3d", + "copy-from": "generic_refctr" + }, + { + "type": "overmap_terrain", + "id": "refctr_E4d", + "copy-from": "generic_refctr" + }, + { + "type": "overmap_terrain", + "id": "refctr_E5d", + "copy-from": "generic_refctr" + }, + { + "type": "overmap_terrain", + "id": "refctr_E1e", + "copy-from": "generic_refctr" + }, + { + "type": "overmap_terrain", + "id": "refctr_E2e", + "copy-from": "generic_refctr" + }, + { + "type": "overmap_terrain", + "id": "refctr_E3e", + "copy-from": "generic_refctr" + }, + { + "type": "overmap_terrain", + "id": "refctr_E4e", + "copy-from": "generic_refctr" + }, + { + "type": "overmap_terrain", + "id": "refctr_E5e", + "copy-from": "generic_refctr" + }, + { + "type": "overmap_terrain", + "id": "refctr_SW1a", + "copy-from": "generic_refctr" + }, + { + "type": "overmap_terrain", + "id": "refctr_SW2a", + "copy-from": "generic_refctr" + }, + { + "type": "overmap_terrain", + "id": "refctr_SW3a", + "copy-from": "generic_refctr" + }, + { + "type": "overmap_terrain", + "id": "refctr_SW4a", + "copy-from": "generic_refctr" + }, + { + "type": "overmap_terrain", + "id": "refctr_SW5a", + "copy-from": "generic_refctr" + }, + { + "type": "overmap_terrain", + "id": "refctr_SW1b", + "copy-from": "generic_refctr" + }, + { + "type": "overmap_terrain", + "id": "refctr_SW2b", + "copy-from": "generic_refctr" + }, + { + "type": "overmap_terrain", + "id": "refctr_SW3b", + "copy-from": "generic_refctr" + }, + { + "type": "overmap_terrain", + "id": "refctr_SW4b", + "copy-from": "generic_refctr" + }, + { + "type": "overmap_terrain", + "id": "refctr_SW5b", + "copy-from": "generic_refctr" + }, + { + "type": "overmap_terrain", + "id": "refctr_SW1c", + "copy-from": "generic_refctr" + }, + { + "type": "overmap_terrain", + "id": "refctr_SW2c", + "copy-from": "generic_refctr" + }, + { + "type": "overmap_terrain", + "id": "refctr_SW3c", + "copy-from": "generic_refctr" + }, + { + "type": "overmap_terrain", + "id": "refctr_SW4c", + "copy-from": "generic_refctr" + }, + { + "type": "overmap_terrain", + "id": "refctr_SW5c", + "copy-from": "generic_refctr" + }, + { + "type": "overmap_terrain", + "id": "refctr_SW1d", + "copy-from": "generic_refctr" + }, + { + "type": "overmap_terrain", + "id": "refctr_SW2d", + "copy-from": "generic_refctr" + }, + { + "type": "overmap_terrain", + "id": "refctr_SW3d", + "copy-from": "generic_refctr" + }, + { + "type": "overmap_terrain", + "id": "refctr_SW4d", + "copy-from": "generic_refctr" + }, + { + "type": "overmap_terrain", + "id": "refctr_SW5d", + "copy-from": "generic_refctr" + }, + { + "type": "overmap_terrain", + "id": "refctr_SW1e", + "copy-from": "generic_refctr" + }, + { + "type": "overmap_terrain", + "id": "refctr_SW2e", + "copy-from": "generic_refctr" + }, + { + "type": "overmap_terrain", + "id": "refctr_SW3e", + "copy-from": "generic_refctr" + }, + { + "type": "overmap_terrain", + "id": "refctr_SW4e", + "copy-from": "generic_refctr" + }, + { + "type": "overmap_terrain", + "id": "refctr_SW5e", + "copy-from": "generic_refctr" + }, + { + "type": "overmap_terrain", + "id": "refctr_S1a", + "copy-from": "generic_refctr" + }, + { + "type": "overmap_terrain", + "id": "refctr_S2a", + "copy-from": "generic_refctr" + }, + { + "type": "overmap_terrain", + "id": "refctr_S3a", + "copy-from": "generic_evac_center", + "name": "road", + "sym": "│", + "color": "dark_gray" + }, + { + "type": "overmap_terrain", + "id": "refctr_S4a", + "copy-from": "generic_refctr" + }, + { + "type": "overmap_terrain", + "id": "refctr_S5a", + "copy-from": "generic_refctr" + }, + { + "type": "overmap_terrain", + "id": "refctr_S1b", + "copy-from": "generic_refctr" + }, + { + "type": "overmap_terrain", + "id": "refctr_S2b", + "copy-from": "generic_refctr" + }, + { + "type": "overmap_terrain", + "id": "refctr_S3b", + "copy-from": "generic_evac_center", + "name": "road", + "sym": "│", + "color": "dark_gray" + }, + { + "type": "overmap_terrain", + "id": "refctr_S4b", + "copy-from": "generic_refctr" + }, + { + "type": "overmap_terrain", + "id": "refctr_S5b", + "copy-from": "generic_refctr" + }, + { + "type": "overmap_terrain", + "id": "refctr_S1c", + "copy-from": "generic_refctr" + }, + { + "type": "overmap_terrain", + "id": "refctr_S2c", + "copy-from": "generic_refctr" + }, + { + "type": "overmap_terrain", + "id": "refctr_S3c", + "copy-from": "generic_evac_center", + "name": "road", + "sym": "│", + "color": "dark_gray" + }, + { + "type": "overmap_terrain", + "id": "refctr_S4c", + "copy-from": "generic_refctr" + }, + { + "type": "overmap_terrain", + "id": "refctr_S5c", + "copy-from": "generic_refctr" + }, + { + "type": "overmap_terrain", + "id": "refctr_S1d", + "copy-from": "generic_refctr" + }, + { + "type": "overmap_terrain", + "id": "refctr_S2d", + "copy-from": "generic_refctr" + }, + { + "type": "overmap_terrain", + "id": "refctr_S3d", + "copy-from": "generic_evac_center", + "name": "road", + "sym": "│", + "color": "dark_gray" + }, + { + "type": "overmap_terrain", + "id": "refctr_S4d", + "copy-from": "generic_refctr" + }, + { + "type": "overmap_terrain", + "id": "refctr_S5d", + "copy-from": "generic_refctr" + }, + { + "type": "overmap_terrain", + "id": "refctr_S1e", + "copy-from": "generic_refctr" + }, + { + "type": "overmap_terrain", + "id": "refctr_S2e", + "copy-from": "generic_refctr" + }, + { + "type": "overmap_terrain", + "id": "refctr_S3e", + "copy-from": "generic_evac_center", + "name": "road", + "sym": "│", + "color": "dark_gray" + }, + { + "type": "overmap_terrain", + "id": "refctr_S4e", + "copy-from": "generic_refctr" + }, + { + "type": "overmap_terrain", + "id": "refctr_S5e", + "copy-from": "generic_refctr" + }, + { + "type": "overmap_terrain", + "id": "refctr_SE1a", + "copy-from": "generic_refctr" + }, + { + "type": "overmap_terrain", + "id": "refctr_SE2a", + "copy-from": "generic_refctr" + }, + { + "type": "overmap_terrain", + "id": "refctr_SE3a", + "copy-from": "generic_refctr" + }, + { + "type": "overmap_terrain", + "id": "refctr_SE4a", + "copy-from": "generic_refctr" + }, + { + "type": "overmap_terrain", + "id": "refctr_SE5a", + "copy-from": "generic_refctr" + }, + { + "type": "overmap_terrain", + "id": "refctr_SE1b", + "copy-from": "generic_refctr" + }, + { + "type": "overmap_terrain", + "id": "refctr_SE2b", + "copy-from": "generic_refctr" + }, + { + "type": "overmap_terrain", + "id": "refctr_SE3b", + "copy-from": "generic_refctr" + }, + { + "type": "overmap_terrain", + "id": "refctr_SE4b", + "copy-from": "generic_refctr" + }, + { + "type": "overmap_terrain", + "id": "refctr_SE5b", + "copy-from": "generic_refctr" + }, + { + "type": "overmap_terrain", + "id": "refctr_SE1c", + "copy-from": "generic_refctr" + }, + { + "type": "overmap_terrain", + "id": "refctr_SE2c", + "copy-from": "generic_refctr" + }, + { + "type": "overmap_terrain", + "id": "refctr_SE3c", + "copy-from": "generic_refctr" + }, + { + "type": "overmap_terrain", + "id": "refctr_SE4c", + "copy-from": "generic_refctr" + }, + { + "type": "overmap_terrain", + "id": "refctr_SE5c", + "copy-from": "generic_refctr" + }, + { + "type": "overmap_terrain", + "id": "refctr_SE1d", + "copy-from": "generic_refctr" + }, + { + "type": "overmap_terrain", + "id": "refctr_SE2d", + "copy-from": "generic_refctr" + }, + { + "type": "overmap_terrain", + "id": "refctr_SE3d", + "copy-from": "generic_refctr" + }, + { + "type": "overmap_terrain", + "id": "refctr_SE4d", + "copy-from": "generic_refctr" + }, + { + "type": "overmap_terrain", + "id": "refctr_SE5d", + "copy-from": "generic_refctr" + }, + { + "type": "overmap_terrain", + "id": "refctr_SE1e", + "copy-from": "generic_refctr" + }, + { + "type": "overmap_terrain", + "id": "refctr_SE2e", + "copy-from": "generic_refctr" + }, + { + "type": "overmap_terrain", + "id": "refctr_SE3e", + "copy-from": "generic_refctr" + }, + { + "type": "overmap_terrain", + "id": "refctr_SE4e", + "copy-from": "generic_refctr" + }, + { + "type": "overmap_terrain", + "id": "refctr_SE5e", + "copy-from": "generic_refctr" + }, + { + "type": "overmap_terrain", + "abstract": "generic_rc_air", + "name": "open air", + "sym": ".", + "color": "blue", + "see_cost": 1 + }, + { + "type": "overmap_terrain", + "id": "refctr_NW1a_z1", + "copy-from": "generic_rc_air" + }, + { + "type": "overmap_terrain", + "id": "refctr_NW2a_z1", + "copy-from": "generic_rc_air" + }, + { + "type": "overmap_terrain", + "id": "refctr_NW3a_z1", + "copy-from": "generic_rc_air" + }, + { + "type": "overmap_terrain", + "id": "refctr_NW4a_z1", + "copy-from": "generic_rc_air" + }, + { + "type": "overmap_terrain", + "id": "refctr_NW5a_z1", + "copy-from": "generic_rc_air" + }, + { + "type": "overmap_terrain", + "id": "refctr_NW1b_z1", + "copy-from": "generic_rc_air" + }, + { + "type": "overmap_terrain", + "id": "refctr_NW2b_z1", + "copy-from": "generic_rc_air" + }, + { + "type": "overmap_terrain", + "id": "refctr_NW3b_z1", + "copy-from": "generic_rc_air" + }, + { + "type": "overmap_terrain", + "id": "refctr_NW4b_z1", + "copy-from": "generic_rc_air" + }, + { + "type": "overmap_terrain", + "id": "refctr_NW5b_z1", + "copy-from": "generic_rc_air" + }, + { + "type": "overmap_terrain", + "id": "refctr_NW1c_z1", + "copy-from": "generic_rc_air" + }, + { + "type": "overmap_terrain", + "id": "refctr_NW2c_z1", + "copy-from": "generic_rc_air" + }, + { + "type": "overmap_terrain", + "id": "refctr_NW3c_z1", + "copy-from": "generic_rc_air" + }, + { + "type": "overmap_terrain", + "id": "refctr_NW4c_z1", + "copy-from": "generic_rc_air" + }, + { + "type": "overmap_terrain", + "id": "refctr_NW5c_z1", + "copy-from": "generic_rc_air" + }, + { + "type": "overmap_terrain", + "id": "refctr_NW1d_z1", + "copy-from": "generic_rc_air" + }, + { + "type": "overmap_terrain", + "id": "refctr_NW2d_z1", + "copy-from": "generic_rc_air" + }, + { + "type": "overmap_terrain", + "id": "refctr_NW3d_z1", + "copy-from": "generic_rc_air" + }, + { + "type": "overmap_terrain", + "id": "refctr_NW4d_z1", + "copy-from": "generic_rc_air" + }, + { + "type": "overmap_terrain", + "id": "refctr_NW5d_z1", + "copy-from": "generic_rc_air" + }, + { + "type": "overmap_terrain", + "id": "refctr_NW1e_z1", + "copy-from": "generic_rc_air" + }, + { + "type": "overmap_terrain", + "id": "refctr_NW2e_z1", + "copy-from": "generic_rc_air" + }, + { + "type": "overmap_terrain", + "id": "refctr_NW3e_z1", + "copy-from": "generic_rc_air" + }, + { + "type": "overmap_terrain", + "id": "refctr_NW4e_z1", + "copy-from": "generic_rc_air" + }, + { + "type": "overmap_terrain", + "id": "refctr_NW5e_z1", + "copy-from": "generic_rc_air" + }, + { + "type": "overmap_terrain", + "id": "refctr_N1a_z1", + "copy-from": "generic_rc_air" + }, + { + "type": "overmap_terrain", + "id": "refctr_N2a_z1", + "copy-from": "generic_rc_air" + }, + { + "type": "overmap_terrain", + "id": "refctr_N3a_z1", + "copy-from": "generic_rc_air" + }, + { + "type": "overmap_terrain", + "id": "refctr_N4a_z1", + "copy-from": "generic_rc_air" + }, + { + "type": "overmap_terrain", + "id": "refctr_N5a_z1", + "copy-from": "generic_rc_air" + }, + { + "type": "overmap_terrain", + "id": "refctr_N1b_z1", + "copy-from": "generic_rc_air" + }, + { + "type": "overmap_terrain", + "id": "refctr_N2b_z1", + "copy-from": "generic_rc_air" + }, + { + "type": "overmap_terrain", + "id": "refctr_N3b_z1", + "copy-from": "generic_rc_air" + }, + { + "type": "overmap_terrain", + "id": "refctr_N4b_z1", + "copy-from": "generic_rc_air" + }, + { + "type": "overmap_terrain", + "id": "refctr_N5b_z1", + "copy-from": "generic_rc_air" + }, + { + "type": "overmap_terrain", + "id": "refctr_N1c_z1", + "copy-from": "generic_rc_air" + }, + { + "type": "overmap_terrain", + "id": "refctr_N2c_z1", + "copy-from": "generic_rc_air" + }, + { + "type": "overmap_terrain", + "id": "refctr_N3c_z1", + "copy-from": "generic_rc_air" + }, + { + "type": "overmap_terrain", + "id": "refctr_N4c_z1", + "copy-from": "generic_rc_air" + }, + { + "type": "overmap_terrain", + "id": "refctr_N5c_z1", + "copy-from": "generic_rc_air" + }, + { + "type": "overmap_terrain", + "id": "refctr_N1d_z1", + "copy-from": "generic_rc_air" + }, + { + "type": "overmap_terrain", + "id": "refctr_N2d_z1", + "copy-from": "generic_rc_air" + }, + { + "type": "overmap_terrain", + "id": "refctr_N3d_z1", + "copy-from": "generic_rc_air" + }, + { + "type": "overmap_terrain", + "id": "refctr_N4d_z1", + "copy-from": "generic_rc_air" + }, + { + "type": "overmap_terrain", + "id": "refctr_N5d_z1", + "copy-from": "generic_rc_air" + }, + { + "type": "overmap_terrain", + "id": "refctr_N1e_z1", + "copy-from": "generic_rc_air" + }, + { + "type": "overmap_terrain", + "id": "refctr_N2e_z1", + "copy-from": "generic_rc_air" + }, + { + "type": "overmap_terrain", + "id": "refctr_N3e_z1", + "copy-from": "generic_rc_air" + }, + { + "type": "overmap_terrain", + "id": "refctr_N4e_z1", + "copy-from": "generic_rc_air" + }, + { + "type": "overmap_terrain", + "id": "refctr_N5e_z1", + "copy-from": "generic_rc_air" + }, + { + "type": "overmap_terrain", + "id": "refctr_NE1a_z1", + "copy-from": "generic_rc_air" + }, + { + "type": "overmap_terrain", + "id": "refctr_NE2a_z1", + "copy-from": "generic_rc_air" + }, + { + "type": "overmap_terrain", + "id": "refctr_NE3a_z1", + "copy-from": "generic_rc_air" + }, + { + "type": "overmap_terrain", + "id": "refctr_NE4a_z1", + "copy-from": "generic_rc_air" + }, + { + "type": "overmap_terrain", + "id": "refctr_NE5a_z1", + "copy-from": "generic_rc_air" + }, + { + "type": "overmap_terrain", + "id": "refctr_NE1b_z1", + "copy-from": "generic_rc_air" + }, + { + "type": "overmap_terrain", + "id": "refctr_NE2b_z1", + "copy-from": "generic_rc_air" + }, + { + "type": "overmap_terrain", + "id": "refctr_NE3b_z1", + "copy-from": "generic_rc_air" + }, + { + "type": "overmap_terrain", + "id": "refctr_NE4b_z1", + "copy-from": "generic_rc_air" + }, + { + "type": "overmap_terrain", + "id": "refctr_NE5b_z1", + "copy-from": "generic_rc_air" + }, + { + "type": "overmap_terrain", + "id": "refctr_NE1c_z1", + "copy-from": "generic_rc_air" + }, + { + "type": "overmap_terrain", + "id": "refctr_NE2c_z1", + "copy-from": "generic_rc_air" + }, + { + "type": "overmap_terrain", + "id": "refctr_NE3c_z1", + "copy-from": "generic_rc_air" + }, + { + "type": "overmap_terrain", + "id": "refctr_NE4c_z1", + "copy-from": "generic_rc_air" + }, + { + "type": "overmap_terrain", + "id": "refctr_NE5c_z1", + "copy-from": "generic_rc_air" + }, + { + "type": "overmap_terrain", + "id": "refctr_NE1d_z1", + "copy-from": "generic_rc_air" + }, + { + "type": "overmap_terrain", + "id": "refctr_NE2d_z1", + "copy-from": "generic_rc_air" + }, + { + "type": "overmap_terrain", + "id": "refctr_NE3d_z1", + "copy-from": "generic_rc_air" + }, + { + "type": "overmap_terrain", + "id": "refctr_NE4d_z1", + "copy-from": "generic_rc_air" + }, + { + "type": "overmap_terrain", + "id": "refctr_NE5d_z1", + "copy-from": "generic_rc_air" + }, + { + "type": "overmap_terrain", + "id": "refctr_NE1e_z1", + "copy-from": "generic_rc_air" + }, + { + "type": "overmap_terrain", + "id": "refctr_NE2e_z1", + "copy-from": "generic_rc_air" + }, + { + "type": "overmap_terrain", + "id": "refctr_NE3e_z1", + "copy-from": "generic_rc_air" + }, + { + "type": "overmap_terrain", + "id": "refctr_NE4e_z1", + "copy-from": "generic_rc_air" + }, + { + "type": "overmap_terrain", + "id": "refctr_NE5e_z1", + "copy-from": "generic_rc_air" + }, + { + "type": "overmap_terrain", + "id": "refctr_W1a_z1", + "copy-from": "generic_rc_air" + }, + { + "type": "overmap_terrain", + "id": "refctr_W2a_z1", + "copy-from": "generic_rc_air" + }, + { + "type": "overmap_terrain", + "id": "refctr_W3a_z1", + "copy-from": "generic_rc_air" + }, + { + "type": "overmap_terrain", + "id": "refctr_W4a_z1", + "copy-from": "generic_rc_air" + }, + { + "type": "overmap_terrain", + "id": "refctr_W5a_z1", + "copy-from": "generic_rc_air" + }, + { + "type": "overmap_terrain", + "id": "refctr_W1b_z1", + "copy-from": "generic_rc_air" + }, + { + "type": "overmap_terrain", + "id": "refctr_W2b_z1", + "copy-from": "generic_rc_air" + }, + { + "type": "overmap_terrain", + "id": "refctr_W3b_z1", + "copy-from": "generic_rc_air" + }, + { + "type": "overmap_terrain", + "id": "refctr_W4b_z1", + "copy-from": "generic_rc_air" + }, + { + "type": "overmap_terrain", + "id": "refctr_W5b_z1", + "copy-from": "generic_rc_air" + }, + { + "type": "overmap_terrain", + "id": "refctr_W1c_z1", + "copy-from": "generic_rc_air" + }, + { + "type": "overmap_terrain", + "id": "refctr_W2c_z1", + "copy-from": "generic_rc_air" + }, + { + "type": "overmap_terrain", + "id": "refctr_W3c_z1", + "copy-from": "generic_rc_air" + }, + { + "type": "overmap_terrain", + "id": "refctr_W4c_z1", + "copy-from": "generic_rc_air" + }, + { + "type": "overmap_terrain", + "id": "refctr_W5c_z1", + "copy-from": "generic_rc_air" + }, + { + "type": "overmap_terrain", + "id": "refctr_W1d_z1", + "copy-from": "generic_rc_air" + }, + { + "type": "overmap_terrain", + "id": "refctr_W2d_z1", + "copy-from": "generic_rc_air" + }, + { + "type": "overmap_terrain", + "id": "refctr_W3d_z1", + "copy-from": "generic_rc_air" + }, + { + "type": "overmap_terrain", + "id": "refctr_W4d_z1", + "copy-from": "generic_rc_air" + }, + { + "type": "overmap_terrain", + "id": "refctr_W5d_z1", + "copy-from": "generic_rc_air" + }, + { + "type": "overmap_terrain", + "id": "refctr_W1e_z1", + "copy-from": "generic_rc_air" + }, + { + "type": "overmap_terrain", + "id": "refctr_W2e_z1", + "copy-from": "generic_rc_air" + }, + { + "type": "overmap_terrain", + "id": "refctr_W3e_z1", + "copy-from": "generic_rc_air" + }, + { + "type": "overmap_terrain", + "id": "refctr_W4e_z1", + "copy-from": "generic_rc_air" + }, + { + "type": "overmap_terrain", + "id": "refctr_W5e_z1", + "copy-from": "generic_rc_air" + }, + { + "type": "overmap_terrain", + "id": "evac_center_1_z1", + "copy-from": "generic_rc_air" + }, + { + "type": "overmap_terrain", + "id": "evac_center_2_z1", + "copy-from": "generic_rc_air" + }, + { + "type": "overmap_terrain", + "id": "evac_center_3_z1", + "copy-from": "generic_rc_air" + }, + { + "type": "overmap_terrain", + "id": "evac_center_4_z1", + "copy-from": "generic_rc_air" + }, + { + "type": "overmap_terrain", + "id": "evac_center_5_z1", + "copy-from": "generic_rc_air" + }, + { + "type": "overmap_terrain", + "id": "evac_center_6_z1", + "copy-from": "generic_rc_air" + }, + { + "type": "overmap_terrain", + "id": "evac_center_7_z1", + "copy-from": "generic_rc_air" + }, + { + "type": "overmap_terrain", + "id": "evac_center_8_z1", + "copy-from": "generic_rc_air" + }, + { + "type": "overmap_terrain", + "id": "evac_center_9_z1", + "copy-from": "generic_rc_air" + }, + { + "type": "overmap_terrain", + "id": "evac_center_10_z1", + "copy-from": "generic_rc_air" + }, + { + "type": "overmap_terrain", + "id": "evac_center_11_z1", + "copy-from": "generic_rc_air" + }, + { + "type": "overmap_terrain", + "id": "evac_center_12_z1", + "copy-from": "generic_rc_air" + }, + { + "type": "overmap_terrain", + "id": "evac_center_13_z1", + "copy-from": "generic_rc_air" + }, + { + "type": "overmap_terrain", + "id": "evac_center_14_z1", + "copy-from": "generic_rc_air" + }, + { + "type": "overmap_terrain", + "id": "evac_center_15_z1", + "copy-from": "generic_rc_air" + }, + { + "type": "overmap_terrain", + "id": "evac_center_16_z1", + "copy-from": "generic_rc_air" + }, + { + "type": "overmap_terrain", + "id": "evac_center_17_z1", + "copy-from": "generic_rc_air" + }, + { + "type": "overmap_terrain", + "id": "evac_center_18_z1", + "copy-from": "generic_rc_air" + }, + { + "type": "overmap_terrain", + "id": "evac_center_19_z1", + "copy-from": "generic_rc_air" + }, + { + "type": "overmap_terrain", + "id": "evac_center_20_z1", + "copy-from": "generic_rc_air" + }, + { + "type": "overmap_terrain", + "id": "evac_center_21_z1", + "copy-from": "generic_rc_air" + }, + { + "type": "overmap_terrain", + "id": "evac_center_22_z1", + "copy-from": "generic_rc_air" + }, + { + "type": "overmap_terrain", + "id": "evac_center_23_z1", + "copy-from": "generic_rc_air" + }, + { + "type": "overmap_terrain", + "id": "evac_center_24_z1", + "copy-from": "generic_rc_air" + }, + { + "type": "overmap_terrain", + "id": "evac_center_25_z1", + "copy-from": "generic_rc_air" + }, + { + "type": "overmap_terrain", + "id": "refctr_E1a_z1", + "copy-from": "generic_rc_air" + }, + { + "type": "overmap_terrain", + "id": "refctr_E2a_z1", + "copy-from": "generic_rc_air" + }, + { + "type": "overmap_terrain", + "id": "refctr_E3a_z1", + "copy-from": "generic_rc_air" + }, + { + "type": "overmap_terrain", + "id": "refctr_E4a_z1", + "copy-from": "generic_rc_air" + }, + { + "type": "overmap_terrain", + "id": "refctr_E5a_z1", + "copy-from": "generic_rc_air" + }, + { + "type": "overmap_terrain", + "id": "refctr_E1b_z1", + "copy-from": "generic_rc_air" + }, + { + "type": "overmap_terrain", + "id": "refctr_E2b_z1", + "copy-from": "generic_rc_air" + }, + { + "type": "overmap_terrain", + "id": "refctr_E3b_z1", + "copy-from": "generic_rc_air" + }, + { + "type": "overmap_terrain", + "id": "refctr_E4b_z1", + "copy-from": "generic_rc_air" + }, + { + "type": "overmap_terrain", + "id": "refctr_E5b_z1", + "copy-from": "generic_rc_air" + }, + { + "type": "overmap_terrain", + "id": "refctr_E1c_z1", + "copy-from": "generic_rc_air" + }, + { + "type": "overmap_terrain", + "id": "refctr_E2c_z1", + "copy-from": "generic_rc_air" + }, + { + "type": "overmap_terrain", + "id": "refctr_E3c_z1", + "copy-from": "generic_rc_air" + }, + { + "type": "overmap_terrain", + "id": "refctr_E4c_z1", + "copy-from": "generic_rc_air" + }, + { + "type": "overmap_terrain", + "id": "refctr_E5c_z1", + "copy-from": "generic_rc_air" + }, + { + "type": "overmap_terrain", + "id": "refctr_E1d_z1", + "copy-from": "generic_rc_air" + }, + { + "type": "overmap_terrain", + "id": "refctr_E2d_z1", + "copy-from": "generic_rc_air" + }, + { + "type": "overmap_terrain", + "id": "refctr_E3d_z1", + "copy-from": "generic_rc_air" + }, + { + "type": "overmap_terrain", + "id": "refctr_E4d_z1", + "copy-from": "generic_rc_air" + }, + { + "type": "overmap_terrain", + "id": "refctr_E5d_z1", + "copy-from": "generic_rc_air" + }, + { + "type": "overmap_terrain", + "id": "refctr_E1e_z1", + "copy-from": "generic_rc_air" + }, + { + "type": "overmap_terrain", + "id": "refctr_E2e_z1", + "copy-from": "generic_rc_air" + }, + { + "type": "overmap_terrain", + "id": "refctr_E3e_z1", + "copy-from": "generic_rc_air" + }, + { + "type": "overmap_terrain", + "id": "refctr_E4e_z1", + "copy-from": "generic_rc_air" + }, + { + "type": "overmap_terrain", + "id": "refctr_E5e_z1", + "copy-from": "generic_rc_air" + }, + { + "type": "overmap_terrain", + "id": "refctr_SW1a_z1", + "copy-from": "generic_rc_air" + }, + { + "type": "overmap_terrain", + "id": "refctr_SW2a_z1", + "copy-from": "generic_rc_air" + }, + { + "type": "overmap_terrain", + "id": "refctr_SW3a_z1", + "copy-from": "generic_rc_air" + }, + { + "type": "overmap_terrain", + "id": "refctr_SW4a_z1", + "copy-from": "generic_rc_air" + }, + { + "type": "overmap_terrain", + "id": "refctr_SW5a_z1", + "copy-from": "generic_rc_air" + }, + { + "type": "overmap_terrain", + "id": "refctr_SW1b_z1", + "copy-from": "generic_rc_air" + }, + { + "type": "overmap_terrain", + "id": "refctr_SW2b_z1", + "copy-from": "generic_rc_air" + }, + { + "type": "overmap_terrain", + "id": "refctr_SW3b_z1", + "copy-from": "generic_rc_air" + }, + { + "type": "overmap_terrain", + "id": "refctr_SW4b_z1", + "copy-from": "generic_rc_air" + }, + { + "type": "overmap_terrain", + "id": "refctr_SW5b_z1", + "copy-from": "generic_rc_air" + }, + { + "type": "overmap_terrain", + "id": "refctr_SW1c_z1", + "copy-from": "generic_rc_air" + }, + { + "type": "overmap_terrain", + "id": "refctr_SW2c_z1", + "copy-from": "generic_rc_air" + }, + { + "type": "overmap_terrain", + "id": "refctr_SW3c_z1", + "copy-from": "generic_rc_air" + }, + { + "type": "overmap_terrain", + "id": "refctr_SW4c_z1", + "copy-from": "generic_rc_air" + }, + { + "type": "overmap_terrain", + "id": "refctr_SW5c_z1", + "copy-from": "generic_rc_air" + }, + { + "type": "overmap_terrain", + "id": "refctr_SW1d_z1", + "copy-from": "generic_rc_air" + }, + { + "type": "overmap_terrain", + "id": "refctr_SW2d_z1", + "copy-from": "generic_rc_air" + }, + { + "type": "overmap_terrain", + "id": "refctr_SW3d_z1", + "copy-from": "generic_rc_air" + }, + { + "type": "overmap_terrain", + "id": "refctr_SW4d_z1", + "copy-from": "generic_rc_air" + }, + { + "type": "overmap_terrain", + "id": "refctr_SW5d_z1", + "copy-from": "generic_rc_air" + }, + { + "type": "overmap_terrain", + "id": "refctr_SW1e_z1", + "copy-from": "generic_rc_air" + }, + { + "type": "overmap_terrain", + "id": "refctr_SW2e_z1", + "copy-from": "generic_rc_air" + }, + { + "type": "overmap_terrain", + "id": "refctr_SW3e_z1", + "copy-from": "generic_rc_air" + }, + { + "type": "overmap_terrain", + "id": "refctr_SW4e_z1", + "copy-from": "generic_rc_air" + }, + { + "type": "overmap_terrain", + "id": "refctr_SW5e_z1", + "copy-from": "generic_rc_air" + }, + { + "type": "overmap_terrain", + "id": "refctr_S1a_z1", + "copy-from": "generic_rc_air" + }, + { + "type": "overmap_terrain", + "id": "refctr_S2a_z1", + "copy-from": "generic_rc_air" + }, + { + "type": "overmap_terrain", + "id": "refctr_S3a_z1", + "copy-from": "generic_rc_air" + }, + { + "type": "overmap_terrain", + "id": "refctr_S4a_z1", + "copy-from": "generic_rc_air" + }, + { + "type": "overmap_terrain", + "id": "refctr_S5a_z1", + "copy-from": "generic_rc_air" + }, + { + "type": "overmap_terrain", + "id": "refctr_S1b_z1", + "copy-from": "generic_rc_air" + }, + { + "type": "overmap_terrain", + "id": "refctr_S2b_z1", + "copy-from": "generic_rc_air" + }, + { + "type": "overmap_terrain", + "id": "refctr_S3b_z1", + "copy-from": "generic_rc_air" + }, + { + "type": "overmap_terrain", + "id": "refctr_S4b_z1", + "copy-from": "generic_rc_air" + }, + { + "type": "overmap_terrain", + "id": "refctr_S5b_z1", + "copy-from": "generic_rc_air" + }, + { + "type": "overmap_terrain", + "id": "refctr_S1c_z1", + "copy-from": "generic_rc_air" + }, + { + "type": "overmap_terrain", + "id": "refctr_S2c_z1", + "copy-from": "generic_rc_air" + }, + { + "type": "overmap_terrain", + "id": "refctr_S3c_z1", + "copy-from": "generic_rc_air" + }, + { + "type": "overmap_terrain", + "id": "refctr_S4c_z1", + "copy-from": "generic_rc_air" + }, + { + "type": "overmap_terrain", + "id": "refctr_S5c_z1", + "copy-from": "generic_rc_air" + }, + { + "type": "overmap_terrain", + "id": "refctr_S1d_z1", + "copy-from": "generic_rc_air" + }, + { + "type": "overmap_terrain", + "id": "refctr_S2d_z1", + "copy-from": "generic_rc_air" + }, + { + "type": "overmap_terrain", + "id": "refctr_S3d_z1", + "copy-from": "generic_rc_air" + }, + { + "type": "overmap_terrain", + "id": "refctr_S4d_z1", + "copy-from": "generic_rc_air" + }, + { + "type": "overmap_terrain", + "id": "refctr_S5d_z1", + "copy-from": "generic_rc_air" + }, + { + "type": "overmap_terrain", + "id": "refctr_S1e_z1", + "copy-from": "generic_rc_air" + }, + { + "type": "overmap_terrain", + "id": "refctr_S2e_z1", + "copy-from": "generic_rc_air" + }, + { + "type": "overmap_terrain", + "id": "refctr_S3e_z1", + "copy-from": "generic_rc_air" + }, + { + "type": "overmap_terrain", + "id": "refctr_S4e_z1", + "copy-from": "generic_rc_air" + }, + { + "type": "overmap_terrain", + "id": "refctr_S5e_z1", + "copy-from": "generic_rc_air" + }, + { + "type": "overmap_terrain", + "id": "refctr_SE1a_z1", + "copy-from": "generic_rc_air" + }, + { + "type": "overmap_terrain", + "id": "refctr_SE2a_z1", + "copy-from": "generic_rc_air" + }, + { + "type": "overmap_terrain", + "id": "refctr_SE3a_z1", + "copy-from": "generic_rc_air" + }, + { + "type": "overmap_terrain", + "id": "refctr_SE4a_z1", + "copy-from": "generic_rc_air" + }, + { + "type": "overmap_terrain", + "id": "refctr_SE5a_z1", + "copy-from": "generic_rc_air" + }, + { + "type": "overmap_terrain", + "id": "refctr_SE1b_z1", + "copy-from": "generic_rc_air" + }, + { + "type": "overmap_terrain", + "id": "refctr_SE2b_z1", + "copy-from": "generic_rc_air" + }, + { + "type": "overmap_terrain", + "id": "refctr_SE3b_z1", + "copy-from": "generic_rc_air" + }, + { + "type": "overmap_terrain", + "id": "refctr_SE4b_z1", + "copy-from": "generic_rc_air" + }, + { + "type": "overmap_terrain", + "id": "refctr_SE5b_z1", + "copy-from": "generic_rc_air" + }, + { + "type": "overmap_terrain", + "id": "refctr_SE1c_z1", + "copy-from": "generic_rc_air" + }, + { + "type": "overmap_terrain", + "id": "refctr_SE2c_z1", + "copy-from": "generic_rc_air" + }, + { + "type": "overmap_terrain", + "id": "refctr_SE3c_z1", + "copy-from": "generic_rc_air" + }, + { + "type": "overmap_terrain", + "id": "refctr_SE4c_z1", + "copy-from": "generic_rc_air" + }, + { + "type": "overmap_terrain", + "id": "refctr_SE5c_z1", + "copy-from": "generic_rc_air" + }, + { + "type": "overmap_terrain", + "id": "refctr_SE1d_z1", + "copy-from": "generic_rc_air" + }, + { + "type": "overmap_terrain", + "id": "refctr_SE2d_z1", + "copy-from": "generic_rc_air" + }, + { + "type": "overmap_terrain", + "id": "refctr_SE3d_z1", + "copy-from": "generic_rc_air" + }, + { + "type": "overmap_terrain", + "id": "refctr_SE4d_z1", + "copy-from": "generic_rc_air" + }, + { + "type": "overmap_terrain", + "id": "refctr_SE5d_z1", + "copy-from": "generic_rc_air" + }, + { + "type": "overmap_terrain", + "id": "refctr_SE1e_z1", + "copy-from": "generic_rc_air" + }, + { + "type": "overmap_terrain", + "id": "refctr_SE2e_z1", + "copy-from": "generic_rc_air" + }, + { + "type": "overmap_terrain", + "id": "refctr_SE3e_z1", + "copy-from": "generic_rc_air" + }, + { + "type": "overmap_terrain", + "id": "refctr_SE4e_z1", + "copy-from": "generic_rc_air" + }, + { + "type": "overmap_terrain", + "id": "refctr_SE5e_z1", + "copy-from": "generic_rc_air" + }, + { + "type": "overmap_terrain", + "id": "refctr_NW1a_z2", + "copy-from": "generic_rc_air" + }, + { + "type": "overmap_terrain", + "id": "refctr_NW2a_z2", + "copy-from": "generic_rc_air" + }, + { + "type": "overmap_terrain", + "id": "refctr_NW3a_z2", + "copy-from": "generic_rc_air" + }, + { + "type": "overmap_terrain", + "id": "refctr_NW4a_z2", + "copy-from": "generic_rc_air" + }, + { + "type": "overmap_terrain", + "id": "refctr_NW5a_z2", + "copy-from": "generic_rc_air" + }, + { + "type": "overmap_terrain", + "id": "refctr_NW1b_z2", + "copy-from": "generic_rc_air" + }, + { + "type": "overmap_terrain", + "id": "refctr_NW2b_z2", + "copy-from": "generic_rc_air" + }, + { + "type": "overmap_terrain", + "id": "refctr_NW3b_z2", + "copy-from": "generic_rc_air" + }, + { + "type": "overmap_terrain", + "id": "refctr_NW4b_z2", + "copy-from": "generic_rc_air" + }, + { + "type": "overmap_terrain", + "id": "refctr_NW5b_z2", + "copy-from": "generic_rc_air" + }, + { + "type": "overmap_terrain", + "id": "refctr_NW1c_z2", + "copy-from": "generic_rc_air" + }, + { + "type": "overmap_terrain", + "id": "refctr_NW2c_z2", + "copy-from": "generic_rc_air" + }, + { + "type": "overmap_terrain", + "id": "refctr_NW3c_z2", + "copy-from": "generic_rc_air" + }, + { + "type": "overmap_terrain", + "id": "refctr_NW4c_z2", + "copy-from": "generic_rc_air" + }, + { + "type": "overmap_terrain", + "id": "refctr_NW5c_z2", + "copy-from": "generic_rc_air" + }, + { + "type": "overmap_terrain", + "id": "refctr_NW1d_z2", + "copy-from": "generic_rc_air" + }, + { + "type": "overmap_terrain", + "id": "refctr_NW2d_z2", + "copy-from": "generic_rc_air" + }, + { + "type": "overmap_terrain", + "id": "refctr_NW3d_z2", + "copy-from": "generic_rc_air" + }, + { + "type": "overmap_terrain", + "id": "refctr_NW4d_z2", + "copy-from": "generic_rc_air" + }, + { + "type": "overmap_terrain", + "id": "refctr_NW5d_z2", + "copy-from": "generic_rc_air" + }, + { + "type": "overmap_terrain", + "id": "refctr_NW1e_z2", + "copy-from": "generic_rc_air" + }, + { + "type": "overmap_terrain", + "id": "refctr_NW2e_z2", + "copy-from": "generic_rc_air" + }, + { + "type": "overmap_terrain", + "id": "refctr_NW3e_z2", + "copy-from": "generic_rc_air" + }, + { + "type": "overmap_terrain", + "id": "refctr_NW4e_z2", + "copy-from": "generic_rc_air" + }, + { + "type": "overmap_terrain", + "id": "refctr_NW5e_z2", + "copy-from": "generic_rc_air" + }, + { + "type": "overmap_terrain", + "id": "refctr_N1a_z2", + "copy-from": "generic_rc_air" + }, + { + "type": "overmap_terrain", + "id": "refctr_N2a_z2", + "copy-from": "generic_rc_air" + }, + { + "type": "overmap_terrain", + "id": "refctr_N3a_z2", + "copy-from": "generic_rc_air" + }, + { + "type": "overmap_terrain", + "id": "refctr_N4a_z2", + "copy-from": "generic_rc_air" + }, + { + "type": "overmap_terrain", + "id": "refctr_N5a_z2", + "copy-from": "generic_rc_air" + }, + { + "type": "overmap_terrain", + "id": "refctr_N1b_z2", + "copy-from": "generic_rc_air" + }, + { + "type": "overmap_terrain", + "id": "refctr_N2b_z2", + "copy-from": "generic_rc_air" + }, + { + "type": "overmap_terrain", + "id": "refctr_N3b_z2", + "copy-from": "generic_rc_air" + }, + { + "type": "overmap_terrain", + "id": "refctr_N4b_z2", + "copy-from": "generic_rc_air" + }, + { + "type": "overmap_terrain", + "id": "refctr_N5b_z2", + "copy-from": "generic_rc_air" + }, + { + "type": "overmap_terrain", + "id": "refctr_N1c_z2", + "copy-from": "generic_rc_air" + }, + { + "type": "overmap_terrain", + "id": "refctr_N2c_z2", + "copy-from": "generic_rc_air" + }, + { + "type": "overmap_terrain", + "id": "refctr_N3c_z2", + "copy-from": "generic_rc_air" + }, + { + "type": "overmap_terrain", + "id": "refctr_N4c_z2", + "copy-from": "generic_rc_air" + }, + { + "type": "overmap_terrain", + "id": "refctr_N5c_z2", + "copy-from": "generic_rc_air" + }, + { + "type": "overmap_terrain", + "id": "refctr_N1d_z2", + "copy-from": "generic_rc_air" + }, + { + "type": "overmap_terrain", + "id": "refctr_N2d_z2", + "copy-from": "generic_rc_air" + }, + { + "type": "overmap_terrain", + "id": "refctr_N3d_z2", + "copy-from": "generic_rc_air" + }, + { + "type": "overmap_terrain", + "id": "refctr_N4d_z2", + "copy-from": "generic_rc_air" + }, + { + "type": "overmap_terrain", + "id": "refctr_N5d_z2", + "copy-from": "generic_rc_air" + }, + { + "type": "overmap_terrain", + "id": "refctr_N1e_z2", + "copy-from": "generic_rc_air" + }, + { + "type": "overmap_terrain", + "id": "refctr_N2e_z2", + "copy-from": "generic_rc_air" + }, + { + "type": "overmap_terrain", + "id": "refctr_N3e_z2", + "copy-from": "generic_rc_air" + }, + { + "type": "overmap_terrain", + "id": "refctr_N4e_z2", + "copy-from": "generic_rc_air" + }, + { + "type": "overmap_terrain", + "id": "refctr_N5e_z2", + "copy-from": "generic_rc_air" + }, + { + "type": "overmap_terrain", + "id": "refctr_NE1a_z2", + "copy-from": "generic_rc_air" + }, + { + "type": "overmap_terrain", + "id": "refctr_NE2a_z2", + "copy-from": "generic_rc_air" + }, + { + "type": "overmap_terrain", + "id": "refctr_NE3a_z2", + "copy-from": "generic_rc_air" + }, + { + "type": "overmap_terrain", + "id": "refctr_NE4a_z2", + "copy-from": "generic_rc_air" + }, + { + "type": "overmap_terrain", + "id": "refctr_NE5a_z2", + "copy-from": "generic_rc_air" + }, + { + "type": "overmap_terrain", + "id": "refctr_NE1b_z2", + "copy-from": "generic_rc_air" + }, + { + "type": "overmap_terrain", + "id": "refctr_NE2b_z2", + "copy-from": "generic_rc_air" + }, + { + "type": "overmap_terrain", + "id": "refctr_NE3b_z2", + "copy-from": "generic_rc_air" + }, + { + "type": "overmap_terrain", + "id": "refctr_NE4b_z2", + "copy-from": "generic_rc_air" + }, + { + "type": "overmap_terrain", + "id": "refctr_NE5b_z2", + "copy-from": "generic_rc_air" + }, + { + "type": "overmap_terrain", + "id": "refctr_NE1c_z2", + "copy-from": "generic_rc_air" + }, + { + "type": "overmap_terrain", + "id": "refctr_NE2c_z2", + "copy-from": "generic_rc_air" + }, + { + "type": "overmap_terrain", + "id": "refctr_NE3c_z2", + "copy-from": "generic_rc_air" + }, + { + "type": "overmap_terrain", + "id": "refctr_NE4c_z2", + "copy-from": "generic_rc_air" + }, + { + "type": "overmap_terrain", + "id": "refctr_NE5c_z2", + "copy-from": "generic_rc_air" + }, + { + "type": "overmap_terrain", + "id": "refctr_NE1d_z2", + "copy-from": "generic_rc_air" + }, + { + "type": "overmap_terrain", + "id": "refctr_NE2d_z2", + "copy-from": "generic_rc_air" + }, + { + "type": "overmap_terrain", + "id": "refctr_NE3d_z2", + "copy-from": "generic_rc_air" + }, + { + "type": "overmap_terrain", + "id": "refctr_NE4d_z2", + "copy-from": "generic_rc_air" + }, + { + "type": "overmap_terrain", + "id": "refctr_NE5d_z2", + "copy-from": "generic_rc_air" + }, + { + "type": "overmap_terrain", + "id": "refctr_NE1e_z2", + "copy-from": "generic_rc_air" + }, + { + "type": "overmap_terrain", + "id": "refctr_NE2e_z2", + "copy-from": "generic_rc_air" + }, + { + "type": "overmap_terrain", + "id": "refctr_NE3e_z2", + "copy-from": "generic_rc_air" + }, + { + "type": "overmap_terrain", + "id": "refctr_NE4e_z2", + "copy-from": "generic_rc_air" + }, + { + "type": "overmap_terrain", + "id": "refctr_NE5e_z2", + "copy-from": "generic_rc_air" + }, + { + "type": "overmap_terrain", + "id": "refctr_W1a_z2", + "copy-from": "generic_rc_air" + }, + { + "type": "overmap_terrain", + "id": "refctr_W2a_z2", + "copy-from": "generic_rc_air" + }, + { + "type": "overmap_terrain", + "id": "refctr_W3a_z2", + "copy-from": "generic_rc_air" + }, + { + "type": "overmap_terrain", + "id": "refctr_W4a_z2", + "copy-from": "generic_rc_air" + }, + { + "type": "overmap_terrain", + "id": "refctr_W5a_z2", + "copy-from": "generic_rc_air" + }, + { + "type": "overmap_terrain", + "id": "refctr_W1b_z2", + "copy-from": "generic_rc_air" + }, + { + "type": "overmap_terrain", + "id": "refctr_W2b_z2", + "copy-from": "generic_rc_air" + }, + { + "type": "overmap_terrain", + "id": "refctr_W3b_z2", + "copy-from": "generic_rc_air" + }, + { + "type": "overmap_terrain", + "id": "refctr_W4b_z2", + "copy-from": "generic_rc_air" + }, + { + "type": "overmap_terrain", + "id": "refctr_W5b_z2", + "copy-from": "generic_rc_air" + }, + { + "type": "overmap_terrain", + "id": "refctr_W1c_z2", + "copy-from": "generic_rc_air" + }, + { + "type": "overmap_terrain", + "id": "refctr_W2c_z2", + "copy-from": "generic_rc_air" + }, + { + "type": "overmap_terrain", + "id": "refctr_W3c_z2", + "copy-from": "generic_rc_air" + }, + { + "type": "overmap_terrain", + "id": "refctr_W4c_z2", + "copy-from": "generic_rc_air" + }, + { + "type": "overmap_terrain", + "id": "refctr_W5c_z2", + "copy-from": "generic_rc_air" + }, + { + "type": "overmap_terrain", + "id": "refctr_W1d_z2", + "copy-from": "generic_rc_air" + }, + { + "type": "overmap_terrain", + "id": "refctr_W2d_z2", + "copy-from": "generic_rc_air" + }, + { + "type": "overmap_terrain", + "id": "refctr_W3d_z2", + "copy-from": "generic_rc_air" + }, + { + "type": "overmap_terrain", + "id": "refctr_W4d_z2", + "copy-from": "generic_rc_air" + }, + { + "type": "overmap_terrain", + "id": "refctr_W5d_z2", + "copy-from": "generic_rc_air" + }, + { + "type": "overmap_terrain", + "id": "refctr_W1e_z2", + "copy-from": "generic_rc_air" + }, + { + "type": "overmap_terrain", + "id": "refctr_W2e_z2", + "copy-from": "generic_rc_air" + }, + { + "type": "overmap_terrain", + "id": "refctr_W3e_z2", + "copy-from": "generic_rc_air" + }, + { + "type": "overmap_terrain", + "id": "refctr_W4e_z2", + "copy-from": "generic_rc_air" + }, + { + "type": "overmap_terrain", + "id": "refctr_W5e_z2", + "copy-from": "generic_rc_air" + }, + { + "type": "overmap_terrain", + "id": "evac_center_1_z2", + "copy-from": "generic_rc_air" + }, + { + "type": "overmap_terrain", + "id": "evac_center_2_z2", + "copy-from": "generic_rc_air" + }, + { + "type": "overmap_terrain", + "id": "evac_center_3_z2", + "copy-from": "generic_rc_air" + }, + { + "type": "overmap_terrain", + "id": "evac_center_4_z2", + "copy-from": "generic_rc_air" + }, + { + "type": "overmap_terrain", + "id": "evac_center_5_z2", + "copy-from": "generic_rc_air" + }, + { + "type": "overmap_terrain", + "id": "evac_center_6_z2", + "copy-from": "generic_rc_air" + }, + { + "type": "overmap_terrain", + "id": "evac_center_7_z2", + "copy-from": "generic_rc_air" + }, + { + "type": "overmap_terrain", + "id": "evac_center_8_z2", + "copy-from": "generic_rc_air" + }, + { + "type": "overmap_terrain", + "id": "evac_center_9_z2", + "copy-from": "generic_rc_air" + }, + { + "type": "overmap_terrain", + "id": "evac_center_10_z2", + "copy-from": "generic_rc_air" + }, + { + "type": "overmap_terrain", + "id": "evac_center_11_z2", + "copy-from": "generic_rc_air" + }, + { + "type": "overmap_terrain", + "id": "evac_center_12_z2", + "copy-from": "generic_rc_air" + }, + { + "type": "overmap_terrain", + "id": "evac_center_13_z2", + "copy-from": "generic_rc_air" + }, + { + "type": "overmap_terrain", + "id": "evac_center_14_z2", + "copy-from": "generic_rc_air" + }, + { + "type": "overmap_terrain", + "id": "evac_center_15_z2", + "copy-from": "generic_rc_air" + }, + { + "type": "overmap_terrain", + "id": "evac_center_16_z2", + "copy-from": "generic_rc_air" + }, + { + "type": "overmap_terrain", + "id": "evac_center_17_z2", + "copy-from": "generic_rc_air" + }, + { + "type": "overmap_terrain", + "id": "evac_center_18_z2", + "copy-from": "generic_rc_air" + }, + { + "type": "overmap_terrain", + "id": "evac_center_19_z2", + "copy-from": "generic_rc_air" + }, + { + "type": "overmap_terrain", + "id": "evac_center_20_z2", + "copy-from": "generic_rc_air" + }, + { + "type": "overmap_terrain", + "id": "evac_center_21_z2", + "copy-from": "generic_rc_air" + }, + { + "type": "overmap_terrain", + "id": "evac_center_22_z2", + "copy-from": "generic_rc_air" + }, + { + "type": "overmap_terrain", + "id": "evac_center_23_z2", + "copy-from": "generic_rc_air" + }, + { + "type": "overmap_terrain", + "id": "evac_center_24_z2", + "copy-from": "generic_rc_air" + }, + { + "type": "overmap_terrain", + "id": "evac_center_25_z2", + "copy-from": "generic_rc_air" + }, + { + "type": "overmap_terrain", + "id": "refctr_E1a_z2", + "copy-from": "generic_rc_air" + }, + { + "type": "overmap_terrain", + "id": "refctr_E2a_z2", + "copy-from": "generic_rc_air" + }, + { + "type": "overmap_terrain", + "id": "refctr_E3a_z2", + "copy-from": "generic_rc_air" + }, + { + "type": "overmap_terrain", + "id": "refctr_E4a_z2", + "copy-from": "generic_rc_air" + }, + { + "type": "overmap_terrain", + "id": "refctr_E5a_z2", + "copy-from": "generic_rc_air" + }, + { + "type": "overmap_terrain", + "id": "refctr_E1b_z2", + "copy-from": "generic_rc_air" + }, + { + "type": "overmap_terrain", + "id": "refctr_E2b_z2", + "copy-from": "generic_rc_air" + }, + { + "type": "overmap_terrain", + "id": "refctr_E3b_z2", + "copy-from": "generic_rc_air" + }, + { + "type": "overmap_terrain", + "id": "refctr_E4b_z2", + "copy-from": "generic_rc_air" + }, + { + "type": "overmap_terrain", + "id": "refctr_E5b_z2", + "copy-from": "generic_rc_air" + }, + { + "type": "overmap_terrain", + "id": "refctr_E1c_z2", + "copy-from": "generic_rc_air" + }, + { + "type": "overmap_terrain", + "id": "refctr_E2c_z2", + "copy-from": "generic_rc_air" + }, + { + "type": "overmap_terrain", + "id": "refctr_E3c_z2", + "copy-from": "generic_rc_air" + }, + { + "type": "overmap_terrain", + "id": "refctr_E4c_z2", + "copy-from": "generic_rc_air" + }, + { + "type": "overmap_terrain", + "id": "refctr_E5c_z2", + "copy-from": "generic_rc_air" + }, + { + "type": "overmap_terrain", + "id": "refctr_E1d_z2", + "copy-from": "generic_rc_air" + }, + { + "type": "overmap_terrain", + "id": "refctr_E2d_z2", + "copy-from": "generic_rc_air" + }, + { + "type": "overmap_terrain", + "id": "refctr_E3d_z2", + "copy-from": "generic_rc_air" + }, + { + "type": "overmap_terrain", + "id": "refctr_E4d_z2", + "copy-from": "generic_rc_air" + }, + { + "type": "overmap_terrain", + "id": "refctr_E5d_z2", + "copy-from": "generic_rc_air" + }, + { + "type": "overmap_terrain", + "id": "refctr_E1e_z2", + "copy-from": "generic_rc_air" + }, + { + "type": "overmap_terrain", + "id": "refctr_E2e_z2", + "copy-from": "generic_rc_air" + }, + { + "type": "overmap_terrain", + "id": "refctr_E3e_z2", + "copy-from": "generic_rc_air" + }, + { + "type": "overmap_terrain", + "id": "refctr_E4e_z2", + "copy-from": "generic_rc_air" + }, + { + "type": "overmap_terrain", + "id": "refctr_E5e_z2", + "copy-from": "generic_rc_air" + }, + { + "type": "overmap_terrain", + "id": "refctr_SW1a_z2", + "copy-from": "generic_rc_air" + }, + { + "type": "overmap_terrain", + "id": "refctr_SW2a_z2", + "copy-from": "generic_rc_air" + }, + { + "type": "overmap_terrain", + "id": "refctr_SW3a_z2", + "copy-from": "generic_rc_air" + }, + { + "type": "overmap_terrain", + "id": "refctr_SW4a_z2", + "copy-from": "generic_rc_air" + }, + { + "type": "overmap_terrain", + "id": "refctr_SW5a_z2", + "copy-from": "generic_rc_air" + }, + { + "type": "overmap_terrain", + "id": "refctr_SW1b_z2", + "copy-from": "generic_rc_air" + }, + { + "type": "overmap_terrain", + "id": "refctr_SW2b_z2", + "copy-from": "generic_rc_air" + }, + { + "type": "overmap_terrain", + "id": "refctr_SW3b_z2", + "copy-from": "generic_rc_air" + }, + { + "type": "overmap_terrain", + "id": "refctr_SW4b_z2", + "copy-from": "generic_rc_air" + }, + { + "type": "overmap_terrain", + "id": "refctr_SW5b_z2", + "copy-from": "generic_rc_air" + }, + { + "type": "overmap_terrain", + "id": "refctr_SW1c_z2", + "copy-from": "generic_rc_air" + }, + { + "type": "overmap_terrain", + "id": "refctr_SW2c_z2", + "copy-from": "generic_rc_air" + }, + { + "type": "overmap_terrain", + "id": "refctr_SW3c_z2", + "copy-from": "generic_rc_air" + }, + { + "type": "overmap_terrain", + "id": "refctr_SW4c_z2", + "copy-from": "generic_rc_air" + }, + { + "type": "overmap_terrain", + "id": "refctr_SW5c_z2", + "copy-from": "generic_rc_air" + }, + { + "type": "overmap_terrain", + "id": "refctr_SW1d_z2", + "copy-from": "generic_rc_air" + }, + { + "type": "overmap_terrain", + "id": "refctr_SW2d_z2", + "copy-from": "generic_rc_air" + }, + { + "type": "overmap_terrain", + "id": "refctr_SW3d_z2", + "copy-from": "generic_rc_air" + }, + { + "type": "overmap_terrain", + "id": "refctr_SW4d_z2", + "copy-from": "generic_rc_air" + }, + { + "type": "overmap_terrain", + "id": "refctr_SW5d_z2", + "copy-from": "generic_rc_air" + }, + { + "type": "overmap_terrain", + "id": "refctr_SW1e_z2", + "copy-from": "generic_rc_air" + }, + { + "type": "overmap_terrain", + "id": "refctr_SW2e_z2", + "copy-from": "generic_rc_air" + }, + { + "type": "overmap_terrain", + "id": "refctr_SW3e_z2", + "copy-from": "generic_rc_air" + }, + { + "type": "overmap_terrain", + "id": "refctr_SW4e_z2", + "copy-from": "generic_rc_air" + }, + { + "type": "overmap_terrain", + "id": "refctr_SW5e_z2", + "copy-from": "generic_rc_air" + }, + { + "type": "overmap_terrain", + "id": "refctr_S1a_z2", + "copy-from": "generic_rc_air" + }, + { + "type": "overmap_terrain", + "id": "refctr_S2a_z2", + "copy-from": "generic_rc_air" + }, + { + "type": "overmap_terrain", + "id": "refctr_S3a_z2", + "copy-from": "generic_rc_air" + }, + { + "type": "overmap_terrain", + "id": "refctr_S4a_z2", + "copy-from": "generic_rc_air" + }, + { + "type": "overmap_terrain", + "id": "refctr_S5a_z2", + "copy-from": "generic_rc_air" + }, + { + "type": "overmap_terrain", + "id": "refctr_S1b_z2", + "copy-from": "generic_rc_air" + }, + { + "type": "overmap_terrain", + "id": "refctr_S2b_z2", + "copy-from": "generic_rc_air" + }, + { + "type": "overmap_terrain", + "id": "refctr_S3b_z2", + "copy-from": "generic_rc_air" + }, + { + "type": "overmap_terrain", + "id": "refctr_S4b_z2", + "copy-from": "generic_rc_air" + }, + { + "type": "overmap_terrain", + "id": "refctr_S5b_z2", + "copy-from": "generic_rc_air" + }, + { + "type": "overmap_terrain", + "id": "refctr_S1c_z2", + "copy-from": "generic_rc_air" + }, + { + "type": "overmap_terrain", + "id": "refctr_S2c_z2", + "copy-from": "generic_rc_air" + }, + { + "type": "overmap_terrain", + "id": "refctr_S3c_z2", + "copy-from": "generic_rc_air" + }, + { + "type": "overmap_terrain", + "id": "refctr_S4c_z2", + "copy-from": "generic_rc_air" + }, + { + "type": "overmap_terrain", + "id": "refctr_S5c_z2", + "copy-from": "generic_rc_air" + }, + { + "type": "overmap_terrain", + "id": "refctr_S1d_z2", + "copy-from": "generic_rc_air" + }, + { + "type": "overmap_terrain", + "id": "refctr_S2d_z2", + "copy-from": "generic_rc_air" + }, + { + "type": "overmap_terrain", + "id": "refctr_S3d_z2", + "copy-from": "generic_rc_air" + }, + { + "type": "overmap_terrain", + "id": "refctr_S4d_z2", + "copy-from": "generic_rc_air" + }, + { + "type": "overmap_terrain", + "id": "refctr_S5d_z2", + "copy-from": "generic_rc_air" + }, + { + "type": "overmap_terrain", + "id": "refctr_S1e_z2", + "copy-from": "generic_rc_air" + }, + { + "type": "overmap_terrain", + "id": "refctr_S2e_z2", + "copy-from": "generic_rc_air" + }, + { + "type": "overmap_terrain", + "id": "refctr_S3e_z2", + "copy-from": "generic_rc_air" + }, + { + "type": "overmap_terrain", + "id": "refctr_S4e_z2", + "copy-from": "generic_rc_air" + }, + { + "type": "overmap_terrain", + "id": "refctr_S5e_z2", + "copy-from": "generic_rc_air" + }, + { + "type": "overmap_terrain", + "id": "refctr_SE1a_z2", + "copy-from": "generic_rc_air" + }, + { + "type": "overmap_terrain", + "id": "refctr_SE2a_z2", + "copy-from": "generic_rc_air" + }, + { + "type": "overmap_terrain", + "id": "refctr_SE3a_z2", + "copy-from": "generic_rc_air" + }, + { + "type": "overmap_terrain", + "id": "refctr_SE4a_z2", + "copy-from": "generic_rc_air" + }, + { + "type": "overmap_terrain", + "id": "refctr_SE5a_z2", + "copy-from": "generic_rc_air" + }, + { + "type": "overmap_terrain", + "id": "refctr_SE1b_z2", + "copy-from": "generic_rc_air" + }, + { + "type": "overmap_terrain", + "id": "refctr_SE2b_z2", + "copy-from": "generic_rc_air" + }, + { + "type": "overmap_terrain", + "id": "refctr_SE3b_z2", + "copy-from": "generic_rc_air" + }, + { + "type": "overmap_terrain", + "id": "refctr_SE4b_z2", + "copy-from": "generic_rc_air" + }, + { + "type": "overmap_terrain", + "id": "refctr_SE5b_z2", + "copy-from": "generic_rc_air" + }, + { + "type": "overmap_terrain", + "id": "refctr_SE1c_z2", + "copy-from": "generic_rc_air" + }, + { + "type": "overmap_terrain", + "id": "refctr_SE2c_z2", + "copy-from": "generic_rc_air" + }, + { + "type": "overmap_terrain", + "id": "refctr_SE3c_z2", + "copy-from": "generic_rc_air" + }, + { + "type": "overmap_terrain", + "id": "refctr_SE4c_z2", + "copy-from": "generic_rc_air" + }, + { + "type": "overmap_terrain", + "id": "refctr_SE5c_z2", + "copy-from": "generic_rc_air" + }, + { + "type": "overmap_terrain", + "id": "refctr_SE1d_z2", + "copy-from": "generic_rc_air" + }, + { + "type": "overmap_terrain", + "id": "refctr_SE2d_z2", + "copy-from": "generic_rc_air" + }, + { + "type": "overmap_terrain", + "id": "refctr_SE3d_z2", + "copy-from": "generic_rc_air" + }, + { + "type": "overmap_terrain", + "id": "refctr_SE4d_z2", + "copy-from": "generic_rc_air" + }, + { + "type": "overmap_terrain", + "id": "refctr_SE5d_z2", + "copy-from": "generic_rc_air" + }, + { + "type": "overmap_terrain", + "id": "refctr_SE1e_z2", + "copy-from": "generic_rc_air" + }, + { + "type": "overmap_terrain", + "id": "refctr_SE2e_z2", + "copy-from": "generic_rc_air" + }, + { + "type": "overmap_terrain", + "id": "refctr_SE3e_z2", + "copy-from": "generic_rc_air" + }, + { + "type": "overmap_terrain", + "id": "refctr_SE4e_z2", + "copy-from": "generic_rc_air" + }, + { + "type": "overmap_terrain", + "id": "refctr_SE5e_z2", + "copy-from": "generic_rc_air" + }, + { + "type": "overmap_terrain", + "abstract": "generic_rc_underground", + "name": "solid rock", + "sym": "%", + "color": "dark_gray", + "see_cost": 5 + }, + { + "type": "overmap_terrain", + "id": "refctr_NW1a_z-1", + "copy-from": "generic_rc_underground" + }, + { + "type": "overmap_terrain", + "id": "refctr_NW2a_z-1", + "copy-from": "generic_rc_underground" + }, + { + "type": "overmap_terrain", + "id": "refctr_NW3a_z-1", + "copy-from": "generic_rc_underground" + }, + { + "type": "overmap_terrain", + "id": "refctr_NW4a_z-1", + "copy-from": "generic_rc_underground" + }, + { + "type": "overmap_terrain", + "id": "refctr_NW5a_z-1", + "copy-from": "generic_rc_underground" + }, + { + "type": "overmap_terrain", + "id": "refctr_NW1b_z-1", + "copy-from": "generic_rc_underground" + }, + { + "type": "overmap_terrain", + "id": "refctr_NW2b_z-1", + "copy-from": "generic_rc_underground" + }, + { + "type": "overmap_terrain", + "id": "refctr_NW3b_z-1", + "copy-from": "generic_rc_underground" + }, + { + "type": "overmap_terrain", + "id": "refctr_NW4b_z-1", + "copy-from": "generic_rc_underground" + }, + { + "type": "overmap_terrain", + "id": "refctr_NW5b_z-1", + "copy-from": "generic_rc_underground" + }, + { + "type": "overmap_terrain", + "id": "refctr_NW1c_z-1", + "copy-from": "generic_rc_underground" + }, + { + "type": "overmap_terrain", + "id": "refctr_NW2c_z-1", + "copy-from": "generic_rc_underground" + }, + { + "type": "overmap_terrain", + "id": "refctr_NW3c_z-1", + "copy-from": "generic_rc_underground" + }, + { + "type": "overmap_terrain", + "id": "refctr_NW4c_z-1", + "copy-from": "generic_rc_underground" + }, + { + "type": "overmap_terrain", + "id": "refctr_NW5c_z-1", + "copy-from": "generic_rc_underground" + }, + { + "type": "overmap_terrain", + "id": "refctr_NW1d_z-1", + "copy-from": "generic_rc_underground" + }, + { + "type": "overmap_terrain", + "id": "refctr_NW2d_z-1", + "copy-from": "generic_rc_underground" + }, + { + "type": "overmap_terrain", + "id": "refctr_NW3d_z-1", + "copy-from": "generic_rc_underground" + }, + { + "type": "overmap_terrain", + "id": "refctr_NW4d_z-1", + "copy-from": "generic_rc_underground" + }, + { + "type": "overmap_terrain", + "id": "refctr_NW5d_z-1", + "copy-from": "generic_rc_underground" + }, + { + "type": "overmap_terrain", + "id": "refctr_NW1e_z-1", + "copy-from": "generic_rc_underground" + }, + { + "type": "overmap_terrain", + "id": "refctr_NW2e_z-1", + "copy-from": "generic_rc_underground" + }, + { + "type": "overmap_terrain", + "id": "refctr_NW3e_z-1", + "copy-from": "generic_rc_underground" + }, + { + "type": "overmap_terrain", + "id": "refctr_NW4e_z-1", + "copy-from": "generic_rc_underground" + }, + { + "type": "overmap_terrain", + "id": "refctr_NW5e_z-1", + "copy-from": "generic_rc_underground" + }, + { + "type": "overmap_terrain", + "id": "refctr_N1a_z-1", + "copy-from": "generic_rc_underground" + }, + { + "type": "overmap_terrain", + "id": "refctr_N2a_z-1", + "copy-from": "generic_rc_underground" + }, + { + "type": "overmap_terrain", + "id": "refctr_N3a_z-1", + "copy-from": "generic_rc_underground" + }, + { + "type": "overmap_terrain", + "id": "refctr_N4a_z-1", + "copy-from": "generic_rc_underground" + }, + { + "type": "overmap_terrain", + "id": "refctr_N5a_z-1", + "copy-from": "generic_rc_underground" + }, + { + "type": "overmap_terrain", + "id": "refctr_N1b_z-1", + "copy-from": "generic_rc_underground" + }, + { + "type": "overmap_terrain", + "id": "refctr_N2b_z-1", + "copy-from": "generic_rc_underground" + }, + { + "type": "overmap_terrain", + "id": "refctr_N3b_z-1", + "copy-from": "generic_rc_underground" + }, + { + "type": "overmap_terrain", + "id": "refctr_N4b_z-1", + "copy-from": "generic_rc_underground" + }, + { + "type": "overmap_terrain", + "id": "refctr_N5b_z-1", + "copy-from": "generic_rc_underground" + }, + { + "type": "overmap_terrain", + "id": "refctr_N1c_z-1", + "copy-from": "generic_rc_underground" + }, + { + "type": "overmap_terrain", + "id": "refctr_N2c_z-1", + "copy-from": "generic_rc_underground" + }, + { + "type": "overmap_terrain", + "id": "refctr_N3c_z-1", + "copy-from": "generic_rc_underground" + }, + { + "type": "overmap_terrain", + "id": "refctr_N4c_z-1", + "copy-from": "generic_rc_underground" + }, + { + "type": "overmap_terrain", + "id": "refctr_N5c_z-1", + "copy-from": "generic_rc_underground" + }, + { + "type": "overmap_terrain", + "id": "refctr_N1d_z-1", + "copy-from": "generic_rc_underground" + }, + { + "type": "overmap_terrain", + "id": "refctr_N2d_z-1", + "copy-from": "generic_rc_underground" + }, + { + "type": "overmap_terrain", + "id": "refctr_N3d_z-1", + "copy-from": "generic_rc_underground" + }, + { + "type": "overmap_terrain", + "id": "refctr_N4d_z-1", + "copy-from": "generic_rc_underground" + }, + { + "type": "overmap_terrain", + "id": "refctr_N5d_z-1", + "copy-from": "generic_rc_underground" + }, + { + "type": "overmap_terrain", + "id": "refctr_N1e_z-1", + "copy-from": "generic_rc_underground" + }, + { + "type": "overmap_terrain", + "id": "refctr_N2e_z-1", + "copy-from": "generic_rc_underground" + }, + { + "type": "overmap_terrain", + "id": "refctr_N3e_z-1", + "copy-from": "generic_rc_underground" + }, + { + "type": "overmap_terrain", + "id": "refctr_N4e_z-1", + "copy-from": "generic_rc_underground" + }, + { + "type": "overmap_terrain", + "id": "refctr_N5e_z-1", + "copy-from": "generic_rc_underground" + }, + { + "type": "overmap_terrain", + "id": "refctr_NE1a_z-1", + "copy-from": "generic_rc_underground" + }, + { + "type": "overmap_terrain", + "id": "refctr_NE2a_z-1", + "copy-from": "generic_rc_underground" + }, + { + "type": "overmap_terrain", + "id": "refctr_NE3a_z-1", + "copy-from": "generic_rc_underground" + }, + { + "type": "overmap_terrain", + "id": "refctr_NE4a_z-1", + "copy-from": "generic_rc_underground" + }, + { + "type": "overmap_terrain", + "id": "refctr_NE5a_z-1", + "copy-from": "generic_rc_underground" + }, + { + "type": "overmap_terrain", + "id": "refctr_NE1b_z-1", + "copy-from": "generic_rc_underground" + }, + { + "type": "overmap_terrain", + "id": "refctr_NE2b_z-1", + "copy-from": "generic_rc_underground" + }, + { + "type": "overmap_terrain", + "id": "refctr_NE3b_z-1", + "copy-from": "generic_rc_underground" + }, + { + "type": "overmap_terrain", + "id": "refctr_NE4b_z-1", + "copy-from": "generic_rc_underground" + }, + { + "type": "overmap_terrain", + "id": "refctr_NE5b_z-1", + "copy-from": "generic_rc_underground" + }, + { + "type": "overmap_terrain", + "id": "refctr_NE1c_z-1", + "copy-from": "generic_rc_underground" + }, + { + "type": "overmap_terrain", + "id": "refctr_NE2c_z-1", + "copy-from": "generic_rc_underground" + }, + { + "type": "overmap_terrain", + "id": "refctr_NE3c_z-1", + "copy-from": "generic_rc_underground" + }, + { + "type": "overmap_terrain", + "id": "refctr_NE4c_z-1", + "copy-from": "generic_rc_underground" + }, + { + "type": "overmap_terrain", + "id": "refctr_NE5c_z-1", + "copy-from": "generic_rc_underground" + }, + { + "type": "overmap_terrain", + "id": "refctr_NE1d_z-1", + "copy-from": "generic_rc_underground" + }, + { + "type": "overmap_terrain", + "id": "refctr_NE2d_z-1", + "copy-from": "generic_rc_underground" + }, + { + "type": "overmap_terrain", + "id": "refctr_NE3d_z-1", + "copy-from": "generic_rc_underground" + }, + { + "type": "overmap_terrain", + "id": "refctr_NE4d_z-1", + "copy-from": "generic_rc_underground" + }, + { + "type": "overmap_terrain", + "id": "refctr_NE5d_z-1", + "copy-from": "generic_rc_underground" + }, + { + "type": "overmap_terrain", + "id": "refctr_NE1e_z-1", + "copy-from": "generic_rc_underground" + }, + { + "type": "overmap_terrain", + "id": "refctr_NE2e_z-1", + "copy-from": "generic_rc_underground" + }, + { + "type": "overmap_terrain", + "id": "refctr_NE3e_z-1", + "copy-from": "generic_rc_underground" + }, + { + "type": "overmap_terrain", + "id": "refctr_NE4e_z-1", + "copy-from": "generic_rc_underground" + }, + { + "type": "overmap_terrain", + "id": "refctr_NE5e_z-1", + "copy-from": "generic_rc_underground" + }, + { + "type": "overmap_terrain", + "id": "refctr_W1a_z-1", + "copy-from": "generic_rc_underground" + }, + { + "type": "overmap_terrain", + "id": "refctr_W2a_z-1", + "copy-from": "generic_rc_underground" + }, + { + "type": "overmap_terrain", + "id": "refctr_W3a_z-1", + "copy-from": "generic_rc_underground" + }, + { + "type": "overmap_terrain", + "id": "refctr_W4a_z-1", + "copy-from": "generic_rc_underground" + }, + { + "type": "overmap_terrain", + "id": "refctr_W5a_z-1", + "copy-from": "generic_rc_underground" + }, + { + "type": "overmap_terrain", + "id": "refctr_W1b_z-1", + "copy-from": "generic_rc_underground" + }, + { + "type": "overmap_terrain", + "id": "refctr_W2b_z-1", + "copy-from": "generic_rc_underground" + }, + { + "type": "overmap_terrain", + "id": "refctr_W3b_z-1", + "copy-from": "generic_rc_underground" + }, + { + "type": "overmap_terrain", + "id": "refctr_W4b_z-1", + "copy-from": "generic_rc_underground" + }, + { + "type": "overmap_terrain", + "id": "refctr_W5b_z-1", + "copy-from": "generic_rc_underground" + }, + { + "type": "overmap_terrain", + "id": "refctr_W1c_z-1", + "copy-from": "generic_rc_underground" + }, + { + "type": "overmap_terrain", + "id": "refctr_W2c_z-1", + "copy-from": "generic_rc_underground" + }, + { + "type": "overmap_terrain", + "id": "refctr_W3c_z-1", + "copy-from": "generic_rc_underground" + }, + { + "type": "overmap_terrain", + "id": "refctr_W4c_z-1", + "copy-from": "generic_rc_underground" + }, + { + "type": "overmap_terrain", + "id": "refctr_W5c_z-1", + "copy-from": "generic_rc_underground" + }, + { + "type": "overmap_terrain", + "id": "refctr_W1d_z-1", + "copy-from": "generic_rc_underground" + }, + { + "type": "overmap_terrain", + "id": "refctr_W2d_z-1", + "copy-from": "generic_rc_underground" + }, + { + "type": "overmap_terrain", + "id": "refctr_W3d_z-1", + "copy-from": "generic_rc_underground" + }, + { + "type": "overmap_terrain", + "id": "refctr_W4d_z-1", + "copy-from": "generic_rc_underground" + }, + { + "type": "overmap_terrain", + "id": "refctr_W5d_z-1", + "copy-from": "generic_rc_underground" + }, + { + "type": "overmap_terrain", + "id": "refctr_W1e_z-1", + "copy-from": "generic_rc_underground" + }, + { + "type": "overmap_terrain", + "id": "refctr_W2e_z-1", + "copy-from": "generic_rc_underground" + }, + { + "type": "overmap_terrain", + "id": "refctr_W3e_z-1", + "copy-from": "generic_rc_underground" + }, + { + "type": "overmap_terrain", + "id": "refctr_W4e_z-1", + "copy-from": "generic_rc_underground" + }, + { + "type": "overmap_terrain", + "id": "refctr_W5e_z-1", + "copy-from": "generic_rc_underground" + }, + { + "type": "overmap_terrain", + "id": "evac_center_1_z-1", + "copy-from": "generic_rc_underground" + }, + { + "type": "overmap_terrain", + "id": "evac_center_2_z-1", + "copy-from": "generic_rc_underground" + }, + { + "type": "overmap_terrain", + "id": "evac_center_3_z-1", + "copy-from": "generic_rc_underground" + }, + { + "type": "overmap_terrain", + "id": "evac_center_4_z-1", + "copy-from": "generic_rc_underground" + }, + { + "type": "overmap_terrain", + "id": "evac_center_5_z-1", + "copy-from": "generic_rc_underground" + }, + { + "type": "overmap_terrain", + "id": "evac_center_6_z-1", + "copy-from": "generic_rc_underground" + }, + { + "type": "overmap_terrain", + "id": "evac_center_7_z-1", + "copy-from": "generic_rc_underground" + }, + { + "type": "overmap_terrain", + "id": "evac_center_8_z-1", + "copy-from": "generic_rc_underground" + }, + { + "type": "overmap_terrain", + "id": "evac_center_9_z-1", + "copy-from": "generic_rc_underground" + }, + { + "type": "overmap_terrain", + "id": "evac_center_10_z-1", + "copy-from": "generic_rc_underground" + }, + { + "type": "overmap_terrain", + "id": "evac_center_11_z-1", + "copy-from": "generic_rc_underground" + }, + { + "type": "overmap_terrain", + "id": "evac_center_12_z-1", + "copy-from": "generic_rc_underground" + }, + { + "type": "overmap_terrain", + "id": "evac_center_13_z-1", + "copy-from": "generic_rc_underground" + }, + { + "type": "overmap_terrain", + "id": "evac_center_14_z-1", + "copy-from": "generic_rc_underground" + }, + { + "type": "overmap_terrain", + "id": "evac_center_15_z-1", + "copy-from": "generic_rc_underground" + }, + { + "type": "overmap_terrain", + "id": "evac_center_16_z-1", + "copy-from": "generic_rc_underground" + }, + { + "type": "overmap_terrain", + "id": "evac_center_17_z-1", + "copy-from": "generic_rc_underground" + }, + { + "type": "overmap_terrain", + "id": "evac_center_18_z-1", + "copy-from": "generic_rc_underground" + }, + { + "type": "overmap_terrain", + "id": "evac_center_19_z-1", + "copy-from": "generic_rc_underground" + }, + { + "type": "overmap_terrain", + "id": "evac_center_20_z-1", + "copy-from": "generic_rc_underground" + }, + { + "type": "overmap_terrain", + "id": "evac_center_21_z-1", + "copy-from": "generic_rc_underground" + }, + { + "type": "overmap_terrain", + "id": "evac_center_22_z-1", + "copy-from": "generic_rc_underground" + }, + { + "type": "overmap_terrain", + "id": "evac_center_23_z-1", + "copy-from": "generic_rc_underground" + }, + { + "type": "overmap_terrain", + "id": "evac_center_24_z-1", + "copy-from": "generic_rc_underground" + }, + { + "type": "overmap_terrain", + "id": "evac_center_25_z-1", + "copy-from": "generic_rc_underground" + }, + { + "type": "overmap_terrain", + "id": "refctr_E1a_z-1", + "copy-from": "generic_rc_underground" + }, + { + "type": "overmap_terrain", + "id": "refctr_E2a_z-1", + "copy-from": "generic_rc_underground" + }, + { + "type": "overmap_terrain", + "id": "refctr_E3a_z-1", + "copy-from": "generic_rc_underground" + }, + { + "type": "overmap_terrain", + "id": "refctr_E4a_z-1", + "copy-from": "generic_rc_underground" + }, + { + "type": "overmap_terrain", + "id": "refctr_E5a_z-1", + "copy-from": "generic_rc_underground" + }, + { + "type": "overmap_terrain", + "id": "refctr_E1b_z-1", + "copy-from": "generic_rc_underground" + }, + { + "type": "overmap_terrain", + "id": "refctr_E2b_z-1", + "copy-from": "generic_rc_underground" + }, + { + "type": "overmap_terrain", + "id": "refctr_E3b_z-1", + "copy-from": "generic_rc_underground" + }, + { + "type": "overmap_terrain", + "id": "refctr_E4b_z-1", + "copy-from": "generic_rc_underground" + }, + { + "type": "overmap_terrain", + "id": "refctr_E5b_z-1", + "copy-from": "generic_rc_underground" + }, + { + "type": "overmap_terrain", + "id": "refctr_E1c_z-1", + "copy-from": "generic_rc_underground" + }, + { + "type": "overmap_terrain", + "id": "refctr_E2c_z-1", + "copy-from": "generic_rc_underground" + }, + { + "type": "overmap_terrain", + "id": "refctr_E3c_z-1", + "copy-from": "generic_rc_underground" + }, + { + "type": "overmap_terrain", + "id": "refctr_E4c_z-1", + "copy-from": "generic_rc_underground" + }, + { + "type": "overmap_terrain", + "id": "refctr_E5c_z-1", + "copy-from": "generic_rc_underground" + }, + { + "type": "overmap_terrain", + "id": "refctr_E1d_z-1", + "copy-from": "generic_rc_underground" + }, + { + "type": "overmap_terrain", + "id": "refctr_E2d_z-1", + "copy-from": "generic_rc_underground" + }, + { + "type": "overmap_terrain", + "id": "refctr_E3d_z-1", + "copy-from": "generic_rc_underground" + }, + { + "type": "overmap_terrain", + "id": "refctr_E4d_z-1", + "copy-from": "generic_rc_underground" + }, + { + "type": "overmap_terrain", + "id": "refctr_E5d_z-1", + "copy-from": "generic_rc_underground" + }, + { + "type": "overmap_terrain", + "id": "refctr_E1e_z-1", + "copy-from": "generic_rc_underground" + }, + { + "type": "overmap_terrain", + "id": "refctr_E2e_z-1", + "copy-from": "generic_rc_underground" + }, + { + "type": "overmap_terrain", + "id": "refctr_E3e_z-1", + "copy-from": "generic_rc_underground" + }, + { + "type": "overmap_terrain", + "id": "refctr_E4e_z-1", + "copy-from": "generic_rc_underground" + }, + { + "type": "overmap_terrain", + "id": "refctr_E5e_z-1", + "copy-from": "generic_rc_underground" + }, + { + "type": "overmap_terrain", + "id": "refctr_SW1a_z-1", + "copy-from": "generic_rc_underground" + }, + { + "type": "overmap_terrain", + "id": "refctr_SW2a_z-1", + "copy-from": "generic_rc_underground" + }, + { + "type": "overmap_terrain", + "id": "refctr_SW3a_z-1", + "copy-from": "generic_rc_underground" + }, + { + "type": "overmap_terrain", + "id": "refctr_SW4a_z-1", + "copy-from": "generic_rc_underground" + }, + { + "type": "overmap_terrain", + "id": "refctr_SW5a_z-1", + "copy-from": "generic_rc_underground" + }, + { + "type": "overmap_terrain", + "id": "refctr_SW1b_z-1", + "copy-from": "generic_rc_underground" + }, + { + "type": "overmap_terrain", + "id": "refctr_SW2b_z-1", + "copy-from": "generic_rc_underground" + }, + { + "type": "overmap_terrain", + "id": "refctr_SW3b_z-1", + "copy-from": "generic_rc_underground" + }, + { + "type": "overmap_terrain", + "id": "refctr_SW4b_z-1", + "copy-from": "generic_rc_underground" + }, + { + "type": "overmap_terrain", + "id": "refctr_SW5b_z-1", + "copy-from": "generic_rc_underground" + }, + { + "type": "overmap_terrain", + "id": "refctr_SW1c_z-1", + "copy-from": "generic_rc_underground" + }, + { + "type": "overmap_terrain", + "id": "refctr_SW2c_z-1", + "copy-from": "generic_rc_underground" + }, + { + "type": "overmap_terrain", + "id": "refctr_SW3c_z-1", + "copy-from": "generic_rc_underground" + }, + { + "type": "overmap_terrain", + "id": "refctr_SW4c_z-1", + "copy-from": "generic_rc_underground" + }, + { + "type": "overmap_terrain", + "id": "refctr_SW5c_z-1", + "copy-from": "generic_rc_underground" + }, + { + "type": "overmap_terrain", + "id": "refctr_SW1d_z-1", + "copy-from": "generic_rc_underground" + }, + { + "type": "overmap_terrain", + "id": "refctr_SW2d_z-1", + "copy-from": "generic_rc_underground" + }, + { + "type": "overmap_terrain", + "id": "refctr_SW3d_z-1", + "copy-from": "generic_rc_underground" + }, + { + "type": "overmap_terrain", + "id": "refctr_SW4d_z-1", + "copy-from": "generic_rc_underground" + }, + { + "type": "overmap_terrain", + "id": "refctr_SW5d_z-1", + "copy-from": "generic_rc_underground" + }, + { + "type": "overmap_terrain", + "id": "refctr_SW1e_z-1", + "copy-from": "generic_rc_underground" + }, + { + "type": "overmap_terrain", + "id": "refctr_SW2e_z-1", + "copy-from": "generic_rc_underground" + }, + { + "type": "overmap_terrain", + "id": "refctr_SW3e_z-1", + "copy-from": "generic_rc_underground" + }, + { + "type": "overmap_terrain", + "id": "refctr_SW4e_z-1", + "copy-from": "generic_rc_underground" + }, + { + "type": "overmap_terrain", + "id": "refctr_SW5e_z-1", + "copy-from": "generic_rc_underground" + }, + { + "type": "overmap_terrain", + "id": "refctr_S1a_z-1", + "copy-from": "generic_rc_underground" + }, + { + "type": "overmap_terrain", + "id": "refctr_S2a_z-1", + "copy-from": "generic_rc_underground" + }, + { + "type": "overmap_terrain", + "id": "refctr_S3a_z-1", + "copy-from": "generic_rc_underground" + }, + { + "type": "overmap_terrain", + "id": "refctr_S4a_z-1", + "copy-from": "generic_rc_underground" + }, + { + "type": "overmap_terrain", + "id": "refctr_S5a_z-1", + "copy-from": "generic_rc_underground" + }, + { + "type": "overmap_terrain", + "id": "refctr_S1b_z-1", + "copy-from": "generic_rc_underground" + }, + { + "type": "overmap_terrain", + "id": "refctr_S2b_z-1", + "copy-from": "generic_rc_underground" + }, + { + "type": "overmap_terrain", + "id": "refctr_S3b_z-1", + "copy-from": "generic_rc_underground" + }, + { + "type": "overmap_terrain", + "id": "refctr_S4b_z-1", + "copy-from": "generic_rc_underground" + }, + { + "type": "overmap_terrain", + "id": "refctr_S5b_z-1", + "copy-from": "generic_rc_underground" + }, + { + "type": "overmap_terrain", + "id": "refctr_S1c_z-1", + "copy-from": "generic_rc_underground" + }, + { + "type": "overmap_terrain", + "id": "refctr_S2c_z-1", + "copy-from": "generic_rc_underground" + }, + { + "type": "overmap_terrain", + "id": "refctr_S3c_z-1", + "copy-from": "generic_rc_underground" + }, + { + "type": "overmap_terrain", + "id": "refctr_S4c_z-1", + "copy-from": "generic_rc_underground" + }, + { + "type": "overmap_terrain", + "id": "refctr_S5c_z-1", + "copy-from": "generic_rc_underground" + }, + { + "type": "overmap_terrain", + "id": "refctr_S1d_z-1", + "copy-from": "generic_rc_underground" + }, + { + "type": "overmap_terrain", + "id": "refctr_S2d_z-1", + "copy-from": "generic_rc_underground" + }, + { + "type": "overmap_terrain", + "id": "refctr_S3d_z-1", + "copy-from": "generic_rc_underground" + }, + { + "type": "overmap_terrain", + "id": "refctr_S4d_z-1", + "copy-from": "generic_rc_underground" + }, + { + "type": "overmap_terrain", + "id": "refctr_S5d_z-1", + "copy-from": "generic_rc_underground" + }, + { + "type": "overmap_terrain", + "id": "refctr_S1e_z-1", + "copy-from": "generic_rc_underground" + }, + { + "type": "overmap_terrain", + "id": "refctr_S2e_z-1", + "copy-from": "generic_rc_underground" + }, + { + "type": "overmap_terrain", + "id": "refctr_S3e_z-1", + "copy-from": "generic_rc_underground" + }, + { + "type": "overmap_terrain", + "id": "refctr_S4e_z-1", + "copy-from": "generic_rc_underground" + }, + { + "type": "overmap_terrain", + "id": "refctr_S5e_z-1", + "copy-from": "generic_rc_underground" + }, + { + "type": "overmap_terrain", + "id": "refctr_SE1a_z-1", + "copy-from": "generic_rc_underground" + }, + { + "type": "overmap_terrain", + "id": "refctr_SE2a_z-1", + "copy-from": "generic_rc_underground" + }, + { + "type": "overmap_terrain", + "id": "refctr_SE3a_z-1", + "copy-from": "generic_rc_underground" + }, + { + "type": "overmap_terrain", + "id": "refctr_SE4a_z-1", + "copy-from": "generic_rc_underground" + }, + { + "type": "overmap_terrain", + "id": "refctr_SE5a_z-1", + "copy-from": "generic_rc_underground" + }, + { + "type": "overmap_terrain", + "id": "refctr_SE1b_z-1", + "copy-from": "generic_rc_underground" + }, + { + "type": "overmap_terrain", + "id": "refctr_SE2b_z-1", + "copy-from": "generic_rc_underground" + }, + { + "type": "overmap_terrain", + "id": "refctr_SE3b_z-1", + "copy-from": "generic_rc_underground" + }, + { + "type": "overmap_terrain", + "id": "refctr_SE4b_z-1", + "copy-from": "generic_rc_underground" + }, + { + "type": "overmap_terrain", + "id": "refctr_SE5b_z-1", + "copy-from": "generic_rc_underground" + }, + { + "type": "overmap_terrain", + "id": "refctr_SE1c_z-1", + "copy-from": "generic_rc_underground" + }, + { + "type": "overmap_terrain", + "id": "refctr_SE2c_z-1", + "copy-from": "generic_rc_underground" + }, + { + "type": "overmap_terrain", + "id": "refctr_SE3c_z-1", + "copy-from": "generic_rc_underground" + }, + { + "type": "overmap_terrain", + "id": "refctr_SE4c_z-1", + "copy-from": "generic_rc_underground" + }, + { + "type": "overmap_terrain", + "id": "refctr_SE5c_z-1", + "copy-from": "generic_rc_underground" + }, + { + "type": "overmap_terrain", + "id": "refctr_SE1d_z-1", + "copy-from": "generic_rc_underground" + }, + { + "type": "overmap_terrain", + "id": "refctr_SE2d_z-1", + "copy-from": "generic_rc_underground" + }, + { + "type": "overmap_terrain", + "id": "refctr_SE3d_z-1", + "copy-from": "generic_rc_underground" + }, + { + "type": "overmap_terrain", + "id": "refctr_SE4d_z-1", + "copy-from": "generic_rc_underground" + }, + { + "type": "overmap_terrain", + "id": "refctr_SE5d_z-1", + "copy-from": "generic_rc_underground" + }, + { + "type": "overmap_terrain", + "id": "refctr_SE1e_z-1", + "copy-from": "generic_rc_underground" + }, + { + "type": "overmap_terrain", + "id": "refctr_SE2e_z-1", + "copy-from": "generic_rc_underground" + }, + { + "type": "overmap_terrain", + "id": "refctr_SE3e_z-1", + "copy-from": "generic_rc_underground" + }, + { + "type": "overmap_terrain", + "id": "refctr_SE4e_z-1", + "copy-from": "generic_rc_underground" + }, + { + "type": "overmap_terrain", + "id": "refctr_SE5e_z-1", + "copy-from": "generic_rc_underground" + }, + { + "type": "overmap_terrain", + "id": "refctr_NW1a_z-2", + "copy-from": "generic_rc_underground" + }, + { + "type": "overmap_terrain", + "id": "refctr_NW2a_z-2", + "copy-from": "generic_rc_underground" + }, + { + "type": "overmap_terrain", + "id": "refctr_NW3a_z-2", + "copy-from": "generic_rc_underground" + }, + { + "type": "overmap_terrain", + "id": "refctr_NW4a_z-2", + "copy-from": "generic_rc_underground" + }, + { + "type": "overmap_terrain", + "id": "refctr_NW5a_z-2", + "copy-from": "generic_rc_underground" + }, + { + "type": "overmap_terrain", + "id": "refctr_NW1b_z-2", + "copy-from": "generic_rc_underground" + }, + { + "type": "overmap_terrain", + "id": "refctr_NW2b_z-2", + "copy-from": "generic_rc_underground" + }, + { + "type": "overmap_terrain", + "id": "refctr_NW3b_z-2", + "copy-from": "generic_rc_underground" + }, + { + "type": "overmap_terrain", + "id": "refctr_NW4b_z-2", + "copy-from": "generic_rc_underground" + }, + { + "type": "overmap_terrain", + "id": "refctr_NW5b_z-2", + "copy-from": "generic_rc_underground" + }, + { + "type": "overmap_terrain", + "id": "refctr_NW1c_z-2", + "copy-from": "generic_rc_underground" + }, + { + "type": "overmap_terrain", + "id": "refctr_NW2c_z-2", + "copy-from": "generic_rc_underground" + }, + { + "type": "overmap_terrain", + "id": "refctr_NW3c_z-2", + "copy-from": "generic_rc_underground" + }, + { + "type": "overmap_terrain", + "id": "refctr_NW4c_z-2", + "copy-from": "generic_rc_underground" + }, + { + "type": "overmap_terrain", + "id": "refctr_NW5c_z-2", + "copy-from": "generic_rc_underground" + }, + { + "type": "overmap_terrain", + "id": "refctr_NW1d_z-2", + "copy-from": "generic_rc_underground" + }, + { + "type": "overmap_terrain", + "id": "refctr_NW2d_z-2", + "copy-from": "generic_rc_underground" + }, + { + "type": "overmap_terrain", + "id": "refctr_NW3d_z-2", + "copy-from": "generic_rc_underground" + }, + { + "type": "overmap_terrain", + "id": "refctr_NW4d_z-2", + "copy-from": "generic_rc_underground" + }, + { + "type": "overmap_terrain", + "id": "refctr_NW5d_z-2", + "copy-from": "generic_rc_underground" + }, + { + "type": "overmap_terrain", + "id": "refctr_NW1e_z-2", + "copy-from": "generic_rc_underground" + }, + { + "type": "overmap_terrain", + "id": "refctr_NW2e_z-2", + "copy-from": "generic_rc_underground" + }, + { + "type": "overmap_terrain", + "id": "refctr_NW3e_z-2", + "copy-from": "generic_rc_underground" + }, + { + "type": "overmap_terrain", + "id": "refctr_NW4e_z-2", + "copy-from": "generic_rc_underground" + }, + { + "type": "overmap_terrain", + "id": "refctr_NW5e_z-2", + "copy-from": "generic_rc_underground" + }, + { + "type": "overmap_terrain", + "id": "refctr_N1a_z-2", + "copy-from": "generic_rc_underground" + }, + { + "type": "overmap_terrain", + "id": "refctr_N2a_z-2", + "copy-from": "generic_rc_underground" + }, + { + "type": "overmap_terrain", + "id": "refctr_N3a_z-2", + "copy-from": "generic_rc_underground" + }, + { + "type": "overmap_terrain", + "id": "refctr_N4a_z-2", + "copy-from": "generic_rc_underground" + }, + { + "type": "overmap_terrain", + "id": "refctr_N5a_z-2", + "copy-from": "generic_rc_underground" + }, + { + "type": "overmap_terrain", + "id": "refctr_N1b_z-2", + "copy-from": "generic_rc_underground" + }, + { + "type": "overmap_terrain", + "id": "refctr_N2b_z-2", + "copy-from": "generic_rc_underground" + }, + { + "type": "overmap_terrain", + "id": "refctr_N3b_z-2", + "copy-from": "generic_rc_underground" + }, + { + "type": "overmap_terrain", + "id": "refctr_N4b_z-2", + "copy-from": "generic_rc_underground" + }, + { + "type": "overmap_terrain", + "id": "refctr_N5b_z-2", + "copy-from": "generic_rc_underground" + }, + { + "type": "overmap_terrain", + "id": "refctr_N1c_z-2", + "copy-from": "generic_rc_underground" + }, + { + "type": "overmap_terrain", + "id": "refctr_N2c_z-2", + "copy-from": "generic_rc_underground" + }, + { + "type": "overmap_terrain", + "id": "refctr_N3c_z-2", + "copy-from": "generic_rc_underground" + }, + { + "type": "overmap_terrain", + "id": "refctr_N4c_z-2", + "copy-from": "generic_rc_underground" + }, + { + "type": "overmap_terrain", + "id": "refctr_N5c_z-2", + "copy-from": "generic_rc_underground" + }, + { + "type": "overmap_terrain", + "id": "refctr_N1d_z-2", + "copy-from": "generic_rc_underground" + }, + { + "type": "overmap_terrain", + "id": "refctr_N2d_z-2", + "copy-from": "generic_rc_underground" + }, + { + "type": "overmap_terrain", + "id": "refctr_N3d_z-2", + "copy-from": "generic_rc_underground" + }, + { + "type": "overmap_terrain", + "id": "refctr_N4d_z-2", + "copy-from": "generic_rc_underground" + }, + { + "type": "overmap_terrain", + "id": "refctr_N5d_z-2", + "copy-from": "generic_rc_underground" + }, + { + "type": "overmap_terrain", + "id": "refctr_N1e_z-2", + "copy-from": "generic_rc_underground" + }, + { + "type": "overmap_terrain", + "id": "refctr_N2e_z-2", + "copy-from": "generic_rc_underground" + }, + { + "type": "overmap_terrain", + "id": "refctr_N3e_z-2", + "copy-from": "generic_rc_underground" + }, + { + "type": "overmap_terrain", + "id": "refctr_N4e_z-2", + "copy-from": "generic_rc_underground" + }, + { + "type": "overmap_terrain", + "id": "refctr_N5e_z-2", + "copy-from": "generic_rc_underground" + }, + { + "type": "overmap_terrain", + "id": "refctr_NE1a_z-2", + "copy-from": "generic_rc_underground" + }, + { + "type": "overmap_terrain", + "id": "refctr_NE2a_z-2", + "copy-from": "generic_rc_underground" + }, + { + "type": "overmap_terrain", + "id": "refctr_NE3a_z-2", + "copy-from": "generic_rc_underground" + }, + { + "type": "overmap_terrain", + "id": "refctr_NE4a_z-2", + "copy-from": "generic_rc_underground" + }, + { + "type": "overmap_terrain", + "id": "refctr_NE5a_z-2", + "copy-from": "generic_rc_underground" + }, + { + "type": "overmap_terrain", + "id": "refctr_NE1b_z-2", + "copy-from": "generic_rc_underground" + }, + { + "type": "overmap_terrain", + "id": "refctr_NE2b_z-2", + "copy-from": "generic_rc_underground" + }, + { + "type": "overmap_terrain", + "id": "refctr_NE3b_z-2", + "copy-from": "generic_rc_underground" + }, + { + "type": "overmap_terrain", + "id": "refctr_NE4b_z-2", + "copy-from": "generic_rc_underground" + }, + { + "type": "overmap_terrain", + "id": "refctr_NE5b_z-2", + "copy-from": "generic_rc_underground" + }, + { + "type": "overmap_terrain", + "id": "refctr_NE1c_z-2", + "copy-from": "generic_rc_underground" + }, + { + "type": "overmap_terrain", + "id": "refctr_NE2c_z-2", + "copy-from": "generic_rc_underground" + }, + { + "type": "overmap_terrain", + "id": "refctr_NE3c_z-2", + "copy-from": "generic_rc_underground" + }, + { + "type": "overmap_terrain", + "id": "refctr_NE4c_z-2", + "copy-from": "generic_rc_underground" + }, + { + "type": "overmap_terrain", + "id": "refctr_NE5c_z-2", + "copy-from": "generic_rc_underground" + }, + { + "type": "overmap_terrain", + "id": "refctr_NE1d_z-2", + "copy-from": "generic_rc_underground" + }, + { + "type": "overmap_terrain", + "id": "refctr_NE2d_z-2", + "copy-from": "generic_rc_underground" + }, + { + "type": "overmap_terrain", + "id": "refctr_NE3d_z-2", + "copy-from": "generic_rc_underground" + }, + { + "type": "overmap_terrain", + "id": "refctr_NE4d_z-2", + "copy-from": "generic_rc_underground" + }, + { + "type": "overmap_terrain", + "id": "refctr_NE5d_z-2", + "copy-from": "generic_rc_underground" + }, + { + "type": "overmap_terrain", + "id": "refctr_NE1e_z-2", + "copy-from": "generic_rc_underground" + }, + { + "type": "overmap_terrain", + "id": "refctr_NE2e_z-2", + "copy-from": "generic_rc_underground" + }, + { + "type": "overmap_terrain", + "id": "refctr_NE3e_z-2", + "copy-from": "generic_rc_underground" + }, + { + "type": "overmap_terrain", + "id": "refctr_NE4e_z-2", + "copy-from": "generic_rc_underground" + }, + { + "type": "overmap_terrain", + "id": "refctr_NE5e_z-2", + "copy-from": "generic_rc_underground" + }, + { + "type": "overmap_terrain", + "id": "refctr_W1a_z-2", + "copy-from": "generic_rc_underground" + }, + { + "type": "overmap_terrain", + "id": "refctr_W2a_z-2", + "copy-from": "generic_rc_underground" + }, + { + "type": "overmap_terrain", + "id": "refctr_W3a_z-2", + "copy-from": "generic_rc_underground" + }, + { + "type": "overmap_terrain", + "id": "refctr_W4a_z-2", + "copy-from": "generic_rc_underground" + }, + { + "type": "overmap_terrain", + "id": "refctr_W5a_z-2", + "copy-from": "generic_rc_underground" + }, + { + "type": "overmap_terrain", + "id": "refctr_W1b_z-2", + "copy-from": "generic_rc_underground" + }, + { + "type": "overmap_terrain", + "id": "refctr_W2b_z-2", + "copy-from": "generic_rc_underground" + }, + { + "type": "overmap_terrain", + "id": "refctr_W3b_z-2", + "copy-from": "generic_rc_underground" + }, + { + "type": "overmap_terrain", + "id": "refctr_W4b_z-2", + "copy-from": "generic_rc_underground" + }, + { + "type": "overmap_terrain", + "id": "refctr_W5b_z-2", + "copy-from": "generic_rc_underground" + }, + { + "type": "overmap_terrain", + "id": "refctr_W1c_z-2", + "copy-from": "generic_rc_underground" + }, + { + "type": "overmap_terrain", + "id": "refctr_W2c_z-2", + "copy-from": "generic_rc_underground" + }, + { + "type": "overmap_terrain", + "id": "refctr_W3c_z-2", + "copy-from": "generic_rc_underground" + }, + { + "type": "overmap_terrain", + "id": "refctr_W4c_z-2", + "copy-from": "generic_rc_underground" + }, + { + "type": "overmap_terrain", + "id": "refctr_W5c_z-2", + "copy-from": "generic_rc_underground" + }, + { + "type": "overmap_terrain", + "id": "refctr_W1d_z-2", + "copy-from": "generic_rc_underground" + }, + { + "type": "overmap_terrain", + "id": "refctr_W2d_z-2", + "copy-from": "generic_rc_underground" + }, + { + "type": "overmap_terrain", + "id": "refctr_W3d_z-2", + "copy-from": "generic_rc_underground" + }, + { + "type": "overmap_terrain", + "id": "refctr_W4d_z-2", + "copy-from": "generic_rc_underground" + }, + { + "type": "overmap_terrain", + "id": "refctr_W5d_z-2", + "copy-from": "generic_rc_underground" + }, + { + "type": "overmap_terrain", + "id": "refctr_W1e_z-2", + "copy-from": "generic_rc_underground" + }, + { + "type": "overmap_terrain", + "id": "refctr_W2e_z-2", + "copy-from": "generic_rc_underground" + }, + { + "type": "overmap_terrain", + "id": "refctr_W3e_z-2", + "copy-from": "generic_rc_underground" + }, + { + "type": "overmap_terrain", + "id": "refctr_W4e_z-2", + "copy-from": "generic_rc_underground" + }, + { + "type": "overmap_terrain", + "id": "refctr_W5e_z-2", + "copy-from": "generic_rc_underground" + }, + { + "type": "overmap_terrain", + "id": "evac_center_1_z-2", + "copy-from": "generic_rc_underground" + }, + { + "type": "overmap_terrain", + "id": "evac_center_2_z-2", + "copy-from": "generic_rc_underground" + }, + { + "type": "overmap_terrain", + "id": "evac_center_3_z-2", + "copy-from": "generic_rc_underground" + }, + { + "type": "overmap_terrain", + "id": "evac_center_4_z-2", + "copy-from": "generic_rc_underground" + }, + { + "type": "overmap_terrain", + "id": "evac_center_5_z-2", + "copy-from": "generic_rc_underground" + }, + { + "type": "overmap_terrain", + "id": "evac_center_6_z-2", + "copy-from": "generic_rc_underground" + }, + { + "type": "overmap_terrain", + "id": "evac_center_7_z-2", + "copy-from": "generic_rc_underground" + }, + { + "type": "overmap_terrain", + "id": "evac_center_8_z-2", + "copy-from": "generic_rc_underground" + }, + { + "type": "overmap_terrain", + "id": "evac_center_9_z-2", + "copy-from": "generic_rc_underground" + }, + { + "type": "overmap_terrain", + "id": "evac_center_10_z-2", + "copy-from": "generic_rc_underground" + }, + { + "type": "overmap_terrain", + "id": "evac_center_11_z-2", + "copy-from": "generic_rc_underground" + }, + { + "type": "overmap_terrain", + "id": "evac_center_12_z-2", + "copy-from": "generic_rc_underground" + }, + { + "type": "overmap_terrain", + "id": "evac_center_13_z-2", + "copy-from": "generic_rc_underground" + }, + { + "type": "overmap_terrain", + "id": "evac_center_14_z-2", + "copy-from": "generic_rc_underground" + }, + { + "type": "overmap_terrain", + "id": "evac_center_15_z-2", + "copy-from": "generic_rc_underground" + }, + { + "type": "overmap_terrain", + "id": "evac_center_16_z-2", + "copy-from": "generic_rc_underground" + }, + { + "type": "overmap_terrain", + "id": "evac_center_17_z-2", + "copy-from": "generic_rc_underground" + }, + { + "type": "overmap_terrain", + "id": "evac_center_18_z-2", + "copy-from": "generic_rc_underground" + }, + { + "type": "overmap_terrain", + "id": "evac_center_19_z-2", + "copy-from": "generic_rc_underground" + }, + { + "type": "overmap_terrain", + "id": "evac_center_20_z-2", + "copy-from": "generic_rc_underground" + }, + { + "type": "overmap_terrain", + "id": "evac_center_21_z-2", + "copy-from": "generic_rc_underground" + }, + { + "type": "overmap_terrain", + "id": "evac_center_22_z-2", + "copy-from": "generic_rc_underground" + }, + { + "type": "overmap_terrain", + "id": "evac_center_23_z-2", + "copy-from": "generic_rc_underground" + }, + { + "type": "overmap_terrain", + "id": "evac_center_24_z-2", + "copy-from": "generic_rc_underground" + }, + { + "type": "overmap_terrain", + "id": "evac_center_25_z-2", + "copy-from": "generic_rc_underground" + }, + { + "type": "overmap_terrain", + "id": "refctr_E1a_z-2", + "copy-from": "generic_rc_underground" + }, + { + "type": "overmap_terrain", + "id": "refctr_E2a_z-2", + "copy-from": "generic_rc_underground" + }, + { + "type": "overmap_terrain", + "id": "refctr_E3a_z-2", + "copy-from": "generic_rc_underground" + }, + { + "type": "overmap_terrain", + "id": "refctr_E4a_z-2", + "copy-from": "generic_rc_underground" + }, + { + "type": "overmap_terrain", + "id": "refctr_E5a_z-2", + "copy-from": "generic_rc_underground" + }, + { + "type": "overmap_terrain", + "id": "refctr_E1b_z-2", + "copy-from": "generic_rc_underground" + }, + { + "type": "overmap_terrain", + "id": "refctr_E2b_z-2", + "copy-from": "generic_rc_underground" + }, + { + "type": "overmap_terrain", + "id": "refctr_E3b_z-2", + "copy-from": "generic_rc_underground" + }, + { + "type": "overmap_terrain", + "id": "refctr_E4b_z-2", + "copy-from": "generic_rc_underground" + }, + { + "type": "overmap_terrain", + "id": "refctr_E5b_z-2", + "copy-from": "generic_rc_underground" + }, + { + "type": "overmap_terrain", + "id": "refctr_E1c_z-2", + "copy-from": "generic_rc_underground" + }, + { + "type": "overmap_terrain", + "id": "refctr_E2c_z-2", + "copy-from": "generic_rc_underground" + }, + { + "type": "overmap_terrain", + "id": "refctr_E3c_z-2", + "copy-from": "generic_rc_underground" + }, + { + "type": "overmap_terrain", + "id": "refctr_E4c_z-2", + "copy-from": "generic_rc_underground" + }, + { + "type": "overmap_terrain", + "id": "refctr_E5c_z-2", + "copy-from": "generic_rc_underground" + }, + { + "type": "overmap_terrain", + "id": "refctr_E1d_z-2", + "copy-from": "generic_rc_underground" + }, + { + "type": "overmap_terrain", + "id": "refctr_E2d_z-2", + "copy-from": "generic_rc_underground" + }, + { + "type": "overmap_terrain", + "id": "refctr_E3d_z-2", + "copy-from": "generic_rc_underground" + }, + { + "type": "overmap_terrain", + "id": "refctr_E4d_z-2", + "copy-from": "generic_rc_underground" + }, + { + "type": "overmap_terrain", + "id": "refctr_E5d_z-2", + "copy-from": "generic_rc_underground" + }, + { + "type": "overmap_terrain", + "id": "refctr_E1e_z-2", + "copy-from": "generic_rc_underground" + }, + { + "type": "overmap_terrain", + "id": "refctr_E2e_z-2", + "copy-from": "generic_rc_underground" + }, + { + "type": "overmap_terrain", + "id": "refctr_E3e_z-2", + "copy-from": "generic_rc_underground" + }, + { + "type": "overmap_terrain", + "id": "refctr_E4e_z-2", + "copy-from": "generic_rc_underground" + }, + { + "type": "overmap_terrain", + "id": "refctr_E5e_z-2", + "copy-from": "generic_rc_underground" + }, + { + "type": "overmap_terrain", + "id": "refctr_SW1a_z-2", + "copy-from": "generic_rc_underground" + }, + { + "type": "overmap_terrain", + "id": "refctr_SW2a_z-2", + "copy-from": "generic_rc_underground" + }, + { + "type": "overmap_terrain", + "id": "refctr_SW3a_z-2", + "copy-from": "generic_rc_underground" + }, + { + "type": "overmap_terrain", + "id": "refctr_SW4a_z-2", + "copy-from": "generic_rc_underground" + }, + { + "type": "overmap_terrain", + "id": "refctr_SW5a_z-2", + "copy-from": "generic_rc_underground" + }, + { + "type": "overmap_terrain", + "id": "refctr_SW1b_z-2", + "copy-from": "generic_rc_underground" + }, + { + "type": "overmap_terrain", + "id": "refctr_SW2b_z-2", + "copy-from": "generic_rc_underground" + }, + { + "type": "overmap_terrain", + "id": "refctr_SW3b_z-2", + "copy-from": "generic_rc_underground" + }, + { + "type": "overmap_terrain", + "id": "refctr_SW4b_z-2", + "copy-from": "generic_rc_underground" + }, + { + "type": "overmap_terrain", + "id": "refctr_SW5b_z-2", + "copy-from": "generic_rc_underground" + }, + { + "type": "overmap_terrain", + "id": "refctr_SW1c_z-2", + "copy-from": "generic_rc_underground" + }, + { + "type": "overmap_terrain", + "id": "refctr_SW2c_z-2", + "copy-from": "generic_rc_underground" + }, + { + "type": "overmap_terrain", + "id": "refctr_SW3c_z-2", + "copy-from": "generic_rc_underground" + }, + { + "type": "overmap_terrain", + "id": "refctr_SW4c_z-2", + "copy-from": "generic_rc_underground" + }, + { + "type": "overmap_terrain", + "id": "refctr_SW5c_z-2", + "copy-from": "generic_rc_underground" + }, + { + "type": "overmap_terrain", + "id": "refctr_SW1d_z-2", + "copy-from": "generic_rc_underground" + }, + { + "type": "overmap_terrain", + "id": "refctr_SW2d_z-2", + "copy-from": "generic_rc_underground" + }, + { + "type": "overmap_terrain", + "id": "refctr_SW3d_z-2", + "copy-from": "generic_rc_underground" + }, + { + "type": "overmap_terrain", + "id": "refctr_SW4d_z-2", + "copy-from": "generic_rc_underground" + }, + { + "type": "overmap_terrain", + "id": "refctr_SW5d_z-2", + "copy-from": "generic_rc_underground" + }, + { + "type": "overmap_terrain", + "id": "refctr_SW1e_z-2", + "copy-from": "generic_rc_underground" + }, + { + "type": "overmap_terrain", + "id": "refctr_SW2e_z-2", + "copy-from": "generic_rc_underground" + }, + { + "type": "overmap_terrain", + "id": "refctr_SW3e_z-2", + "copy-from": "generic_rc_underground" + }, + { + "type": "overmap_terrain", + "id": "refctr_SW4e_z-2", + "copy-from": "generic_rc_underground" + }, + { + "type": "overmap_terrain", + "id": "refctr_SW5e_z-2", + "copy-from": "generic_rc_underground" + }, + { + "type": "overmap_terrain", + "id": "refctr_S1a_z-2", + "copy-from": "generic_rc_underground" + }, + { + "type": "overmap_terrain", + "id": "refctr_S2a_z-2", + "copy-from": "generic_rc_underground" + }, + { + "type": "overmap_terrain", + "id": "refctr_S3a_z-2", + "copy-from": "generic_rc_underground" + }, + { + "type": "overmap_terrain", + "id": "refctr_S4a_z-2", + "copy-from": "generic_rc_underground" + }, + { + "type": "overmap_terrain", + "id": "refctr_S5a_z-2", + "copy-from": "generic_rc_underground" + }, + { + "type": "overmap_terrain", + "id": "refctr_S1b_z-2", + "copy-from": "generic_rc_underground" + }, + { + "type": "overmap_terrain", + "id": "refctr_S2b_z-2", + "copy-from": "generic_rc_underground" + }, + { + "type": "overmap_terrain", + "id": "refctr_S3b_z-2", + "copy-from": "generic_rc_underground" + }, + { + "type": "overmap_terrain", + "id": "refctr_S4b_z-2", + "copy-from": "generic_rc_underground" + }, + { + "type": "overmap_terrain", + "id": "refctr_S5b_z-2", + "copy-from": "generic_rc_underground" + }, + { + "type": "overmap_terrain", + "id": "refctr_S1c_z-2", + "copy-from": "generic_rc_underground" + }, + { + "type": "overmap_terrain", + "id": "refctr_S2c_z-2", + "copy-from": "generic_rc_underground" + }, + { + "type": "overmap_terrain", + "id": "refctr_S3c_z-2", + "copy-from": "generic_rc_underground" + }, + { + "type": "overmap_terrain", + "id": "refctr_S4c_z-2", + "copy-from": "generic_rc_underground" + }, + { + "type": "overmap_terrain", + "id": "refctr_S5c_z-2", + "copy-from": "generic_rc_underground" + }, + { + "type": "overmap_terrain", + "id": "refctr_S1d_z-2", + "copy-from": "generic_rc_underground" + }, + { + "type": "overmap_terrain", + "id": "refctr_S2d_z-2", + "copy-from": "generic_rc_underground" + }, + { + "type": "overmap_terrain", + "id": "refctr_S3d_z-2", + "copy-from": "generic_rc_underground" + }, + { + "type": "overmap_terrain", + "id": "refctr_S4d_z-2", + "copy-from": "generic_rc_underground" + }, + { + "type": "overmap_terrain", + "id": "refctr_S5d_z-2", + "copy-from": "generic_rc_underground" + }, + { + "type": "overmap_terrain", + "id": "refctr_S1e_z-2", + "copy-from": "generic_rc_underground" + }, + { + "type": "overmap_terrain", + "id": "refctr_S2e_z-2", + "copy-from": "generic_rc_underground" + }, + { + "type": "overmap_terrain", + "id": "refctr_S3e_z-2", + "copy-from": "generic_rc_underground" + }, + { + "type": "overmap_terrain", + "id": "refctr_S4e_z-2", + "copy-from": "generic_rc_underground" + }, + { + "type": "overmap_terrain", + "id": "refctr_S5e_z-2", + "copy-from": "generic_rc_underground" + }, + { + "type": "overmap_terrain", + "id": "refctr_SE1a_z-2", + "copy-from": "generic_rc_underground" + }, + { + "type": "overmap_terrain", + "id": "refctr_SE2a_z-2", + "copy-from": "generic_rc_underground" + }, + { + "type": "overmap_terrain", + "id": "refctr_SE3a_z-2", + "copy-from": "generic_rc_underground" + }, + { + "type": "overmap_terrain", + "id": "refctr_SE4a_z-2", + "copy-from": "generic_rc_underground" + }, + { + "type": "overmap_terrain", + "id": "refctr_SE5a_z-2", + "copy-from": "generic_rc_underground" + }, + { + "type": "overmap_terrain", + "id": "refctr_SE1b_z-2", + "copy-from": "generic_rc_underground" + }, + { + "type": "overmap_terrain", + "id": "refctr_SE2b_z-2", + "copy-from": "generic_rc_underground" + }, + { + "type": "overmap_terrain", + "id": "refctr_SE3b_z-2", + "copy-from": "generic_rc_underground" + }, + { + "type": "overmap_terrain", + "id": "refctr_SE4b_z-2", + "copy-from": "generic_rc_underground" + }, + { + "type": "overmap_terrain", + "id": "refctr_SE5b_z-2", + "copy-from": "generic_rc_underground" + }, + { + "type": "overmap_terrain", + "id": "refctr_SE1c_z-2", + "copy-from": "generic_rc_underground" + }, + { + "type": "overmap_terrain", + "id": "refctr_SE2c_z-2", + "copy-from": "generic_rc_underground" + }, + { + "type": "overmap_terrain", + "id": "refctr_SE3c_z-2", + "copy-from": "generic_rc_underground" + }, + { + "type": "overmap_terrain", + "id": "refctr_SE4c_z-2", + "copy-from": "generic_rc_underground" + }, + { + "type": "overmap_terrain", + "id": "refctr_SE5c_z-2", + "copy-from": "generic_rc_underground" + }, + { + "type": "overmap_terrain", + "id": "refctr_SE1d_z-2", + "copy-from": "generic_rc_underground" + }, + { + "type": "overmap_terrain", + "id": "refctr_SE2d_z-2", + "copy-from": "generic_rc_underground" + }, + { + "type": "overmap_terrain", + "id": "refctr_SE3d_z-2", + "copy-from": "generic_rc_underground" + }, + { + "type": "overmap_terrain", + "id": "refctr_SE4d_z-2", + "copy-from": "generic_rc_underground" + }, + { + "type": "overmap_terrain", + "id": "refctr_SE5d_z-2", + "copy-from": "generic_rc_underground" + }, + { + "type": "overmap_terrain", + "id": "refctr_SE1e_z-2", + "copy-from": "generic_rc_underground" + }, + { + "type": "overmap_terrain", + "id": "refctr_SE2e_z-2", + "copy-from": "generic_rc_underground" + }, + { + "type": "overmap_terrain", + "id": "refctr_SE3e_z-2", + "copy-from": "generic_rc_underground" + }, + { + "type": "overmap_terrain", + "id": "refctr_SE4e_z-2", + "copy-from": "generic_rc_underground" + }, + { + "type": "overmap_terrain", + "id": "refctr_SE5e_z-2", + "copy-from": "generic_rc_underground" + }, + { + "type": "overmap_terrain", + "id": "refctr_NW1a_z-3", + "copy-from": "generic_rc_underground" + }, + { + "type": "overmap_terrain", + "id": "refctr_NW2a_z-3", + "copy-from": "generic_rc_underground" + }, + { + "type": "overmap_terrain", + "id": "refctr_NW3a_z-3", + "copy-from": "generic_rc_underground" + }, + { + "type": "overmap_terrain", + "id": "refctr_NW4a_z-3", + "copy-from": "generic_rc_underground" + }, + { + "type": "overmap_terrain", + "id": "refctr_NW5a_z-3", + "copy-from": "generic_rc_underground" + }, + { + "type": "overmap_terrain", + "id": "refctr_NW1b_z-3", + "copy-from": "generic_rc_underground" + }, + { + "type": "overmap_terrain", + "id": "refctr_NW2b_z-3", + "copy-from": "generic_rc_underground" + }, + { + "type": "overmap_terrain", + "id": "refctr_NW3b_z-3", + "copy-from": "generic_rc_underground" + }, + { + "type": "overmap_terrain", + "id": "refctr_NW4b_z-3", + "copy-from": "generic_rc_underground" + }, + { + "type": "overmap_terrain", + "id": "refctr_NW5b_z-3", + "copy-from": "generic_rc_underground" + }, + { + "type": "overmap_terrain", + "id": "refctr_NW1c_z-3", + "copy-from": "generic_rc_underground" + }, + { + "type": "overmap_terrain", + "id": "refctr_NW2c_z-3", + "copy-from": "generic_rc_underground" + }, + { + "type": "overmap_terrain", + "id": "refctr_NW3c_z-3", + "copy-from": "generic_rc_underground" + }, + { + "type": "overmap_terrain", + "id": "refctr_NW4c_z-3", + "copy-from": "generic_rc_underground" + }, + { + "type": "overmap_terrain", + "id": "refctr_NW5c_z-3", + "copy-from": "generic_rc_underground" + }, + { + "type": "overmap_terrain", + "id": "refctr_NW1d_z-3", + "copy-from": "generic_rc_underground" + }, + { + "type": "overmap_terrain", + "id": "refctr_NW2d_z-3", + "copy-from": "generic_rc_underground" + }, + { + "type": "overmap_terrain", + "id": "refctr_NW3d_z-3", + "copy-from": "generic_rc_underground" + }, + { + "type": "overmap_terrain", + "id": "refctr_NW4d_z-3", + "copy-from": "generic_rc_underground" + }, + { + "type": "overmap_terrain", + "id": "refctr_NW5d_z-3", + "copy-from": "generic_rc_underground" + }, + { + "type": "overmap_terrain", + "id": "refctr_NW1e_z-3", + "copy-from": "generic_rc_underground" + }, + { + "type": "overmap_terrain", + "id": "refctr_NW2e_z-3", + "copy-from": "generic_rc_underground" + }, + { + "type": "overmap_terrain", + "id": "refctr_NW3e_z-3", + "copy-from": "generic_rc_underground" + }, + { + "type": "overmap_terrain", + "id": "refctr_NW4e_z-3", + "copy-from": "generic_rc_underground" + }, + { + "type": "overmap_terrain", + "id": "refctr_NW5e_z-3", + "copy-from": "generic_rc_underground" + }, + { + "type": "overmap_terrain", + "id": "refctr_N1a_z-3", + "copy-from": "generic_rc_underground" + }, + { + "type": "overmap_terrain", + "id": "refctr_N2a_z-3", + "copy-from": "generic_rc_underground" + }, + { + "type": "overmap_terrain", + "id": "refctr_N3a_z-3", + "copy-from": "generic_rc_underground" + }, + { + "type": "overmap_terrain", + "id": "refctr_N4a_z-3", + "copy-from": "generic_rc_underground" + }, + { + "type": "overmap_terrain", + "id": "refctr_N5a_z-3", + "copy-from": "generic_rc_underground" + }, + { + "type": "overmap_terrain", + "id": "refctr_N1b_z-3", + "copy-from": "generic_rc_underground" + }, + { + "type": "overmap_terrain", + "id": "refctr_N2b_z-3", + "copy-from": "generic_rc_underground" + }, + { + "type": "overmap_terrain", + "id": "refctr_N3b_z-3", + "copy-from": "generic_rc_underground" + }, + { + "type": "overmap_terrain", + "id": "refctr_N4b_z-3", + "copy-from": "generic_rc_underground" + }, + { + "type": "overmap_terrain", + "id": "refctr_N5b_z-3", + "copy-from": "generic_rc_underground" + }, + { + "type": "overmap_terrain", + "id": "refctr_N1c_z-3", + "copy-from": "generic_rc_underground" + }, + { + "type": "overmap_terrain", + "id": "refctr_N2c_z-3", + "copy-from": "generic_rc_underground" + }, + { + "type": "overmap_terrain", + "id": "refctr_N3c_z-3", + "copy-from": "generic_rc_underground" + }, + { + "type": "overmap_terrain", + "id": "refctr_N4c_z-3", + "copy-from": "generic_rc_underground" + }, + { + "type": "overmap_terrain", + "id": "refctr_N5c_z-3", + "copy-from": "generic_rc_underground" + }, + { + "type": "overmap_terrain", + "id": "refctr_N1d_z-3", + "copy-from": "generic_rc_underground" + }, + { + "type": "overmap_terrain", + "id": "refctr_N2d_z-3", + "copy-from": "generic_rc_underground" + }, + { + "type": "overmap_terrain", + "id": "refctr_N3d_z-3", + "copy-from": "generic_rc_underground" + }, + { + "type": "overmap_terrain", + "id": "refctr_N4d_z-3", + "copy-from": "generic_rc_underground" + }, + { + "type": "overmap_terrain", + "id": "refctr_N5d_z-3", + "copy-from": "generic_rc_underground" + }, + { + "type": "overmap_terrain", + "id": "refctr_N1e_z-3", + "copy-from": "generic_rc_underground" + }, + { + "type": "overmap_terrain", + "id": "refctr_N2e_z-3", + "copy-from": "generic_rc_underground" + }, + { + "type": "overmap_terrain", + "id": "refctr_N3e_z-3", + "copy-from": "generic_rc_underground" + }, + { + "type": "overmap_terrain", + "id": "refctr_N4e_z-3", + "copy-from": "generic_rc_underground" + }, + { + "type": "overmap_terrain", + "id": "refctr_N5e_z-3", + "copy-from": "generic_rc_underground" + }, + { + "type": "overmap_terrain", + "id": "refctr_NE1a_z-3", + "copy-from": "generic_rc_underground" + }, + { + "type": "overmap_terrain", + "id": "refctr_NE2a_z-3", + "copy-from": "generic_rc_underground" + }, + { + "type": "overmap_terrain", + "id": "refctr_NE3a_z-3", + "copy-from": "generic_rc_underground" + }, + { + "type": "overmap_terrain", + "id": "refctr_NE4a_z-3", + "copy-from": "generic_rc_underground" + }, + { + "type": "overmap_terrain", + "id": "refctr_NE5a_z-3", + "copy-from": "generic_rc_underground" + }, + { + "type": "overmap_terrain", + "id": "refctr_NE1b_z-3", + "copy-from": "generic_rc_underground" + }, + { + "type": "overmap_terrain", + "id": "refctr_NE2b_z-3", + "copy-from": "generic_rc_underground" + }, + { + "type": "overmap_terrain", + "id": "refctr_NE3b_z-3", + "copy-from": "generic_rc_underground" + }, + { + "type": "overmap_terrain", + "id": "refctr_NE4b_z-3", + "copy-from": "generic_rc_underground" + }, + { + "type": "overmap_terrain", + "id": "refctr_NE5b_z-3", + "copy-from": "generic_rc_underground" + }, + { + "type": "overmap_terrain", + "id": "refctr_NE1c_z-3", + "copy-from": "generic_rc_underground" + }, + { + "type": "overmap_terrain", + "id": "refctr_NE2c_z-3", + "copy-from": "generic_rc_underground" + }, + { + "type": "overmap_terrain", + "id": "refctr_NE3c_z-3", + "copy-from": "generic_rc_underground" + }, + { + "type": "overmap_terrain", + "id": "refctr_NE4c_z-3", + "copy-from": "generic_rc_underground" + }, + { + "type": "overmap_terrain", + "id": "refctr_NE5c_z-3", + "copy-from": "generic_rc_underground" + }, + { + "type": "overmap_terrain", + "id": "refctr_NE1d_z-3", + "copy-from": "generic_rc_underground" + }, + { + "type": "overmap_terrain", + "id": "refctr_NE2d_z-3", + "copy-from": "generic_rc_underground" + }, + { + "type": "overmap_terrain", + "id": "refctr_NE3d_z-3", + "copy-from": "generic_rc_underground" + }, + { + "type": "overmap_terrain", + "id": "refctr_NE4d_z-3", + "copy-from": "generic_rc_underground" + }, + { + "type": "overmap_terrain", + "id": "refctr_NE5d_z-3", + "copy-from": "generic_rc_underground" + }, + { + "type": "overmap_terrain", + "id": "refctr_NE1e_z-3", + "copy-from": "generic_rc_underground" + }, + { + "type": "overmap_terrain", + "id": "refctr_NE2e_z-3", + "copy-from": "generic_rc_underground" + }, + { + "type": "overmap_terrain", + "id": "refctr_NE3e_z-3", + "copy-from": "generic_rc_underground" + }, + { + "type": "overmap_terrain", + "id": "refctr_NE4e_z-3", + "copy-from": "generic_rc_underground" + }, + { + "type": "overmap_terrain", + "id": "refctr_NE5e_z-3", + "copy-from": "generic_rc_underground" + }, + { + "type": "overmap_terrain", + "id": "refctr_W1a_z-3", + "copy-from": "generic_rc_underground" + }, + { + "type": "overmap_terrain", + "id": "refctr_W2a_z-3", + "copy-from": "generic_rc_underground" + }, + { + "type": "overmap_terrain", + "id": "refctr_W3a_z-3", + "copy-from": "generic_rc_underground" + }, + { + "type": "overmap_terrain", + "id": "refctr_W4a_z-3", + "copy-from": "generic_rc_underground" + }, + { + "type": "overmap_terrain", + "id": "refctr_W5a_z-3", + "copy-from": "generic_rc_underground" + }, + { + "type": "overmap_terrain", + "id": "refctr_W1b_z-3", + "copy-from": "generic_rc_underground" + }, + { + "type": "overmap_terrain", + "id": "refctr_W2b_z-3", + "copy-from": "generic_rc_underground" + }, + { + "type": "overmap_terrain", + "id": "refctr_W3b_z-3", + "copy-from": "generic_rc_underground" + }, + { + "type": "overmap_terrain", + "id": "refctr_W4b_z-3", + "copy-from": "generic_rc_underground" + }, + { + "type": "overmap_terrain", + "id": "refctr_W5b_z-3", + "copy-from": "generic_rc_underground" + }, + { + "type": "overmap_terrain", + "id": "refctr_W1c_z-3", + "copy-from": "generic_rc_underground" + }, + { + "type": "overmap_terrain", + "id": "refctr_W2c_z-3", + "copy-from": "generic_rc_underground" + }, + { + "type": "overmap_terrain", + "id": "refctr_W3c_z-3", + "copy-from": "generic_rc_underground" + }, + { + "type": "overmap_terrain", + "id": "refctr_W4c_z-3", + "copy-from": "generic_rc_underground" + }, + { + "type": "overmap_terrain", + "id": "refctr_W5c_z-3", + "copy-from": "generic_rc_underground" + }, + { + "type": "overmap_terrain", + "id": "refctr_W1d_z-3", + "copy-from": "generic_rc_underground" + }, + { + "type": "overmap_terrain", + "id": "refctr_W2d_z-3", + "copy-from": "generic_rc_underground" + }, + { + "type": "overmap_terrain", + "id": "refctr_W3d_z-3", + "copy-from": "generic_rc_underground" + }, + { + "type": "overmap_terrain", + "id": "refctr_W4d_z-3", + "copy-from": "generic_rc_underground" + }, + { + "type": "overmap_terrain", + "id": "refctr_W5d_z-3", + "copy-from": "generic_rc_underground" + }, + { + "type": "overmap_terrain", + "id": "refctr_W1e_z-3", + "copy-from": "generic_rc_underground" + }, + { + "type": "overmap_terrain", + "id": "refctr_W2e_z-3", + "copy-from": "generic_rc_underground" + }, + { + "type": "overmap_terrain", + "id": "refctr_W3e_z-3", + "copy-from": "generic_rc_underground" + }, + { + "type": "overmap_terrain", + "id": "refctr_W4e_z-3", + "copy-from": "generic_rc_underground" + }, + { + "type": "overmap_terrain", + "id": "refctr_W5e_z-3", + "copy-from": "generic_rc_underground" + }, + { + "type": "overmap_terrain", + "id": "evac_center_1_z-3", + "copy-from": "generic_rc_underground" + }, + { + "type": "overmap_terrain", + "id": "evac_center_2_z-3", + "copy-from": "generic_rc_underground" + }, + { + "type": "overmap_terrain", + "id": "evac_center_3_z-3", + "copy-from": "generic_rc_underground" + }, + { + "type": "overmap_terrain", + "id": "evac_center_4_z-3", + "copy-from": "generic_rc_underground" + }, + { + "type": "overmap_terrain", + "id": "evac_center_5_z-3", + "copy-from": "generic_rc_underground" + }, + { + "type": "overmap_terrain", + "id": "evac_center_6_z-3", + "copy-from": "generic_rc_underground" + }, + { + "type": "overmap_terrain", + "id": "evac_center_7_z-3", + "copy-from": "generic_rc_underground" + }, + { + "type": "overmap_terrain", + "id": "evac_center_8_z-3", + "copy-from": "generic_rc_underground" + }, + { + "type": "overmap_terrain", + "id": "evac_center_9_z-3", + "copy-from": "generic_rc_underground" + }, + { + "type": "overmap_terrain", + "id": "evac_center_10_z-3", + "copy-from": "generic_rc_underground" + }, + { + "type": "overmap_terrain", + "id": "evac_center_11_z-3", + "copy-from": "generic_rc_underground" + }, + { + "type": "overmap_terrain", + "id": "evac_center_12_z-3", + "copy-from": "generic_rc_underground" + }, + { + "type": "overmap_terrain", + "id": "evac_center_13_z-3", + "copy-from": "generic_rc_underground" + }, + { + "type": "overmap_terrain", + "id": "evac_center_14_z-3", + "copy-from": "generic_rc_underground" + }, + { + "type": "overmap_terrain", + "id": "evac_center_15_z-3", + "copy-from": "generic_rc_underground" + }, + { + "type": "overmap_terrain", + "id": "evac_center_16_z-3", + "copy-from": "generic_rc_underground" + }, + { + "type": "overmap_terrain", + "id": "evac_center_17_z-3", + "copy-from": "generic_rc_underground" + }, + { + "type": "overmap_terrain", + "id": "evac_center_18_z-3", + "copy-from": "generic_rc_underground" + }, + { + "type": "overmap_terrain", + "id": "evac_center_19_z-3", + "copy-from": "generic_rc_underground" + }, + { + "type": "overmap_terrain", + "id": "evac_center_20_z-3", + "copy-from": "generic_rc_underground" + }, + { + "type": "overmap_terrain", + "id": "evac_center_21_z-3", + "copy-from": "generic_rc_underground" + }, + { + "type": "overmap_terrain", + "id": "evac_center_22_z-3", + "copy-from": "generic_rc_underground" + }, + { + "type": "overmap_terrain", + "id": "evac_center_23_z-3", + "copy-from": "generic_rc_underground" + }, + { + "type": "overmap_terrain", + "id": "evac_center_24_z-3", + "copy-from": "generic_rc_underground" + }, + { + "type": "overmap_terrain", + "id": "evac_center_25_z-3", + "copy-from": "generic_rc_underground" + }, + { + "type": "overmap_terrain", + "id": "refctr_E1a_z-3", + "copy-from": "generic_rc_underground" + }, + { + "type": "overmap_terrain", + "id": "refctr_E2a_z-3", + "copy-from": "generic_rc_underground" + }, + { + "type": "overmap_terrain", + "id": "refctr_E3a_z-3", + "copy-from": "generic_rc_underground" + }, + { + "type": "overmap_terrain", + "id": "refctr_E4a_z-3", + "copy-from": "generic_rc_underground" + }, + { + "type": "overmap_terrain", + "id": "refctr_E5a_z-3", + "copy-from": "generic_rc_underground" + }, + { + "type": "overmap_terrain", + "id": "refctr_E1b_z-3", + "copy-from": "generic_rc_underground" + }, + { + "type": "overmap_terrain", + "id": "refctr_E2b_z-3", + "copy-from": "generic_rc_underground" + }, + { + "type": "overmap_terrain", + "id": "refctr_E3b_z-3", + "copy-from": "generic_rc_underground" + }, + { + "type": "overmap_terrain", + "id": "refctr_E4b_z-3", + "copy-from": "generic_rc_underground" + }, + { + "type": "overmap_terrain", + "id": "refctr_E5b_z-3", + "copy-from": "generic_rc_underground" + }, + { + "type": "overmap_terrain", + "id": "refctr_E1c_z-3", + "copy-from": "generic_rc_underground" + }, + { + "type": "overmap_terrain", + "id": "refctr_E2c_z-3", + "copy-from": "generic_rc_underground" + }, + { + "type": "overmap_terrain", + "id": "refctr_E3c_z-3", + "copy-from": "generic_rc_underground" + }, + { + "type": "overmap_terrain", + "id": "refctr_E4c_z-3", + "copy-from": "generic_rc_underground" + }, + { + "type": "overmap_terrain", + "id": "refctr_E5c_z-3", + "copy-from": "generic_rc_underground" + }, + { + "type": "overmap_terrain", + "id": "refctr_E1d_z-3", + "copy-from": "generic_rc_underground" + }, + { + "type": "overmap_terrain", + "id": "refctr_E2d_z-3", + "copy-from": "generic_rc_underground" + }, + { + "type": "overmap_terrain", + "id": "refctr_E3d_z-3", + "copy-from": "generic_rc_underground" + }, + { + "type": "overmap_terrain", + "id": "refctr_E4d_z-3", + "copy-from": "generic_rc_underground" + }, + { + "type": "overmap_terrain", + "id": "refctr_E5d_z-3", + "copy-from": "generic_rc_underground" + }, + { + "type": "overmap_terrain", + "id": "refctr_E1e_z-3", + "copy-from": "generic_rc_underground" + }, + { + "type": "overmap_terrain", + "id": "refctr_E2e_z-3", + "copy-from": "generic_rc_underground" + }, + { + "type": "overmap_terrain", + "id": "refctr_E3e_z-3", + "copy-from": "generic_rc_underground" + }, + { + "type": "overmap_terrain", + "id": "refctr_E4e_z-3", + "copy-from": "generic_rc_underground" + }, + { + "type": "overmap_terrain", + "id": "refctr_E5e_z-3", + "copy-from": "generic_rc_underground" + }, + { + "type": "overmap_terrain", + "id": "refctr_SW1a_z-3", + "copy-from": "generic_rc_underground" + }, + { + "type": "overmap_terrain", + "id": "refctr_SW2a_z-3", + "copy-from": "generic_rc_underground" + }, + { + "type": "overmap_terrain", + "id": "refctr_SW3a_z-3", + "copy-from": "generic_rc_underground" + }, + { + "type": "overmap_terrain", + "id": "refctr_SW4a_z-3", + "copy-from": "generic_rc_underground" + }, + { + "type": "overmap_terrain", + "id": "refctr_SW5a_z-3", + "copy-from": "generic_rc_underground" + }, + { + "type": "overmap_terrain", + "id": "refctr_SW1b_z-3", + "copy-from": "generic_rc_underground" + }, + { + "type": "overmap_terrain", + "id": "refctr_SW2b_z-3", + "copy-from": "generic_rc_underground" + }, + { + "type": "overmap_terrain", + "id": "refctr_SW3b_z-3", + "copy-from": "generic_rc_underground" + }, + { + "type": "overmap_terrain", + "id": "refctr_SW4b_z-3", + "copy-from": "generic_rc_underground" + }, + { + "type": "overmap_terrain", + "id": "refctr_SW5b_z-3", + "copy-from": "generic_rc_underground" + }, + { + "type": "overmap_terrain", + "id": "refctr_SW1c_z-3", + "copy-from": "generic_rc_underground" + }, + { + "type": "overmap_terrain", + "id": "refctr_SW2c_z-3", + "copy-from": "generic_rc_underground" + }, + { + "type": "overmap_terrain", + "id": "refctr_SW3c_z-3", + "copy-from": "generic_rc_underground" + }, + { + "type": "overmap_terrain", + "id": "refctr_SW4c_z-3", + "copy-from": "generic_rc_underground" + }, + { + "type": "overmap_terrain", + "id": "refctr_SW5c_z-3", + "copy-from": "generic_rc_underground" + }, + { + "type": "overmap_terrain", + "id": "refctr_SW1d_z-3", + "copy-from": "generic_rc_underground" + }, + { + "type": "overmap_terrain", + "id": "refctr_SW2d_z-3", + "copy-from": "generic_rc_underground" + }, + { + "type": "overmap_terrain", + "id": "refctr_SW3d_z-3", + "copy-from": "generic_rc_underground" + }, + { + "type": "overmap_terrain", + "id": "refctr_SW4d_z-3", + "copy-from": "generic_rc_underground" + }, + { + "type": "overmap_terrain", + "id": "refctr_SW5d_z-3", + "copy-from": "generic_rc_underground" + }, + { + "type": "overmap_terrain", + "id": "refctr_SW1e_z-3", + "copy-from": "generic_rc_underground" + }, + { + "type": "overmap_terrain", + "id": "refctr_SW2e_z-3", + "copy-from": "generic_rc_underground" + }, + { + "type": "overmap_terrain", + "id": "refctr_SW3e_z-3", + "copy-from": "generic_rc_underground" + }, + { + "type": "overmap_terrain", + "id": "refctr_SW4e_z-3", + "copy-from": "generic_rc_underground" + }, + { + "type": "overmap_terrain", + "id": "refctr_SW5e_z-3", + "copy-from": "generic_rc_underground" + }, + { + "type": "overmap_terrain", + "id": "refctr_S1a_z-3", + "copy-from": "generic_rc_underground" + }, + { + "type": "overmap_terrain", + "id": "refctr_S2a_z-3", + "copy-from": "generic_rc_underground" + }, + { + "type": "overmap_terrain", + "id": "refctr_S3a_z-3", + "copy-from": "generic_rc_underground" + }, + { + "type": "overmap_terrain", + "id": "refctr_S4a_z-3", + "copy-from": "generic_rc_underground" + }, + { + "type": "overmap_terrain", + "id": "refctr_S5a_z-3", + "copy-from": "generic_rc_underground" + }, + { + "type": "overmap_terrain", + "id": "refctr_S1b_z-3", + "copy-from": "generic_rc_underground" + }, + { + "type": "overmap_terrain", + "id": "refctr_S2b_z-3", + "copy-from": "generic_rc_underground" + }, + { + "type": "overmap_terrain", + "id": "refctr_S3b_z-3", + "copy-from": "generic_rc_underground" + }, + { + "type": "overmap_terrain", + "id": "refctr_S4b_z-3", + "copy-from": "generic_rc_underground" + }, + { + "type": "overmap_terrain", + "id": "refctr_S5b_z-3", + "copy-from": "generic_rc_underground" + }, + { + "type": "overmap_terrain", + "id": "refctr_S1c_z-3", + "copy-from": "generic_rc_underground" + }, + { + "type": "overmap_terrain", + "id": "refctr_S2c_z-3", + "copy-from": "generic_rc_underground" + }, + { + "type": "overmap_terrain", + "id": "refctr_S3c_z-3", + "copy-from": "generic_rc_underground" + }, + { + "type": "overmap_terrain", + "id": "refctr_S4c_z-3", + "copy-from": "generic_rc_underground" + }, + { + "type": "overmap_terrain", + "id": "refctr_S5c_z-3", + "copy-from": "generic_rc_underground" + }, + { + "type": "overmap_terrain", + "id": "refctr_S1d_z-3", + "copy-from": "generic_rc_underground" + }, + { + "type": "overmap_terrain", + "id": "refctr_S2d_z-3", + "copy-from": "generic_rc_underground" + }, + { + "type": "overmap_terrain", + "id": "refctr_S3d_z-3", + "copy-from": "generic_rc_underground" + }, + { + "type": "overmap_terrain", + "id": "refctr_S4d_z-3", + "copy-from": "generic_rc_underground" + }, + { + "type": "overmap_terrain", + "id": "refctr_S5d_z-3", + "copy-from": "generic_rc_underground" + }, + { + "type": "overmap_terrain", + "id": "refctr_S1e_z-3", + "copy-from": "generic_rc_underground" + }, + { + "type": "overmap_terrain", + "id": "refctr_S2e_z-3", + "copy-from": "generic_rc_underground" + }, + { + "type": "overmap_terrain", + "id": "refctr_S3e_z-3", + "copy-from": "generic_rc_underground" + }, + { + "type": "overmap_terrain", + "id": "refctr_S4e_z-3", + "copy-from": "generic_rc_underground" + }, + { + "type": "overmap_terrain", + "id": "refctr_S5e_z-3", + "copy-from": "generic_rc_underground" + }, + { + "type": "overmap_terrain", + "id": "refctr_SE1a_z-3", + "copy-from": "generic_rc_underground" + }, + { + "type": "overmap_terrain", + "id": "refctr_SE2a_z-3", + "copy-from": "generic_rc_underground" + }, + { + "type": "overmap_terrain", + "id": "refctr_SE3a_z-3", + "copy-from": "generic_rc_underground" + }, + { + "type": "overmap_terrain", + "id": "refctr_SE4a_z-3", + "copy-from": "generic_rc_underground" + }, + { + "type": "overmap_terrain", + "id": "refctr_SE5a_z-3", + "copy-from": "generic_rc_underground" + }, + { + "type": "overmap_terrain", + "id": "refctr_SE1b_z-3", + "copy-from": "generic_rc_underground" + }, + { + "type": "overmap_terrain", + "id": "refctr_SE2b_z-3", + "copy-from": "generic_rc_underground" + }, + { + "type": "overmap_terrain", + "id": "refctr_SE3b_z-3", + "copy-from": "generic_rc_underground" + }, + { + "type": "overmap_terrain", + "id": "refctr_SE4b_z-3", + "copy-from": "generic_rc_underground" + }, + { + "type": "overmap_terrain", + "id": "refctr_SE5b_z-3", + "copy-from": "generic_rc_underground" + }, + { + "type": "overmap_terrain", + "id": "refctr_SE1c_z-3", + "copy-from": "generic_rc_underground" + }, + { + "type": "overmap_terrain", + "id": "refctr_SE2c_z-3", + "copy-from": "generic_rc_underground" + }, + { + "type": "overmap_terrain", + "id": "refctr_SE3c_z-3", + "copy-from": "generic_rc_underground" + }, + { + "type": "overmap_terrain", + "id": "refctr_SE4c_z-3", + "copy-from": "generic_rc_underground" + }, + { + "type": "overmap_terrain", + "id": "refctr_SE5c_z-3", + "copy-from": "generic_rc_underground" + }, + { + "type": "overmap_terrain", + "id": "refctr_SE1d_z-3", + "copy-from": "generic_rc_underground" + }, + { + "type": "overmap_terrain", + "id": "refctr_SE2d_z-3", + "copy-from": "generic_rc_underground" + }, + { + "type": "overmap_terrain", + "id": "refctr_SE3d_z-3", + "copy-from": "generic_rc_underground" + }, + { + "type": "overmap_terrain", + "id": "refctr_SE4d_z-3", + "copy-from": "generic_rc_underground" + }, + { + "type": "overmap_terrain", + "id": "refctr_SE5d_z-3", + "copy-from": "generic_rc_underground" + }, + { + "type": "overmap_terrain", + "id": "refctr_SE1e_z-3", + "copy-from": "generic_rc_underground" + }, + { + "type": "overmap_terrain", + "id": "refctr_SE2e_z-3", + "copy-from": "generic_rc_underground" + }, + { + "type": "overmap_terrain", + "id": "refctr_SE3e_z-3", + "copy-from": "generic_rc_underground" + }, + { + "type": "overmap_terrain", + "id": "refctr_SE4e_z-3", + "copy-from": "generic_rc_underground" + }, + { + "type": "overmap_terrain", + "id": "refctr_SE5e_z-3", + "copy-from": "generic_rc_underground" + }, + { + "type": "overmap_terrain", + "id": "refctr_NW1a_z-4", + "copy-from": "generic_rc_underground" + }, + { + "type": "overmap_terrain", + "id": "refctr_NW2a_z-4", + "copy-from": "generic_rc_underground" + }, + { + "type": "overmap_terrain", + "id": "refctr_NW3a_z-4", + "copy-from": "generic_rc_underground" + }, + { + "type": "overmap_terrain", + "id": "refctr_NW4a_z-4", + "copy-from": "generic_rc_underground" + }, + { + "type": "overmap_terrain", + "id": "refctr_NW5a_z-4", + "copy-from": "generic_rc_underground" + }, + { + "type": "overmap_terrain", + "id": "refctr_NW1b_z-4", + "copy-from": "generic_rc_underground" + }, + { + "type": "overmap_terrain", + "id": "refctr_NW2b_z-4", + "copy-from": "generic_rc_underground" + }, + { + "type": "overmap_terrain", + "id": "refctr_NW3b_z-4", + "copy-from": "generic_rc_underground" + }, + { + "type": "overmap_terrain", + "id": "refctr_NW4b_z-4", + "copy-from": "generic_rc_underground" + }, + { + "type": "overmap_terrain", + "id": "refctr_NW5b_z-4", + "copy-from": "generic_rc_underground" + }, + { + "type": "overmap_terrain", + "id": "refctr_NW1c_z-4", + "copy-from": "generic_rc_underground" + }, + { + "type": "overmap_terrain", + "id": "refctr_NW2c_z-4", + "copy-from": "generic_rc_underground" + }, + { + "type": "overmap_terrain", + "id": "refctr_NW3c_z-4", + "copy-from": "generic_rc_underground" + }, + { + "type": "overmap_terrain", + "id": "refctr_NW4c_z-4", + "copy-from": "generic_rc_underground" + }, + { + "type": "overmap_terrain", + "id": "refctr_NW5c_z-4", + "copy-from": "generic_rc_underground" + }, + { + "type": "overmap_terrain", + "id": "refctr_NW1d_z-4", + "copy-from": "generic_rc_underground" + }, + { + "type": "overmap_terrain", + "id": "refctr_NW2d_z-4", + "copy-from": "generic_rc_underground" + }, + { + "type": "overmap_terrain", + "id": "refctr_NW3d_z-4", + "copy-from": "generic_rc_underground" + }, + { + "type": "overmap_terrain", + "id": "refctr_NW4d_z-4", + "copy-from": "generic_rc_underground" + }, + { + "type": "overmap_terrain", + "id": "refctr_NW5d_z-4", + "copy-from": "generic_rc_underground" + }, + { + "type": "overmap_terrain", + "id": "refctr_NW1e_z-4", + "copy-from": "generic_rc_underground" + }, + { + "type": "overmap_terrain", + "id": "refctr_NW2e_z-4", + "copy-from": "generic_rc_underground" + }, + { + "type": "overmap_terrain", + "id": "refctr_NW3e_z-4", + "copy-from": "generic_rc_underground" + }, + { + "type": "overmap_terrain", + "id": "refctr_NW4e_z-4", + "copy-from": "generic_rc_underground" + }, + { + "type": "overmap_terrain", + "id": "refctr_NW5e_z-4", + "copy-from": "generic_rc_underground" + }, + { + "type": "overmap_terrain", + "id": "refctr_N1a_z-4", + "copy-from": "generic_rc_underground" + }, + { + "type": "overmap_terrain", + "id": "refctr_N2a_z-4", + "copy-from": "generic_rc_underground" + }, + { + "type": "overmap_terrain", + "id": "refctr_N3a_z-4", + "copy-from": "generic_rc_underground" + }, + { + "type": "overmap_terrain", + "id": "refctr_N4a_z-4", + "copy-from": "generic_rc_underground" + }, + { + "type": "overmap_terrain", + "id": "refctr_N5a_z-4", + "copy-from": "generic_rc_underground" + }, + { + "type": "overmap_terrain", + "id": "refctr_N1b_z-4", + "copy-from": "generic_rc_underground" + }, + { + "type": "overmap_terrain", + "id": "refctr_N2b_z-4", + "copy-from": "generic_rc_underground" + }, + { + "type": "overmap_terrain", + "id": "refctr_N3b_z-4", + "copy-from": "generic_rc_underground" + }, + { + "type": "overmap_terrain", + "id": "refctr_N4b_z-4", + "copy-from": "generic_rc_underground" + }, + { + "type": "overmap_terrain", + "id": "refctr_N5b_z-4", + "copy-from": "generic_rc_underground" + }, + { + "type": "overmap_terrain", + "id": "refctr_N1c_z-4", + "copy-from": "generic_rc_underground" + }, + { + "type": "overmap_terrain", + "id": "refctr_N2c_z-4", + "copy-from": "generic_rc_underground" + }, + { + "type": "overmap_terrain", + "id": "refctr_N3c_z-4", + "copy-from": "generic_rc_underground" + }, + { + "type": "overmap_terrain", + "id": "refctr_N4c_z-4", + "copy-from": "generic_rc_underground" + }, + { + "type": "overmap_terrain", + "id": "refctr_N5c_z-4", + "copy-from": "generic_rc_underground" + }, + { + "type": "overmap_terrain", + "id": "refctr_N1d_z-4", + "copy-from": "generic_rc_underground" + }, + { + "type": "overmap_terrain", + "id": "refctr_N2d_z-4", + "copy-from": "generic_rc_underground" + }, + { + "type": "overmap_terrain", + "id": "refctr_N3d_z-4", + "copy-from": "generic_rc_underground" + }, + { + "type": "overmap_terrain", + "id": "refctr_N4d_z-4", + "copy-from": "generic_rc_underground" + }, + { + "type": "overmap_terrain", + "id": "refctr_N5d_z-4", + "copy-from": "generic_rc_underground" + }, + { + "type": "overmap_terrain", + "id": "refctr_N1e_z-4", + "copy-from": "generic_rc_underground" + }, + { + "type": "overmap_terrain", + "id": "refctr_N2e_z-4", + "copy-from": "generic_rc_underground" + }, + { + "type": "overmap_terrain", + "id": "refctr_N3e_z-4", + "copy-from": "generic_rc_underground" + }, + { + "type": "overmap_terrain", + "id": "refctr_N4e_z-4", + "copy-from": "generic_rc_underground" + }, + { + "type": "overmap_terrain", + "id": "refctr_N5e_z-4", + "copy-from": "generic_rc_underground" + }, + { + "type": "overmap_terrain", + "id": "refctr_NE1a_z-4", + "copy-from": "generic_rc_underground" + }, + { + "type": "overmap_terrain", + "id": "refctr_NE2a_z-4", + "copy-from": "generic_rc_underground" + }, + { + "type": "overmap_terrain", + "id": "refctr_NE3a_z-4", + "copy-from": "generic_rc_underground" + }, + { + "type": "overmap_terrain", + "id": "refctr_NE4a_z-4", + "copy-from": "generic_rc_underground" + }, + { + "type": "overmap_terrain", + "id": "refctr_NE5a_z-4", + "copy-from": "generic_rc_underground" + }, + { + "type": "overmap_terrain", + "id": "refctr_NE1b_z-4", + "copy-from": "generic_rc_underground" + }, + { + "type": "overmap_terrain", + "id": "refctr_NE2b_z-4", + "copy-from": "generic_rc_underground" + }, + { + "type": "overmap_terrain", + "id": "refctr_NE3b_z-4", + "copy-from": "generic_rc_underground" + }, + { + "type": "overmap_terrain", + "id": "refctr_NE4b_z-4", + "copy-from": "generic_rc_underground" + }, + { + "type": "overmap_terrain", + "id": "refctr_NE5b_z-4", + "copy-from": "generic_rc_underground" + }, + { + "type": "overmap_terrain", + "id": "refctr_NE1c_z-4", + "copy-from": "generic_rc_underground" + }, + { + "type": "overmap_terrain", + "id": "refctr_NE2c_z-4", + "copy-from": "generic_rc_underground" + }, + { + "type": "overmap_terrain", + "id": "refctr_NE3c_z-4", + "copy-from": "generic_rc_underground" + }, + { + "type": "overmap_terrain", + "id": "refctr_NE4c_z-4", + "copy-from": "generic_rc_underground" + }, + { + "type": "overmap_terrain", + "id": "refctr_NE5c_z-4", + "copy-from": "generic_rc_underground" + }, + { + "type": "overmap_terrain", + "id": "refctr_NE1d_z-4", + "copy-from": "generic_rc_underground" + }, + { + "type": "overmap_terrain", + "id": "refctr_NE2d_z-4", + "copy-from": "generic_rc_underground" + }, + { + "type": "overmap_terrain", + "id": "refctr_NE3d_z-4", + "copy-from": "generic_rc_underground" + }, + { + "type": "overmap_terrain", + "id": "refctr_NE4d_z-4", + "copy-from": "generic_rc_underground" + }, + { + "type": "overmap_terrain", + "id": "refctr_NE5d_z-4", + "copy-from": "generic_rc_underground" + }, + { + "type": "overmap_terrain", + "id": "refctr_NE1e_z-4", + "copy-from": "generic_rc_underground" + }, + { + "type": "overmap_terrain", + "id": "refctr_NE2e_z-4", + "copy-from": "generic_rc_underground" + }, + { + "type": "overmap_terrain", + "id": "refctr_NE3e_z-4", + "copy-from": "generic_rc_underground" + }, + { + "type": "overmap_terrain", + "id": "refctr_NE4e_z-4", + "copy-from": "generic_rc_underground" + }, + { + "type": "overmap_terrain", + "id": "refctr_NE5e_z-4", + "copy-from": "generic_rc_underground" + }, + { + "type": "overmap_terrain", + "id": "refctr_W1a_z-4", + "copy-from": "generic_rc_underground" + }, + { + "type": "overmap_terrain", + "id": "refctr_W2a_z-4", + "copy-from": "generic_rc_underground" + }, + { + "type": "overmap_terrain", + "id": "refctr_W3a_z-4", + "copy-from": "generic_rc_underground" + }, + { + "type": "overmap_terrain", + "id": "refctr_W4a_z-4", + "copy-from": "generic_rc_underground" + }, + { + "type": "overmap_terrain", + "id": "refctr_W5a_z-4", + "copy-from": "generic_rc_underground" + }, + { + "type": "overmap_terrain", + "id": "refctr_W1b_z-4", + "copy-from": "generic_rc_underground" + }, + { + "type": "overmap_terrain", + "id": "refctr_W2b_z-4", + "copy-from": "generic_rc_underground" + }, + { + "type": "overmap_terrain", + "id": "refctr_W3b_z-4", + "copy-from": "generic_rc_underground" + }, + { + "type": "overmap_terrain", + "id": "refctr_W4b_z-4", + "copy-from": "generic_rc_underground" + }, + { + "type": "overmap_terrain", + "id": "refctr_W5b_z-4", + "copy-from": "generic_rc_underground" + }, + { + "type": "overmap_terrain", + "id": "refctr_W1c_z-4", + "copy-from": "generic_rc_underground" + }, + { + "type": "overmap_terrain", + "id": "refctr_W2c_z-4", + "copy-from": "generic_rc_underground" + }, + { + "type": "overmap_terrain", + "id": "refctr_W3c_z-4", + "copy-from": "generic_rc_underground" + }, + { + "type": "overmap_terrain", + "id": "refctr_W4c_z-4", + "copy-from": "generic_rc_underground" + }, + { + "type": "overmap_terrain", + "id": "refctr_W5c_z-4", + "copy-from": "generic_rc_underground" + }, + { + "type": "overmap_terrain", + "id": "refctr_W1d_z-4", + "copy-from": "generic_rc_underground" + }, + { + "type": "overmap_terrain", + "id": "refctr_W2d_z-4", + "copy-from": "generic_rc_underground" + }, + { + "type": "overmap_terrain", + "id": "refctr_W3d_z-4", + "copy-from": "generic_rc_underground" + }, + { + "type": "overmap_terrain", + "id": "refctr_W4d_z-4", + "copy-from": "generic_rc_underground" + }, + { + "type": "overmap_terrain", + "id": "refctr_W5d_z-4", + "copy-from": "generic_rc_underground" + }, + { + "type": "overmap_terrain", + "id": "refctr_W1e_z-4", + "copy-from": "generic_rc_underground" + }, + { + "type": "overmap_terrain", + "id": "refctr_W2e_z-4", + "copy-from": "generic_rc_underground" + }, + { + "type": "overmap_terrain", + "id": "refctr_W3e_z-4", + "copy-from": "generic_rc_underground" + }, + { + "type": "overmap_terrain", + "id": "refctr_W4e_z-4", + "copy-from": "generic_rc_underground" + }, + { + "type": "overmap_terrain", + "id": "refctr_W5e_z-4", + "copy-from": "generic_rc_underground" + }, + { + "type": "overmap_terrain", + "id": "evac_center_1_z-4", + "copy-from": "generic_rc_underground" + }, + { + "type": "overmap_terrain", + "id": "evac_center_2_z-4", + "copy-from": "generic_rc_underground" + }, + { + "type": "overmap_terrain", + "id": "evac_center_3_z-4", + "copy-from": "generic_rc_underground" + }, + { + "type": "overmap_terrain", + "id": "evac_center_4_z-4", + "copy-from": "generic_rc_underground" + }, + { + "type": "overmap_terrain", + "id": "evac_center_5_z-4", + "copy-from": "generic_rc_underground" + }, + { + "type": "overmap_terrain", + "id": "evac_center_6_z-4", + "copy-from": "generic_rc_underground" + }, + { + "type": "overmap_terrain", + "id": "evac_center_7_z-4", + "copy-from": "generic_rc_underground" + }, + { + "type": "overmap_terrain", + "id": "evac_center_8_z-4", + "copy-from": "generic_rc_underground" + }, + { + "type": "overmap_terrain", + "id": "evac_center_9_z-4", + "copy-from": "generic_rc_underground" + }, + { + "type": "overmap_terrain", + "id": "evac_center_10_z-4", + "copy-from": "generic_rc_underground" + }, + { + "type": "overmap_terrain", + "id": "evac_center_11_z-4", + "copy-from": "generic_rc_underground" + }, + { + "type": "overmap_terrain", + "id": "evac_center_12_z-4", + "copy-from": "generic_rc_underground" + }, + { + "type": "overmap_terrain", + "id": "evac_center_13_z-4", + "copy-from": "generic_rc_underground" + }, + { + "type": "overmap_terrain", + "id": "evac_center_14_z-4", + "copy-from": "generic_rc_underground" + }, + { + "type": "overmap_terrain", + "id": "evac_center_15_z-4", + "copy-from": "generic_rc_underground" + }, + { + "type": "overmap_terrain", + "id": "evac_center_16_z-4", + "copy-from": "generic_rc_underground" + }, + { + "type": "overmap_terrain", + "id": "evac_center_17_z-4", + "copy-from": "generic_rc_underground" + }, + { + "type": "overmap_terrain", + "id": "evac_center_18_z-4", + "copy-from": "generic_rc_underground" + }, + { + "type": "overmap_terrain", + "id": "evac_center_19_z-4", + "copy-from": "generic_rc_underground" + }, + { + "type": "overmap_terrain", + "id": "evac_center_20_z-4", + "copy-from": "generic_rc_underground" + }, + { + "type": "overmap_terrain", + "id": "evac_center_21_z-4", + "copy-from": "generic_rc_underground" + }, + { + "type": "overmap_terrain", + "id": "evac_center_22_z-4", + "copy-from": "generic_rc_underground" + }, + { + "type": "overmap_terrain", + "id": "evac_center_23_z-4", + "copy-from": "generic_rc_underground" + }, + { + "type": "overmap_terrain", + "id": "evac_center_24_z-4", + "copy-from": "generic_rc_underground" + }, + { + "type": "overmap_terrain", + "id": "evac_center_25_z-4", + "copy-from": "generic_rc_underground" + }, + { + "type": "overmap_terrain", + "id": "refctr_E1a_z-4", + "copy-from": "generic_rc_underground" + }, + { + "type": "overmap_terrain", + "id": "refctr_E2a_z-4", + "copy-from": "generic_rc_underground" + }, + { + "type": "overmap_terrain", + "id": "refctr_E3a_z-4", + "copy-from": "generic_rc_underground" + }, + { + "type": "overmap_terrain", + "id": "refctr_E4a_z-4", + "copy-from": "generic_rc_underground" + }, + { + "type": "overmap_terrain", + "id": "refctr_E5a_z-4", + "copy-from": "generic_rc_underground" + }, + { + "type": "overmap_terrain", + "id": "refctr_E1b_z-4", + "copy-from": "generic_rc_underground" + }, + { + "type": "overmap_terrain", + "id": "refctr_E2b_z-4", + "copy-from": "generic_rc_underground" + }, + { + "type": "overmap_terrain", + "id": "refctr_E3b_z-4", + "copy-from": "generic_rc_underground" + }, + { + "type": "overmap_terrain", + "id": "refctr_E4b_z-4", + "copy-from": "generic_rc_underground" + }, + { + "type": "overmap_terrain", + "id": "refctr_E5b_z-4", + "copy-from": "generic_rc_underground" + }, + { + "type": "overmap_terrain", + "id": "refctr_E1c_z-4", + "copy-from": "generic_rc_underground" + }, + { + "type": "overmap_terrain", + "id": "refctr_E2c_z-4", + "copy-from": "generic_rc_underground" + }, + { + "type": "overmap_terrain", + "id": "refctr_E3c_z-4", + "copy-from": "generic_rc_underground" + }, + { + "type": "overmap_terrain", + "id": "refctr_E4c_z-4", + "copy-from": "generic_rc_underground" + }, + { + "type": "overmap_terrain", + "id": "refctr_E5c_z-4", + "copy-from": "generic_rc_underground" + }, + { + "type": "overmap_terrain", + "id": "refctr_E1d_z-4", + "copy-from": "generic_rc_underground" + }, + { + "type": "overmap_terrain", + "id": "refctr_E2d_z-4", + "copy-from": "generic_rc_underground" + }, + { + "type": "overmap_terrain", + "id": "refctr_E3d_z-4", + "copy-from": "generic_rc_underground" + }, + { + "type": "overmap_terrain", + "id": "refctr_E4d_z-4", + "copy-from": "generic_rc_underground" + }, + { + "type": "overmap_terrain", + "id": "refctr_E5d_z-4", + "copy-from": "generic_rc_underground" + }, + { + "type": "overmap_terrain", + "id": "refctr_E1e_z-4", + "copy-from": "generic_rc_underground" + }, + { + "type": "overmap_terrain", + "id": "refctr_E2e_z-4", + "copy-from": "generic_rc_underground" + }, + { + "type": "overmap_terrain", + "id": "refctr_E3e_z-4", + "copy-from": "generic_rc_underground" + }, + { + "type": "overmap_terrain", + "id": "refctr_E4e_z-4", + "copy-from": "generic_rc_underground" + }, + { + "type": "overmap_terrain", + "id": "refctr_E5e_z-4", + "copy-from": "generic_rc_underground" + }, + { + "type": "overmap_terrain", + "id": "refctr_SW1a_z-4", + "copy-from": "generic_rc_underground" + }, + { + "type": "overmap_terrain", + "id": "refctr_SW2a_z-4", + "copy-from": "generic_rc_underground" + }, + { + "type": "overmap_terrain", + "id": "refctr_SW3a_z-4", + "copy-from": "generic_rc_underground" + }, + { + "type": "overmap_terrain", + "id": "refctr_SW4a_z-4", + "copy-from": "generic_rc_underground" + }, + { + "type": "overmap_terrain", + "id": "refctr_SW5a_z-4", + "copy-from": "generic_rc_underground" + }, + { + "type": "overmap_terrain", + "id": "refctr_SW1b_z-4", + "copy-from": "generic_rc_underground" + }, + { + "type": "overmap_terrain", + "id": "refctr_SW2b_z-4", + "copy-from": "generic_rc_underground" + }, + { + "type": "overmap_terrain", + "id": "refctr_SW3b_z-4", + "copy-from": "generic_rc_underground" + }, + { + "type": "overmap_terrain", + "id": "refctr_SW4b_z-4", + "copy-from": "generic_rc_underground" + }, + { + "type": "overmap_terrain", + "id": "refctr_SW5b_z-4", + "copy-from": "generic_rc_underground" + }, + { + "type": "overmap_terrain", + "id": "refctr_SW1c_z-4", + "copy-from": "generic_rc_underground" + }, + { + "type": "overmap_terrain", + "id": "refctr_SW2c_z-4", + "copy-from": "generic_rc_underground" + }, + { + "type": "overmap_terrain", + "id": "refctr_SW3c_z-4", + "copy-from": "generic_rc_underground" + }, + { + "type": "overmap_terrain", + "id": "refctr_SW4c_z-4", + "copy-from": "generic_rc_underground" + }, + { + "type": "overmap_terrain", + "id": "refctr_SW5c_z-4", + "copy-from": "generic_rc_underground" + }, + { + "type": "overmap_terrain", + "id": "refctr_SW1d_z-4", + "copy-from": "generic_rc_underground" + }, + { + "type": "overmap_terrain", + "id": "refctr_SW2d_z-4", + "copy-from": "generic_rc_underground" + }, + { + "type": "overmap_terrain", + "id": "refctr_SW3d_z-4", + "copy-from": "generic_rc_underground" + }, + { + "type": "overmap_terrain", + "id": "refctr_SW4d_z-4", + "copy-from": "generic_rc_underground" + }, + { + "type": "overmap_terrain", + "id": "refctr_SW5d_z-4", + "copy-from": "generic_rc_underground" + }, + { + "type": "overmap_terrain", + "id": "refctr_SW1e_z-4", + "copy-from": "generic_rc_underground" + }, + { + "type": "overmap_terrain", + "id": "refctr_SW2e_z-4", + "copy-from": "generic_rc_underground" + }, + { + "type": "overmap_terrain", + "id": "refctr_SW3e_z-4", + "copy-from": "generic_rc_underground" + }, + { + "type": "overmap_terrain", + "id": "refctr_SW4e_z-4", + "copy-from": "generic_rc_underground" + }, + { + "type": "overmap_terrain", + "id": "refctr_SW5e_z-4", + "copy-from": "generic_rc_underground" + }, + { + "type": "overmap_terrain", + "id": "refctr_S1a_z-4", + "copy-from": "generic_rc_underground" + }, + { + "type": "overmap_terrain", + "id": "refctr_S2a_z-4", + "copy-from": "generic_rc_underground" + }, + { + "type": "overmap_terrain", + "id": "refctr_S3a_z-4", + "copy-from": "generic_rc_underground" + }, + { + "type": "overmap_terrain", + "id": "refctr_S4a_z-4", + "copy-from": "generic_rc_underground" + }, + { + "type": "overmap_terrain", + "id": "refctr_S5a_z-4", + "copy-from": "generic_rc_underground" + }, + { + "type": "overmap_terrain", + "id": "refctr_S1b_z-4", + "copy-from": "generic_rc_underground" + }, + { + "type": "overmap_terrain", + "id": "refctr_S2b_z-4", + "copy-from": "generic_rc_underground" + }, + { + "type": "overmap_terrain", + "id": "refctr_S3b_z-4", + "copy-from": "generic_rc_underground" + }, + { + "type": "overmap_terrain", + "id": "refctr_S4b_z-4", + "copy-from": "generic_rc_underground" + }, + { + "type": "overmap_terrain", + "id": "refctr_S5b_z-4", + "copy-from": "generic_rc_underground" + }, + { + "type": "overmap_terrain", + "id": "refctr_S1c_z-4", + "copy-from": "generic_rc_underground" + }, + { + "type": "overmap_terrain", + "id": "refctr_S2c_z-4", + "copy-from": "generic_rc_underground" + }, + { + "type": "overmap_terrain", + "id": "refctr_S3c_z-4", + "copy-from": "generic_rc_underground" + }, + { + "type": "overmap_terrain", + "id": "refctr_S4c_z-4", + "copy-from": "generic_rc_underground" + }, + { + "type": "overmap_terrain", + "id": "refctr_S5c_z-4", + "copy-from": "generic_rc_underground" + }, + { + "type": "overmap_terrain", + "id": "refctr_S1d_z-4", + "copy-from": "generic_rc_underground" + }, + { + "type": "overmap_terrain", + "id": "refctr_S2d_z-4", + "copy-from": "generic_rc_underground" + }, + { + "type": "overmap_terrain", + "id": "refctr_S3d_z-4", + "copy-from": "generic_rc_underground" + }, + { + "type": "overmap_terrain", + "id": "refctr_S4d_z-4", + "copy-from": "generic_rc_underground" + }, + { + "type": "overmap_terrain", + "id": "refctr_S5d_z-4", + "copy-from": "generic_rc_underground" + }, + { + "type": "overmap_terrain", + "id": "refctr_S1e_z-4", + "copy-from": "generic_rc_underground" + }, + { + "type": "overmap_terrain", + "id": "refctr_S2e_z-4", + "copy-from": "generic_rc_underground" + }, + { + "type": "overmap_terrain", + "id": "refctr_S3e_z-4", + "copy-from": "generic_rc_underground" + }, + { + "type": "overmap_terrain", + "id": "refctr_S4e_z-4", + "copy-from": "generic_rc_underground" + }, + { + "type": "overmap_terrain", + "id": "refctr_S5e_z-4", + "copy-from": "generic_rc_underground" + }, + { + "type": "overmap_terrain", + "id": "refctr_SE1a_z-4", + "copy-from": "generic_rc_underground" + }, + { + "type": "overmap_terrain", + "id": "refctr_SE2a_z-4", + "copy-from": "generic_rc_underground" + }, + { + "type": "overmap_terrain", + "id": "refctr_SE3a_z-4", + "copy-from": "generic_rc_underground" + }, + { + "type": "overmap_terrain", + "id": "refctr_SE4a_z-4", + "copy-from": "generic_rc_underground" + }, + { + "type": "overmap_terrain", + "id": "refctr_SE5a_z-4", + "copy-from": "generic_rc_underground" + }, + { + "type": "overmap_terrain", + "id": "refctr_SE1b_z-4", + "copy-from": "generic_rc_underground" + }, + { + "type": "overmap_terrain", + "id": "refctr_SE2b_z-4", + "copy-from": "generic_rc_underground" + }, + { + "type": "overmap_terrain", + "id": "refctr_SE3b_z-4", + "copy-from": "generic_rc_underground" + }, + { + "type": "overmap_terrain", + "id": "refctr_SE4b_z-4", + "copy-from": "generic_rc_underground" + }, + { + "type": "overmap_terrain", + "id": "refctr_SE5b_z-4", + "copy-from": "generic_rc_underground" + }, + { + "type": "overmap_terrain", + "id": "refctr_SE1c_z-4", + "copy-from": "generic_rc_underground" + }, + { + "type": "overmap_terrain", + "id": "refctr_SE2c_z-4", + "copy-from": "generic_rc_underground" + }, + { + "type": "overmap_terrain", + "id": "refctr_SE3c_z-4", + "copy-from": "generic_rc_underground" + }, + { + "type": "overmap_terrain", + "id": "refctr_SE4c_z-4", + "copy-from": "generic_rc_underground" + }, + { + "type": "overmap_terrain", + "id": "refctr_SE5c_z-4", + "copy-from": "generic_rc_underground" + }, + { + "type": "overmap_terrain", + "id": "refctr_SE1d_z-4", + "copy-from": "generic_rc_underground" + }, + { + "type": "overmap_terrain", + "id": "refctr_SE2d_z-4", + "copy-from": "generic_rc_underground" + }, + { + "type": "overmap_terrain", + "id": "refctr_SE3d_z-4", + "copy-from": "generic_rc_underground" + }, + { + "type": "overmap_terrain", + "id": "refctr_SE4d_z-4", + "copy-from": "generic_rc_underground" + }, + { + "type": "overmap_terrain", + "id": "refctr_SE5d_z-4", + "copy-from": "generic_rc_underground" + }, + { + "type": "overmap_terrain", + "id": "refctr_SE1e_z-4", + "copy-from": "generic_rc_underground" + }, + { + "type": "overmap_terrain", + "id": "refctr_SE2e_z-4", + "copy-from": "generic_rc_underground" + }, + { + "type": "overmap_terrain", + "id": "refctr_SE3e_z-4", + "copy-from": "generic_rc_underground" + }, + { + "type": "overmap_terrain", + "id": "refctr_SE4e_z-4", + "copy-from": "generic_rc_underground" + }, + { + "type": "overmap_terrain", + "id": "refctr_SE5e_z-4", + "copy-from": "generic_rc_underground" + } +] diff --git a/data/json/overmap_terrain_faction_base.json b/data/json/overmap/overmap_terrain/overmap_terrain_faction_base.json similarity index 100% rename from data/json/overmap_terrain_faction_base.json rename to data/json/overmap/overmap_terrain/overmap_terrain_faction_base.json diff --git a/data/json/overmap_terrain_hardcoded.json b/data/json/overmap/overmap_terrain/overmap_terrain_hardcoded.json similarity index 100% rename from data/json/overmap_terrain_hardcoded.json rename to data/json/overmap/overmap_terrain/overmap_terrain_hardcoded.json diff --git a/data/json/overmap_terrain_industrial.json b/data/json/overmap/overmap_terrain/overmap_terrain_industrial.json similarity index 100% rename from data/json/overmap_terrain_industrial.json rename to data/json/overmap/overmap_terrain/overmap_terrain_industrial.json diff --git a/data/json/overmap_terrain_lab.json b/data/json/overmap/overmap_terrain/overmap_terrain_lab.json similarity index 100% rename from data/json/overmap_terrain_lab.json rename to data/json/overmap/overmap_terrain/overmap_terrain_lab.json diff --git a/data/json/overmap_terrain_mall.json b/data/json/overmap/overmap_terrain/overmap_terrain_mall.json similarity index 100% rename from data/json/overmap_terrain_mall.json rename to data/json/overmap/overmap_terrain/overmap_terrain_mall.json diff --git a/data/json/overmap_terrain_mansion.json b/data/json/overmap/overmap_terrain/overmap_terrain_mansion.json similarity index 100% rename from data/json/overmap_terrain_mansion.json rename to data/json/overmap/overmap_terrain/overmap_terrain_mansion.json diff --git a/data/json/overmap_terrain_military.json b/data/json/overmap/overmap_terrain/overmap_terrain_military.json similarity index 92% rename from data/json/overmap_terrain_military.json rename to data/json/overmap/overmap_terrain/overmap_terrain_military.json index 3af35e2c78054..e3432cad20037 100644 --- a/data/json/overmap_terrain_military.json +++ b/data/json/overmap/overmap_terrain/overmap_terrain_military.json @@ -91,6 +91,15 @@ "see_cost": 2, "flags": [ "KNOWN_DOWN", "NO_ROTATE" ] }, + { + "type": "overmap_terrain", + "id": "lmoe_roof", + "name": "LMOE shelter", + "sym": ".", + "color": "brown", + "see_cost": 2, + "flags": [ "KNOWN_DOWN", "NO_ROTATE" ] + }, { "type": "overmap_terrain", "id": "lmoe_under", @@ -100,6 +109,15 @@ "see_cost": 2, "flags": [ "KNOWN_UP", "NO_ROTATE" ] }, + { + "type": "overmap_terrain", + "id": "lmoe_under_empty", + "name": "LMOE shelter", + "sym": "+", + "color": "red", + "see_cost": 2, + "flags": [ "KNOWN_UP", "NO_ROTATE" ] + }, { "type": "overmap_terrain", "id": "bunker", diff --git a/data/json/overmap_terrain_necropolis.json b/data/json/overmap/overmap_terrain/overmap_terrain_necropolis.json similarity index 100% rename from data/json/overmap_terrain_necropolis.json rename to data/json/overmap/overmap_terrain/overmap_terrain_necropolis.json diff --git a/data/json/overmap_terrain_public_institutional.json b/data/json/overmap/overmap_terrain/overmap_terrain_public_institutional.json similarity index 88% rename from data/json/overmap_terrain_public_institutional.json rename to data/json/overmap/overmap_terrain/overmap_terrain_public_institutional.json index 24c589c1b3fb3..76c01fd18718a 100644 --- a/data/json/overmap_terrain_public_institutional.json +++ b/data/json/overmap/overmap_terrain/overmap_terrain_public_institutional.json @@ -125,6 +125,41 @@ "copy-from": "generic_city_building", "color": "i_brown" }, + { + "type": "overmap_terrain", + "id": "s_library_roof", + "name": "library roof", + "copy-from": "generic_city_building", + "color": "i_brown" + }, + { + "type": "overmap_terrain", + "id": "s_library_1", + "name": "library", + "copy-from": "generic_city_building", + "color": "i_brown" + }, + { + "type": "overmap_terrain", + "id": "s_library_roof_1", + "name": "library roof", + "copy-from": "generic_city_building", + "color": "i_brown" + }, + { + "type": "overmap_terrain", + "id": "s_library_2", + "name": "library", + "copy-from": "generic_city_building", + "color": "i_brown" + }, + { + "type": "overmap_terrain", + "id": "s_library_roof_2", + "name": "library roof", + "copy-from": "generic_city_building", + "color": "i_brown" + }, { "type": "overmap_terrain", "id": "police", @@ -1106,5 +1141,116 @@ "color": "green", "see_cost": 2, "mondensity": 2 + }, + { + "type": "overmap_terrain", + "id": "town_hall_0_0_0", + "name": "town hall", + "sym": "^", + "color": "i_black", + "see_cost": 2, + "mondensity": 2, + "flags": [ "SIDEWALK" ] + }, + { + "type": "overmap_terrain", + "id": "town_hall_1_0_0", + "name": "town hall", + "sym": "^", + "color": "i_black", + "see_cost": 2, + "mondensity": 2, + "flags": [ "SIDEWALK" ] + }, + { + "type": "overmap_terrain", + "id": "town_hall_0_1_0", + "name": "town hall", + "sym": "^", + "color": "i_black", + "see_cost": 2, + "flags": [ "SIDEWALK" ] + }, + { + "type": "overmap_terrain", + "id": "town_hall_1_1_0", + "name": "town hall", + "sym": "^", + "color": "i_black", + "see_cost": 2, + "mondensity": 2, + "flags": [ "SIDEWALK" ] + }, + { + "type": "overmap_terrain", + "id": "town_hall_0_0_1", + "name": "town hall", + "sym": "^", + "color": "i_black", + "see_cost": 2, + "mondensity": 2 + }, + { + "type": "overmap_terrain", + "id": "town_hall_1_0_1", + "name": "town hall", + "sym": "^", + "color": "i_black", + "see_cost": 2, + "mondensity": 2 + }, + { + "type": "overmap_terrain", + "id": "town_hall_0_1_1", + "name": "town hall", + "sym": "^", + "color": "i_black", + "see_cost": 2, + "mondensity": 2 + }, + { + "type": "overmap_terrain", + "id": "town_hall_1_1_1", + "name": "town hall", + "sym": "^", + "color": "i_black", + "see_cost": 2, + "mondensity": 2 + }, + { + "type": "overmap_terrain", + "id": "town_hall_0_0_roof", + "name": "town hall", + "sym": ".", + "color": "light_blue", + "see_cost": 2, + "mondensity": 2 + }, + { + "type": "overmap_terrain", + "id": "town_hall_1_0_roof", + "name": "town hall", + "sym": ".", + "color": "light_blue", + "see_cost": 2, + "mondensity": 2 + }, + { + "type": "overmap_terrain", + "id": "town_hall_0_1_roof", + "name": "town hall", + "sym": ".", + "color": "light_blue", + "see_cost": 2, + "mondensity": 2 + }, + { + "type": "overmap_terrain", + "id": "town_hall_1_1_roof", + "name": "town hall", + "sym": ".", + "color": "light_blue", + "see_cost": 2, + "mondensity": 2 } ] diff --git a/data/json/overmap_terrain_ranch_camp.json b/data/json/overmap/overmap_terrain/overmap_terrain_ranch_camp.json similarity index 100% rename from data/json/overmap_terrain_ranch_camp.json rename to data/json/overmap/overmap_terrain/overmap_terrain_ranch_camp.json diff --git a/data/json/overmap_terrain_recreational.json b/data/json/overmap/overmap_terrain/overmap_terrain_recreational.json similarity index 97% rename from data/json/overmap_terrain_recreational.json rename to data/json/overmap/overmap_terrain/overmap_terrain_recreational.json index e64a3b5dc076f..1915ae5bd3ddf 100644 --- a/data/json/overmap_terrain_recreational.json +++ b/data/json/overmap/overmap_terrain/overmap_terrain_recreational.json @@ -957,6 +957,38 @@ "sym": "M", "color": "i_light_blue" }, + { + "type": "overmap_terrain", + "id": "music_venue_roof", + "copy-from": "generic_city_building", + "name": "music venue roof", + "sym": "M", + "color": "i_light_blue" + }, + { + "type": "overmap_terrain", + "id": "music_venue_1", + "copy-from": "generic_city_building", + "name": "music venue", + "sym": "M", + "color": "i_light_blue" + }, + { + "type": "overmap_terrain", + "id": "music_venue_1_roof", + "copy-from": "generic_city_building", + "name": "music venue roof", + "sym": "M", + "color": "i_light_blue" + }, + { + "type": "overmap_terrain", + "id": "music_venue_1_roof_top", + "copy-from": "generic_city_building", + "name": "music venue roof", + "sym": "M", + "color": "i_light_blue" + }, { "type": "overmap_terrain", "id": "gambling_hall", diff --git a/data/json/overmap_terrain_residential.json b/data/json/overmap/overmap_terrain/overmap_terrain_residential.json similarity index 95% rename from data/json/overmap_terrain_residential.json rename to data/json/overmap/overmap_terrain/overmap_terrain_residential.json index 055d87b896221..36150635cd327 100644 --- a/data/json/overmap_terrain_residential.json +++ b/data/json/overmap/overmap_terrain/overmap_terrain_residential.json @@ -342,5 +342,24 @@ "sym": "X", "color": "i_brown", "extras": "field" + }, + { + "type": "overmap_terrain", + "id": "house_2story_base", + "name": "house", + "sym": "^", + "color": "light_green", + "see_cost": 2, + "mondensity": 2, + "flags": [ "SIDEWALK" ] + }, + { + "type": "overmap_terrain", + "id": "house_2story_second", + "name": "house", + "sym": "^", + "color": "light_green", + "see_cost": 2, + "mondensity": 2 } ] diff --git a/data/json/overmap_terrain_river.json b/data/json/overmap/overmap_terrain/overmap_terrain_river.json similarity index 100% rename from data/json/overmap_terrain_river.json rename to data/json/overmap/overmap_terrain/overmap_terrain_river.json diff --git a/data/json/overmap_terrain_robofachq.json b/data/json/overmap/overmap_terrain/overmap_terrain_robofachq.json similarity index 100% rename from data/json/overmap_terrain_robofachq.json rename to data/json/overmap/overmap_terrain/overmap_terrain_robofachq.json diff --git a/data/json/overmap_terrain_transportation.json b/data/json/overmap/overmap_terrain/overmap_terrain_transportation.json similarity index 100% rename from data/json/overmap_terrain_transportation.json rename to data/json/overmap/overmap_terrain/overmap_terrain_transportation.json diff --git a/data/json/overmap_terrain_waste_junk.json b/data/json/overmap/overmap_terrain/overmap_terrain_waste_junk.json similarity index 100% rename from data/json/overmap_terrain_waste_junk.json rename to data/json/overmap/overmap_terrain/overmap_terrain_waste_junk.json diff --git a/data/json/overmap_terrain_waterbody.json b/data/json/overmap/overmap_terrain/overmap_terrain_waterbody.json similarity index 100% rename from data/json/overmap_terrain_waterbody.json rename to data/json/overmap/overmap_terrain/overmap_terrain_waterbody.json diff --git a/data/json/overmap_terrain_evac_center.json b/data/json/overmap_terrain_evac_center.json deleted file mode 100644 index 5921e3c93f7dd..0000000000000 --- a/data/json/overmap_terrain_evac_center.json +++ /dev/null @@ -1,208 +0,0 @@ -[ - { - "type": "overmap_terrain", - "abstract": "generic_evac_center", - "see_cost": 5, - "mondensity": 2 - }, - { - "type": "overmap_terrain", - "id": "evac_center_1", - "copy-from": "generic_evac_center", - "name": "road", - "sym": "┌", - "color": "dark_gray" - }, - { - "type": "overmap_terrain", - "id": "evac_center_2", - "copy-from": "generic_evac_center", - "name": "road", - "sym": "─", - "color": "dark_gray" - }, - { - "type": "overmap_terrain", - "id": "evac_center_3", - "copy-from": "generic_evac_center", - "name": "road", - "sym": "─", - "color": "dark_gray" - }, - { - "type": "overmap_terrain", - "id": "evac_center_4", - "copy-from": "generic_evac_center", - "name": "road", - "sym": "─", - "color": "dark_gray" - }, - { - "type": "overmap_terrain", - "id": "evac_center_5", - "copy-from": "generic_evac_center", - "name": "road", - "sym": "┐", - "color": "dark_gray" - }, - { - "type": "overmap_terrain", - "id": "evac_center_6", - "copy-from": "generic_evac_center", - "name": "road", - "sym": "│", - "color": "dark_gray" - }, - { - "type": "overmap_terrain", - "id": "evac_center_7", - "copy-from": "generic_evac_center", - "name": "refugee center", - "sym": "┼", - "color": "white" - }, - { - "type": "overmap_terrain", - "id": "evac_center_8", - "copy-from": "generic_evac_center", - "name": "refugee center", - "sym": "┼", - "color": "white" - }, - { - "type": "overmap_terrain", - "id": "evac_center_9", - "copy-from": "generic_evac_center", - "name": "refugee center", - "sym": "┼", - "color": "white" - }, - { - "type": "overmap_terrain", - "id": "evac_center_10", - "copy-from": "generic_evac_center", - "name": "road", - "sym": "│", - "color": "dark_gray" - }, - { - "type": "overmap_terrain", - "id": "evac_center_11", - "copy-from": "generic_evac_center", - "name": "road", - "sym": "│", - "color": "dark_gray" - }, - { - "type": "overmap_terrain", - "id": "evac_center_12", - "copy-from": "generic_evac_center", - "name": "refugee center", - "sym": "┼", - "color": "white" - }, - { - "type": "overmap_terrain", - "id": "evac_center_13", - "copy-from": "generic_evac_center", - "name": "refugee center", - "sym": "┼", - "color": "white" - }, - { - "type": "overmap_terrain", - "id": "evac_center_14", - "copy-from": "generic_evac_center", - "name": "refugee center", - "sym": "┼", - "color": "white" - }, - { - "type": "overmap_terrain", - "id": "evac_center_15", - "copy-from": "generic_evac_center", - "name": "road", - "sym": "│", - "color": "dark_gray" - }, - { - "type": "overmap_terrain", - "id": "evac_center_16", - "copy-from": "generic_evac_center", - "name": "road", - "sym": "│", - "color": "dark_gray" - }, - { - "type": "overmap_terrain", - "id": "evac_center_17", - "copy-from": "generic_evac_center", - "name": "refugee center", - "sym": "┼", - "color": "white" - }, - { - "type": "overmap_terrain", - "id": "evac_center_18", - "copy-from": "generic_evac_center", - "name": "refugee center", - "sym": "┼", - "color": "white" - }, - { - "type": "overmap_terrain", - "id": "evac_center_19", - "copy-from": "generic_evac_center", - "name": "refugee center", - "sym": "┼", - "color": "white" - }, - { - "type": "overmap_terrain", - "id": "evac_center_20", - "copy-from": "generic_evac_center", - "name": "road", - "sym": "│", - "color": "dark_gray" - }, - { - "type": "overmap_terrain", - "id": "evac_center_21", - "copy-from": "generic_evac_center", - "name": "road", - "sym": "└", - "color": "dark_gray" - }, - { - "type": "overmap_terrain", - "id": "evac_center_22", - "copy-from": "generic_evac_center", - "name": "road", - "sym": "─", - "color": "dark_gray" - }, - { - "type": "overmap_terrain", - "id": "evac_center_23", - "copy-from": "generic_evac_center", - "name": "road", - "sym": "┬", - "color": "dark_gray" - }, - { - "type": "overmap_terrain", - "id": "evac_center_24", - "copy-from": "generic_evac_center", - "name": "road", - "sym": "─", - "color": "dark_gray" - }, - { - "type": "overmap_terrain", - "id": "evac_center_25", - "copy-from": "generic_evac_center", - "name": "road", - "sym": "┘", - "color": "dark_gray" - } -] diff --git a/data/json/player_activities.json b/data/json/player_activities.json index b40ee75d09e91..aff0dce69368b 100644 --- a/data/json/player_activities.json +++ b/data/json/player_activities.json @@ -25,6 +25,15 @@ "based_on": "neither", "no_resume": true }, + { + "id": "ACT_BLUEPRINT_CONSTRUCTION", + "type": "activity_type", + "activity_level": "ACTIVE_EXERCISE", + "verb": "constructing", + "suspendable": false, + "based_on": "neither", + "no_resume": true + }, { "id": "ACT_GAME", "type": "activity_type", @@ -609,6 +618,7 @@ "activity_level": "NO_EXERCISE", "verb": "studying", "suspendable": false, + "refuel_fires": true, "rooted": true, "based_on": "time", "no_resume": true diff --git a/data/json/professions.json b/data/json/professions.json index e68bcec4ac4f7..7835b1fd608c5 100644 --- a/data/json/professions.json +++ b/data/json/professions.json @@ -22,21 +22,12 @@ { "type": "item_group", "subtype": "collection", - "id": "army_mags_rm51", + "id": "army_mags_m2010", "entries": [ - { "item": "8x40_50_mag", "ammo-item": "8mm_fmj", "charges": 50 }, - { "item": "8x40_50_mag", "ammo-item": "8mm_fmj", "charges": 50 } - ] - }, - { - "type": "item_group", - "subtype": "collection", - "id": "army_mags_rm25", - "entries": [ - { "item": "8x40_25_mag", "ammo-item": "8mm_fmj", "charges": 25 }, - { "item": "8x40_25_mag", "ammo-item": "8mm_fmj", "charges": 25 }, - { "item": "8x40_25_mag", "ammo-item": "8mm_fmj", "charges": 25 }, - { "item": "8x40_25_mag", "ammo-item": "8mm_fmj", "charges": 25 } + { "item": "m2010mag", "ammo-item": "300_winmag", "charges": 5 }, + { "item": "m2010mag", "ammo-item": "300_winmag", "charges": 5 }, + { "item": "m2010mag", "ammo-item": "300_winmag", "charges": 5 }, + { "item": "m2010mag", "ammo-item": "300_winmag", "charges": 5 } ] }, { @@ -69,10 +60,10 @@ { "type": "item_group", "subtype": "collection", - "id": "army_mags_lw21", + "id": "army_mags_glock17", "entries": [ - { "item": "lw21mag", "ammo-item": "9mmfmj", "charges": 21 }, - { "item": "lw21mag", "ammo-item": "9mmfmj", "charges": 21 } + { "item": "glock17_22", "ammo-item": "9mmfmj", "charges": 22 }, + { "item": "glock17_22", "ammo-item": "9mmfmj", "charges": 22 } ] }, { @@ -552,6 +543,33 @@ "female": [ "sports_bra", "panties" ] } }, + { + "type": "profession", + "ident": "true_foodperson", + "name": "True Foodperson", + "description": "You are the true Foodperson, some might think Foodperson is just a mascot, but you know better. You are Foodperson, the mask has become your face, you are real and the only thing standing between this world and oblivion is you.", + "points": 0, + "traits": [ "PROF_FOODP" ], + "skills": [ { "level": 2, "name": "speech" } ], + "items": { + "both": { + "items": [ + "foodperson_mask", + "pants_cargo", + "briefs", + "cape_fp", + "dress_shirt", + "armguard_hard", + "legguard_hard", + "gloves_rubber", + "socks", + "chestguard_hard", + "boots_rubber" + ], + "entries": [ { "item": "medium_disposable_cell" }, { "group": "snacks_fancy" }, { "group": "snacks" }, { "item": "bat" } ] + } + } + }, { "type": "profession", "ident": "cyclist", @@ -1003,8 +1021,8 @@ ], "entries": [ { "group": "charged_cell_phone" }, - { "item": "l_enforcer_45", "ammo-item": "460_rowland", "charges": 6, "container-item": "sholster" }, - { "item": "460_rowland", "charges": 24 } + { "item": "sw_619", "ammo-item": "357mag_fmj", "charges": 6, "container-item": "sholster" }, + { "item": "357mag_fmj", "charges": 24 } ] }, "male": [ "briefs" ], @@ -1262,8 +1280,8 @@ "entries": [ { "group": "charged_cell_phone" }, { "item": "ear_plugs", "custom-flags": [ "no_auto_equip" ] }, - { "item": "remington_700", "ammo-item": "270", "charges": 4, "contents-item": "shoulder_strap" }, - { "item": "270", "charges": 16, "container-item": "bandolier_rifle" }, + { "item": "remington700_270", "ammo-item": "270win_jsp", "charges": 4, "contents-item": "shoulder_strap" }, + { "item": "270win_jsp", "charges": 16, "container-item": "bandolier_rifle" }, { "item": "sheath", "contents-item": "knife_hunting" } ] }, @@ -1665,8 +1683,8 @@ "two_way_radio" ], "entries": [ - { "item": "l_mp_9mm", "ammo-item": "9mmP", "container-item": "holster" }, - { "item": "chestrig", "container-group": "army_mags_lw21" } + { "item": "glock_18c", "ammo-item": "9mmP", "container-item": "holster" }, + { "item": "chestrig", "container-group": "army_mags_glock17" } ] }, "male": [ "boxer_shorts" ], @@ -1761,12 +1779,8 @@ "entries": [ { "item": "ear_plugs", "custom-flags": [ "no_auto_equip" ] }, { "item": "sheath", "contents-item": "knife_combat" }, - { - "item": "rm51_assault_rifle", - "ammo-item": "8mm_fmj", - "contents-item": [ "shoulder_strap", "acog_scope" ] - }, - { "item": "modularvestceramic", "contents-group": "army_mags_rm51" } + { "item": "h&k416a5", "ammo-item": "556", "contents-item": [ "shoulder_strap", "acog_scope" ] }, + { "item": "modularvestceramic", "contents-group": "army_mags_m4" } ] }, "male": [ "boxer_shorts" ], @@ -1824,11 +1838,15 @@ "entries": [ { "item": "ear_plugs", "custom-flags": [ "no_auto_equip" ] }, { "item": "hat_boonie", "custom-flags": [ "no_auto_equip" ] }, - { "item": "rm11b_sniper_rifle", "ammo-item": "8mm_fmj", "contents-item": [ "shoulder_strap" ] }, + { + "item": "m2010", + "ammo-item": "300_winmag", + "contents-item": [ "shoulder_strap", "rifle_scope", "bipod" ] + }, { "item": "usp_45", "ammo-item": "45_acp", "charges": 12, "container-item": "holster" }, { "item": "usp45mag", "ammo-item": "45_acp", "charges": 12 }, { "item": "usp45mag", "ammo-item": "45_acp", "charges": 12 }, - { "item": "chestrig", "contents-group": [ "army_mags_rm25" ] } + { "item": "chestrig", "contents-group": [ "army_mags_m2010" ] } ] }, "male": [ "boxer_shorts" ], @@ -3802,5 +3820,58 @@ "male": [ "boxer_shorts" ], "female": [ "bra", "panties" ] } + }, + { + "type": "profession", + "ident": "roadie", + "name": "Roadie", + "description": "You worked just outside of the limelight, ensuring that the performers got what they needed and that everything ran smoothly. The stakes are higher these days, but the show must go on.", + "points": 3, + "skills": [ + { "level": 2, "name": "fabrication" }, + { "level": 1, "name": "driving" }, + { "level": 2, "name": "electronics" }, + { "level": 1, "name": "dodge" }, + { "level": 1, "name": "mechanics" } + ], + "items": { + "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", "snippet_category": "patched" } ] + }, + "male": [ "boxer_shorts" ], + "female": [ "bra", "boy_shorts" ] + } + }, + { + "type": "profession", + "ident": "musician", + "name": "Musician", + "description": "You were just about to hit the stage when the Cataclysm struck. You weren't able to grab much during the panic, but at least you have your loaded six string on your back.", + "points": -1, + "skills": [ { "level": 1, "name": "barter" }, { "level": 2, "name": "speech" } ], + "items": { + "both": { + "ammo": 100, + "magazine": 100, + "items": [ "tshirt_tour", "shorts_cargo", "socks", "sneakers", "wristwatch", "water_clean", "guitar_electric" ], + "entries": [ { "item": "towel", "custom-flags": [ "no_auto_equip" ] }, { "group": "charged_cell_phone" } ] + }, + "male": [ "boxer_shorts" ], + "female": [ "bra", "boy_shorts" ] + } } ] diff --git a/data/json/recipes/ammo/pistol.json b/data/json/recipes/ammo/pistol.json index 2593b04e325e8..93356ddbcb147 100644 --- a/data/json/recipes/ammo/pistol.json +++ b/data/json/recipes/ammo/pistol.json @@ -63,22 +63,6 @@ "qualities": [ { "id": "CUT", "level": 1 } ], "components": [ [ [ "chem_black_powder", 4 ] ], [ [ "lgpistol_primer", 1 ] ], [ [ "paper", 1 ], [ "aluminum_foil", 1 ] ] ] }, - { - "result": "reloaded_10mm", - "type": "recipe", - "category": "CC_AMMO", - "subcategory": "CSC_AMMO_PISTOL", - "skill_used": "fabrication", - "difficulty": 5, - "skills_required": [ "gun", 5 ], - "time": "2 m", - "batch_time_factors": [ 60, 5 ], - "book_learn": [ [ "manual_pistol", 4 ] ], - "charges": 1, - "reversible": true, - "using": [ [ "bullet_forming", 2 ], [ "ammo_bullet", 2 ] ], - "components": [ [ [ "40_casing", 1 ] ], [ [ "smpistol_primer", 1 ] ], [ [ "gunpowder", 5 ] ] ] - }, { "result": "reloaded_32_acp", "type": "recipe", @@ -127,6 +111,22 @@ "using": [ [ "bullet_forming", 2 ], [ "ammo_bullet", 2 ] ], "components": [ [ [ "38_casing", 1 ] ], [ [ "smpistol_primer", 1 ] ], [ [ "gunpowder", 2 ] ] ] }, + { + "result": "reloaded_38super_fmj", + "type": "recipe", + "category": "CC_AMMO", + "subcategory": "CSC_AMMO_PISTOL", + "skill_used": "fabrication", + "difficulty": 3, + "skills_required": [ "gun", 1 ], + "time": "2 m", + "batch_time_factors": [ 60, 5 ], + "book_learn": [ [ "manual_pistol", 1 ], [ "recipe_bullets", 2 ] ], + "charges": 1, + "reversible": true, + "using": [ [ "bullet_forming", 2 ], [ "ammo_bullet", 2 ], [ "ammo_38super", 1 ] ], + "components": [ [ [ "gunpowder", 3 ] ] ] + }, { "result": "reloaded_357mag_fmj", "type": "recipe", @@ -223,6 +223,22 @@ "using": [ [ "bullet_forming", 2 ], [ "ammo_bullet", 2 ] ], "components": [ [ [ "40_casing", 1 ] ], [ [ "smpistol_primer", 1 ] ], [ [ "gunpowder", 4 ] ] ] }, + { + "result": "reloaded_10mm_fmj", + "type": "recipe", + "category": "CC_AMMO", + "subcategory": "CSC_AMMO_PISTOL", + "skill_used": "fabrication", + "difficulty": 3, + "skills_required": [ "gun", 1 ], + "time": "2 m", + "batch_time_factors": [ 60, 5 ], + "book_learn": [ [ "manual_pistol", 3 ], [ "recipe_bullets", 4 ] ], + "charges": 1, + "reversible": true, + "using": [ [ "bullet_forming", 2 ], [ "ammo_bullet", 2 ], [ "ammo_10mm", 1 ] ], + "components": [ [ [ "gunpowder", 5 ] ] ] + }, { "result": "reloaded_44fmj", "type": "recipe", @@ -351,6 +367,22 @@ "using": [ [ "bullet_forming", 5 ], [ "ammo_bullet", 4 ] ], "components": [ [ [ "454_casing", 1 ] ], [ [ "smrifle_primer", 1 ] ], [ [ "chem_black_powder", 6 ] ], [ [ "copper", 2 ] ] ] }, + { + "result": "reloaded_45colt_jhp", + "type": "recipe", + "category": "CC_AMMO", + "subcategory": "CSC_AMMO_PISTOL", + "skill_used": "fabrication", + "difficulty": 3, + "skills_required": [ "gun", 3 ], + "time": "2 m", + "batch_time_factors": [ 60, 5 ], + "book_learn": [ [ "recipe_bullets", 3 ], [ "manual_pistol", 4 ] ], + "charges": 1, + "reversible": true, + "using": [ [ "bullet_forming", 3 ], [ "ammo_bullet", 4 ], [ "ammo_45colt", 1 ] ], + "components": [ [ [ "gunpowder", 4 ] ] ] + }, { "result": "reloaded_46mm", "type": "recipe", diff --git a/data/json/recipes/ammo/rifle.json b/data/json/recipes/ammo/rifle.json index 624bb355b1ebc..ca3ed0cf7bd38 100644 --- a/data/json/recipes/ammo/rifle.json +++ b/data/json/recipes/ammo/rifle.json @@ -82,7 +82,7 @@ "components": [ [ [ "223_casing", 1 ] ], [ [ "smrifle_primer", 1 ] ], [ [ "gunpowder", 4 ] ], [ [ "copper", 1 ] ] ] }, { - "result": "reloaded_270", + "result": "reloaded_270win_jsp", "type": "recipe", "category": "CC_AMMO", "subcategory": "CSC_AMMO_RIFLE", @@ -94,8 +94,8 @@ "book_learn": [ [ "recipe_bullets", 1 ], [ "mag_rifle", 3 ] ], "charges": 1, "reversible": true, - "using": [ [ "bullet_forming", 8 ], [ "ammo_bullet", 5 ] ], - "components": [ [ [ "3006_casing", 1 ] ], [ [ "lgrifle_primer", 1 ] ], [ [ "gunpowder", 10 ] ], [ [ "copper", 3 ] ] ] + "using": [ [ "bullet_forming", 8 ], [ "ammo_bullet", 5 ], [ "ammo_270win", 1 ] ], + "components": [ [ [ "gunpowder", 10 ] ], [ [ "copper", 3 ] ] ] }, { "result": "reloaded_300_winmag", diff --git a/data/json/recipes/ammo/shot.json b/data/json/recipes/ammo/shot.json index e8e54e6fdcd72..33777145dc478 100644 --- a/data/json/recipes/ammo/shot.json +++ b/data/json/recipes/ammo/shot.json @@ -15,6 +15,22 @@ "using": [ [ "bullet_forming", 1 ], [ "ammo_bullet", 10 ], [ "ammo_shot", 1 ] ], "components": [ [ [ "gunpowder", 6 ] ] ] }, + { + "result": "reloaded_410shot_000", + "type": "recipe", + "category": "CC_AMMO", + "subcategory": "CSC_AMMO_SHOT", + "skill_used": "fabrication", + "difficulty": 2, + "skills_required": [ "gun", 1 ], + "time": "2 m", + "batch_time_factors": [ 60, 5 ], + "book_learn": [ [ "recipe_bullets", 2 ], [ "manual_shotgun", 2 ] ], + "charges": 1, + "reversible": true, + "using": [ [ "bullet_forming", 1 ], [ "ammo_bullet", 5 ], [ "ammo_410shot", 1 ] ], + "components": [ [ [ "gunpowder", 5 ] ] ] + }, { "result": "reloaded_shot_bird", "type": "recipe", @@ -31,6 +47,22 @@ "using": [ [ "bullet_forming", 1 ], [ "ammo_bullet", 10 ], [ "ammo_shot", 1 ] ], "components": [ [ [ "gunpowder", 3 ] ] ] }, + { + "result": "reloaded_shot_dragon", + "type": "recipe", + "category": "CC_AMMO", + "subcategory": "CSC_AMMO_SHOT", + "skill_used": "fabrication", + "difficulty": 2, + "skills_required": [ "gun", 1 ], + "time": "2 m", + "batch_time_factors": [ 60, 5 ], + "book_learn": [ [ "recipe_bullets", 3 ], [ "manual_shotgun", 3 ] ], + "charges": 1, + "using": [ [ "ammo_shot", 1 ] ], + "tools": [ [ [ "press", -1 ] ] ], + "components": [ [ [ "gunpowder", 3 ], [ "chem_black_powder", 3 ] ], [ [ "magnesium", 5 ] ] ] + }, { "result": "reloaded_shot_flechette", "type": "recipe", diff --git a/data/json/recipes/armor/arms.json b/data/json/recipes/armor/arms.json index aa83d96699d54..998cbe037d785 100644 --- a/data/json/recipes/armor/arms.json +++ b/data/json/recipes/armor/arms.json @@ -115,6 +115,20 @@ "components": [ [ [ "paper", 60 ] ], [ [ "duct_tape", 10 ] ] ], "flags": [ "BLIND_HARD" ] }, + { + "result": "armguard_scrap", + "type": "recipe", + "category": "CC_ARMOR", + "subcategory": "CSC_ARMOR_ARMS", + "skill_used": "fabrication", + "difficulty": 3, + "time": "30 m", + "autolearn": true, + "book_learn": [ [ "recipe_melee", 2 ] ], + "using": [ [ "cordage", 1 ] ], + "qualities": [ { "id": "CUT", "level": 1 }, { "id": "HAMMER", "level": 1 } ], + "components": [ [ [ "scrap", 50 ] ] ] + }, { "result": "armguard_soft", "type": "recipe", diff --git a/data/json/recipes/armor/feet.json b/data/json/recipes/armor/feet.json index 1b287e255daa2..b42522e78023c 100644 --- a/data/json/recipes/armor/feet.json +++ b/data/json/recipes/armor/feet.json @@ -171,6 +171,21 @@ [ [ "fur", 16 ], [ "tanned_pelt", 3 ], [ "leather", 16 ], [ "tanned_hide", 3 ] ] ] }, + { + "result": "boots_scrap", + "type": "recipe", + "category": "CC_ARMOR", + "subcategory": "CSC_ARMOR_FEET", + "skill_used": "fabrication", + "difficulty": 3, + "time": "30 m", + "reversible": true, + "autolearn": true, + "book_learn": [ [ "recipe_melee", 2 ] ], + "using": [ [ "cordage", 4 ] ], + "qualities": [ { "id": "CUT", "level": 1 }, { "id": "HAMMER", "level": 1 } ], + "components": [ [ [ "scrap", 50 ] ] ] + }, { "result": "boots_survivor", "type": "recipe", @@ -200,7 +215,7 @@ "time": "35 m", "book_learn": [ [ "textbook_tailor", 4 ], [ "tailor_portfolio", 5 ] ], "using": [ [ "sewing_standard", 20 ] ], - "components": [ [ [ "leather", 9 ], [ "tanned_hide", 2 ] ] ] + "components": [ [ [ "leather", 12 ], [ "tanned_hide", 2 ] ] ] }, { "result": "boots_winter", diff --git a/data/json/recipes/armor/head.json b/data/json/recipes/armor/head.json index e59f5c91137f3..785a2d196d9ae 100644 --- a/data/json/recipes/armor/head.json +++ b/data/json/recipes/armor/head.json @@ -486,6 +486,20 @@ [ [ "kevlar_plate", 8 ] ] ] }, + { + "result": "helmet_scrap", + "type": "recipe", + "category": "CC_ARMOR", + "subcategory": "CSC_ARMOR_HEAD", + "skill_used": "fabrication", + "difficulty": 3, + "time": "20 m", + "autolearn": true, + "book_learn": [ [ "recipe_melee", 2 ] ], + "using": [ [ "cordage", 1 ] ], + "qualities": [ { "id": "CUT", "level": 1 }, { "id": "HAMMER", "level": 1 } ], + "components": [ [ [ "scrap", 30 ] ] ] + }, { "result": "helmet_survivor", "type": "recipe", @@ -1355,5 +1369,17 @@ "autolearn": true, "components": [ [ [ "rag", 10 ] ], [ [ "pot_canning", 1 ] ] ], "flags": [ "BLIND_HARD" ] + }, + { + "result": "helmet_corinthian", + "type": "recipe", + "category": "CC_ARMOR", + "subcategory": "CSC_ARMOR_HEAD", + "skill_used": "fabrication", + "difficulty": 6, + "time": 70000, + "book_learn": [ [ "textbook_armwest", 5 ] ], + "using": [ [ "forging_standard", 3 ], [ "bronzesmithing_tools", 1 ] ], + "components": [ [ [ "scrap_bronze", 7 ] ], [ [ "fur", 4 ], [ "leather", 4 ] ] ] } ] diff --git a/data/json/recipes/armor/legs.json b/data/json/recipes/armor/legs.json index 702aac23952ca..8fc94a51f93e7 100644 --- a/data/json/recipes/armor/legs.json +++ b/data/json/recipes/armor/legs.json @@ -282,6 +282,20 @@ "components": [ [ [ "paper", 60 ] ], [ [ "duct_tape", 10 ] ] ], "flags": [ "BLIND_HARD" ] }, + { + "result": "legguard_scrap", + "type": "recipe", + "category": "CC_ARMOR", + "subcategory": "CSC_ARMOR_LEGS", + "skill_used": "fabrication", + "difficulty": 3, + "time": "40 m", + "autolearn": true, + "book_learn": [ [ "recipe_melee", 2 ] ], + "using": [ [ "cordage", 1 ] ], + "qualities": [ { "id": "CUT", "level": 1 }, { "id": "HAMMER", "level": 1 } ], + "components": [ [ [ "scrap", 60 ] ] ] + }, { "result": "loincloth", "type": "recipe", @@ -557,5 +571,18 @@ "book_learn": [ [ "textbook_armwest", 6 ], [ "textbook_fabrication", 6 ], [ "recipe_melee", 6 ] ], "using": [ [ "chainmail_standard", 4 ] ], "components": [ [ [ "link_sheet", 4 ] ], [ [ "chain_link", 100 ] ], [ [ "wire", 1 ] ], [ [ "rag", 6 ] ] ] + }, + { + "result": "legguard_bronze", + "type": "recipe", + "category": "CC_ARMOR", + "subcategory": "CSC_ARMOR_LEGS", + "skill_used": "fabrication", + "difficulty": 5, + "time": 120000, + "autolearn": true, + "book_learn": [ [ "textbook_armwest", 4 ], [ "recipe_melee", 4 ] ], + "using": [ [ "forging_standard", 6 ], [ "bronzesmithing_tools", 1 ] ], + "components": [ [ [ "fur", 6 ], [ "tanned_pelt", 1 ], [ "leather", 6 ], [ "tanned_hide", 1 ] ], [ [ "scrap_bronze", 12 ] ] ] } ] diff --git a/data/json/recipes/armor/pets_horse.json b/data/json/recipes/armor/pets_horse.json new file mode 100644 index 0000000000000..00c042730a25e --- /dev/null +++ b/data/json/recipes/armor/pets_horse.json @@ -0,0 +1,161 @@ +[ + { + "result": "acidchitin_armor_horse", + "type": "recipe", + "copy-from": "armor_acidchitin", + "category": "CC_ANIMALS", + "subcategory": "CSC_ANIMALS_EQUINE ARMOR", + "skills_required": [ [ "survival", 4 ], [ "firstaid", 2 ], [ "fabrication", 4 ] ], + "time": "600 m", + "using": [ [ "cordage", 7 ] ], + "components": [ [ [ "acidchitin_piece", 84 ] ] ] + }, + { + "result": "chitin_armor_horse", + "type": "recipe", + "copy-from": "armor_chitin", + "category": "CC_ANIMALS", + "subcategory": "CSC_ANIMALS_EQUINE ARMOR", + "time": "525 m", + "book_learn": [ [ "textbook_tailor", 5 ], [ "tailor_portfolio", 5 ] ], + "skills_required": [ [ "fabrication", 4 ] ], + "using": [ [ "cordage", 7 ] ], + "components": [ [ [ "chitin_piece", 84 ] ] ] + }, + { + "result": "chainmail_armor_horse", + "type": "recipe", + "copy-from": "chainmail_vest", + "category": "CC_ANIMALS", + "subcategory": "CSC_ANIMALS_EQUINE ARMOR", + "time": "364 m", + "using": [ [ "chainmail_standard", 7 ] ], + "components": [ + [ [ "link_sheet", 35 ] ], + [ [ "chain_link", 917 ] ], + [ [ "wire", 7 ] ], + [ [ "fur", 42 ], [ "tanned_pelt", 7 ], [ "leather", 42 ], [ "tanned_hide", 7 ] ] + ] + }, + { + "result": "kevlar_armor_horse", + "type": "recipe", + "category": "CC_ANIMALS", + "subcategory": "CSC_ANIMALS_EQUINE ARMOR", + "skill_used": "tailor", + "difficulty": 6, + "time": "210 m", + "autolearn": true, + "using": [ [ "sewing_standard", 190 ] ], + "components": [ [ [ "kevlar_plate", 56 ] ], [ [ "rag", 42 ] ], [ [ "leather", 24 ], [ "tanned_hide", 24 ] ] ] + }, + { + "result": "leather_armor_horse", + "type": "recipe", + "category": "CC_ANIMALS", + "subcategory": "CSC_ANIMALS_EQUINE ARMOR", + "skill_used": "tailor", + "difficulty": 3, + "time": "105 m", + "byproducts": [ [ "leather", 21 ] ], + "using": [ [ "sewing_standard", 30 ] ], + "components": [ [ [ "armor_blarmor", 3 ] ], [ [ "rag", 18 ] ] ] + }, + { + "result": "leather_armor_horse", + "type": "recipe", + "copy-from": "armor_blarmor", + "id_suffix": "from_scratch", + "category": "CC_ANIMALS", + "subcategory": "CSC_ANIMALS_EQUINE ARMOR", + "skills_required": [ "tailor", 6 ], + "time": "420 m", + "using": [ [ "sewing_standard", 190 ], [ "surface_heat", 60, "LIST" ] ], + "components": [ + [ [ "water", 30 ], [ "water_clean", 30 ] ], + [ [ "wax", 6 ], [ "tallow", 24 ], [ "tallow_tainted", 24 ], [ "vinegar", 30 ], [ "pine_bough", 60 ] ], + [ [ "salt", 150 ] ], + [ [ "leather", 105 ], [ "tanned_hide", 17 ] ], + [ [ "rag", 18 ] ] + ] + }, + { + "result": "leatherbone_armor_horse", + "type": "recipe", + "copy-from": "leather_armor_horse", + "difficulty": 4, + "time": "210 m", + "using": [ [ "sewing_standard", 75 ] ], + "components": [ [ [ "bone", 39 ], [ "bone_human", 39 ], [ "bone_tainted", 75 ] ], [ [ "armor_blarmor", 3 ] ] ] + }, + { + "result": "leatherbone_armor_horse", + "type": "recipe", + "id_suffix": "from_leatherarmor", + "category": "CC_ANIMALS", + "subcategory": "CSC_ANIMALS_EQUINE ARMOR", + "skill_used": "tailor", + "difficulty": 4, + "time": "105 m", + "autolearn": true, + "byproducts": [ [ "rag", 6 ] ], + "using": [ [ "sewing_standard", 35 ] ], + "components": [ [ [ "bone", 39 ], [ "bone_human", 39 ], [ "bone_tainted", 75 ] ], [ [ "leather_armor_horse", 1 ] ] ] + }, + { + "result": "leatherbone_armor_horse", + "type": "recipe", + "id_suffix": "from_scratch", + "category": "CC_ANIMALS", + "subcategory": "CSC_ANIMALS_EQUINE ARMOR", + "skill_used": "cooking", + "difficulty": 3, + "skills_required": [ "tailor", 6 ], + "time": "525 m", + "book_learn": [ + [ "textbook_tailor", 4 ], + [ "tailor_portfolio", 5 ], + [ "textbook_survival", 3 ], + [ "trappers_companion", 3 ], + [ "survival_book", 3 ], + [ "textbook_armwest", 6 ], + [ "textbook_armschina", 6 ] + ], + "using": [ [ "sewing_standard", 225 ] ], + "tools": [ [ [ "surface_heat", 60, "LIST" ] ] ], + "components": [ + [ [ "water", 30 ], [ "water_clean", 30 ] ], + [ [ "wax", 6 ], [ "tallow", 24 ], [ "tallow_tainted", 24 ], [ "vinegar", 30 ], [ "pine_bough", 60 ] ], + [ [ "salt", 150 ] ], + [ [ "bone", 39 ], [ "bone_human", 39 ], [ "bone_tainted", 75 ] ], + [ [ "leather", 105 ], [ "tanned_hide", 17 ] ] + ] + }, + { + "result": "rubber_armor_horse", + "type": "recipe", + "category": "CC_ANIMALS", + "subcategory": "CSC_ANIMALS_EQUINE ARMOR", + "skill_used": "tailor", + "difficulty": 4, + "skills_required": [ "fabrication", 3 ], + "time": "112 m", + "autolearn": true, + "qualities": [ { "id": "SEW", "level": 1 }, { "id": "CUT", "level": 1 } ], + "components": [ [ [ "duct_tape", 175 ] ], [ [ "coat_rain", 7 ] ] ] + }, + { + "result": "rubber_armor_horse", + "type": "recipe", + "id_suffix": "from_scratch", + "category": "CC_ANIMALS", + "subcategory": "CSC_ANIMALS_EQUINE ARMOR", + "skill_used": "tailor", + "difficulty": 5, + "skills_required": [ "fabrication", 3 ], + "time": "210 m", + "autolearn": true, + "qualities": [ { "id": "SEW", "level": 1 }, { "id": "CUT", "level": 1 } ], + "components": [ [ [ "duct_tape", 350 ] ], [ [ "bag_plastic", 70 ] ], [ [ "rag", 70 ] ] ] + } +] diff --git a/data/json/recipes/armor/suit.json b/data/json/recipes/armor/suit.json index 167030547d2e8..ed868b89da3b8 100644 --- a/data/json/recipes/armor/suit.json +++ b/data/json/recipes/armor/suit.json @@ -258,13 +258,27 @@ "subcategory": "CSC_ARMOR_SUIT", "skill_used": "fabrication", "difficulty": 3, - "time": "100 m", + "time": "150 m", "reversible": true, "autolearn": true, "book_learn": [ [ "recipe_melee", 2 ] ], - "using": [ [ "cordage", 2 ] ], + "using": [ [ "cordage", 4 ] ], "qualities": [ { "id": "CUT", "level": 1 }, { "id": "HAMMER", "level": 1 } ], - "components": [ [ [ "scrap", 190 ] ] ] + "components": [ [ [ "scrap", 170 ] ] ] + }, + { + "result": "armor_scrapsuit", + "type": "recipe", + "category": "CC_ARMOR", + "subcategory": "CSC_ARMOR_SUIT", + "skill_used": "fabrication", + "difficulty": 3, + "time": "20 m", + "reversible": true, + "autolearn": true, + "book_learn": [ [ "recipe_melee", 2 ] ], + "using": [ [ "cordage", 1 ] ], + "components": [ [ [ "cuirass_scrap", 1 ] ], [ [ "armguard_scrap", 1 ] ], [ [ "legguard_scrap", 1 ] ] ] }, { "result": "chainmail_hauberk", diff --git a/data/json/recipes/armor/torso.json b/data/json/recipes/armor/torso.json index 04d04a06d9afe..8c4f0abec1245 100644 --- a/data/json/recipes/armor/torso.json +++ b/data/json/recipes/armor/torso.json @@ -217,6 +217,20 @@ [ [ "fur", 6 ], [ "tanned_pelt", 1 ], [ "leather", 6 ], [ "tanned_hide", 1 ] ] ] }, + { + "result": "cuirass_scrap", + "type": "recipe", + "category": "CC_ARMOR", + "subcategory": "CSC_ARMOR_TORSO", + "skill_used": "fabrication", + "difficulty": 3, + "time": "60 m", + "autolearn": true, + "book_learn": [ [ "recipe_melee", 2 ] ], + "using": [ [ "cordage", 1 ] ], + "qualities": [ { "id": "CUT", "level": 1 }, { "id": "HAMMER", "level": 1 } ], + "components": [ [ [ "scrap", 80 ] ] ] + }, { "result": "duster", "type": "recipe", @@ -1144,5 +1158,17 @@ "book_learn": [ [ "textbook_armwest", 6 ], [ "textbook_fabrication", 6 ], [ "recipe_melee", 6 ] ], "using": [ [ "chainmail_standard", 7 ] ], "components": [ [ [ "link_sheet", 7 ] ], [ [ "chain_link", 175 ] ], [ [ "wire", 1 ] ], [ [ "rag", 6 ] ] ] + }, + { + "result": "armor_cuirass", + "type": "recipe", + "category": "CC_ARMOR", + "subcategory": "CSC_ARMOR_TORSO", + "skill_used": "fabrication", + "difficulty": 5, + "time": 280000, + "book_learn": [ [ "textbook_armwest", 8 ] ], + "using": [ [ "forging_standard", 14 ], [ "bronzesmithing_tools", 1 ] ], + "components": [ [ [ "scrap_bronze", 28 ] ] ] } ] diff --git a/data/json/recipes/basecamps/recipe_groups.json b/data/json/recipes/basecamps/recipe_groups.json index 957cc81ed16d0..4b3cb5c32f209 100644 --- a/data/json/recipes/basecamps/recipe_groups.json +++ b/data/json/recipes/basecamps/recipe_groups.json @@ -4,7 +4,7 @@ "name": "all_faction_base_types", "building_type": "NONE", "recipes": [ - { "id": "faction_base_modular_field_0", "description": "Field Camp", "om_terrains": [ "field" ] }, + { "id": "faction_base_modular_hub_field_0", "description": "Field Camp", "om_terrains": [ "field" ] }, { "id": "faction_base_camp_0", "description": "Old Camp", "om_terrains": [ "field" ] } ] }, @@ -117,6 +117,11 @@ { "id": "pot_copper", "description": " Craft: Pot, Copper" }, { "id": "bolt_metal", "description": " Craft: Crossbow Bolt, Steel" }, { "id": "armor_scrapsuit", "description": " Craft: Armor, Scrap Suit" }, + { "id": "helmet_scrap", "description": " Craft: Armor, Scrap Helmet" }, + { "id": "cuirass_scrap", "description": " Craft: Armor, Scrap Cuirass" }, + { "id": "armguard_scrap", "description": " Craft: Armor, Scrap Arm Guards" }, + { "id": "legguard_scrap", "description": " Craft: Armor, Scrap Leg Guards" }, + { "id": "boots_scrap", "description": " Craft: Armor, Scrap Boots" }, { "id": "copper_ax", "description": " Craft: Axe, Copper" }, { "id": "spear_copper", "description": " Craft: Spear, Copper" } ] diff --git a/data/json/recipes/basecamps/recipe_modular_field_common.json b/data/json/recipes/basecamps/recipe_modular_field_common.json index 511374176bb60..a6572897b9fc8 100644 --- a/data/json/recipes/basecamps/recipe_modular_field_common.json +++ b/data/json/recipes/basecamps/recipe_modular_field_common.json @@ -1,7 +1,7 @@ [ { "type": "recipe", - "result": "faction_base_modular_field_0", + "result": "faction_base_modular_hub_field_0", "description": "We should survey the base site and set up a bulletin board.", "category": "CC_BUILDING", "subcategory": "CSC_BUILDING_BASES", @@ -9,10 +9,11 @@ "autolearn": false, "never_learn": true, "time": "1 h", - "construction_blueprint": "fbmf_0", + "construction_blueprint": "fbmh_0", "blueprint_provides": [ { "id": "gathering" }, { "id": "primitive_camp_recipes_1" }, + { "id": "fbmh_0" }, { "id": "firewood" }, { "id": "foraging" }, { "id": "sorting" }, @@ -23,22 +24,46 @@ }, { "type": "recipe", - "result": "faction_base_modular_field_fireplace_northeast", + "result": "faction_base_modular_hub_mallroof_0", + "description": "We should survey the roof top and set up a bulletin board.", + "category": "CC_BUILDING", + "subcategory": "CSC_BUILDING_BASES", + "skill_used": "fabrication", + "autolearn": false, + "never_learn": true, + "time": "1 h", + "construction_blueprint": "fbmh_0", + "blueprint_provides": [ + { "id": "gathering" }, + { "id": "primitive_camp_recipes_1" }, + { "id": "fbmh_0" }, + { "id": "firewood" }, + { "id": "foraging" }, + { "id": "sorting" }, + { "id": "logging" }, + { "id": "fbm_no_dig" } + ], + "blueprint_requires": [ { "id": "not_an_upgrade" } ], + "blueprint_name": "basic survey" + }, + { + "type": "recipe", + "result": "faction_base_modular_hub_fireplace_northeast", "description": "Now that we have some cover, we should build a fireplace in the northeast shack.", "category": "CC_BUILDING", "subcategory": "CSC_BUILDING_BASES", "autolearn": false, "never_learn": true, - "construction_blueprint": "fbmf_fireplace_northeast", + "construction_blueprint": "fbmh_fireplace_northeast", "blueprint_name": "northeast fireplace", - "blueprint_requires": [ { "id": "fbmf_northeast" } ], - "blueprint_provides": [ { "id": "fbmf_fire_northeast" } ], - "blueprint_excludes": [ { "id": "fbmf_fire_northeast" } ], + "blueprint_requires": [ { "id": "fbmh_northeast" } ], + "blueprint_provides": [ { "id": "fbmh_fire_northeast" } ], + "blueprint_excludes": [ { "id": "fbmh_fire_northeast" } ], "blueprint_autocalc": true }, { "type": "recipe", - "result": "faction_base_modular_field_brazier_northeast", + "result": "faction_base_modular_hub_brazier_northeast", "description": "Now that we have some cover, we should set up a brazier in the northeast shack.", "category": "CC_BUILDING", "subcategory": "CSC_BUILDING_BASES", @@ -46,476 +71,476 @@ "autolearn": false, "never_learn": true, "time": "5 m", - "construction_blueprint": "fbmf_brazier_northeast", + "construction_blueprint": "fbmh_brazier_northeast", "blueprint_name": "northeast brazier", - "blueprint_requires": [ { "id": "fbmf_northeast" } ], - "blueprint_provides": [ { "id": "fbmf_fire_northeast" } ], - "blueprint_excludes": [ { "id": "fbmf_fire_northeast" } ], + "blueprint_requires": [ { "id": "fbmh_northeast" } ], + "blueprint_provides": [ { "id": "fbmh_fire_northeast" } ], + "blueprint_excludes": [ { "id": "fbmh_fire_northeast" } ], "components": [ [ [ "brazier", 1 ] ] ] }, { "type": "recipe", - "result": "faction_base_modular_field_stove_northeast", + "result": "faction_base_modular_hub_stove_northeast", "description": "Now that we have some cover, we should build a stove in the northeast shack.", "category": "CC_BUILDING", "subcategory": "CSC_BUILDING_BASES", "skill_used": "fabrication", "autolearn": false, "never_learn": true, - "construction_blueprint": "fbmf_stove_northeast", + "construction_blueprint": "fbmh_stove_northeast", "blueprint_name": "northeast stove", - "blueprint_requires": [ { "id": "fbmf_northeast" } ], - "blueprint_provides": [ { "id": "fbmf_fire_northeast" } ], - "blueprint_excludes": [ { "id": "fbmf_fire_northeast" } ], + "blueprint_requires": [ { "id": "fbmh_northeast" } ], + "blueprint_provides": [ { "id": "fbmh_fire_northeast" } ], + "blueprint_excludes": [ { "id": "fbmh_fire_northeast" } ], "blueprint_autocalc": true }, { "type": "recipe", - "result": "faction_base_modular_field_strawbed1_northeast", + "result": "faction_base_modular_hub_strawbed1_northeast", "description": "A straw bed in the northeast shack will make sleeping easier.", "category": "CC_BUILDING", "subcategory": "CSC_BUILDING_BASES", "autolearn": false, "never_learn": true, - "construction_blueprint": "fbmf_strawbed1_northeast", + "construction_blueprint": "fbmh_strawbed1_northeast", "blueprint_name": "northeast straw bed", - "blueprint_requires": [ { "id": "fbmf_northeast" } ], - "blueprint_provides": [ { "id": "bed" }, { "id": "fbmf_bed1_northeast" } ], - "blueprint_excludes": [ { "id": "fbmf_bed1_northeast" } ], + "blueprint_requires": [ { "id": "fbmh_northeast" } ], + "blueprint_provides": [ { "id": "bed" }, { "id": "fbmh_bed1_northeast" } ], + "blueprint_excludes": [ { "id": "fbmh_bed1_northeast" } ], "blueprint_autocalc": true }, { "type": "recipe", - "result": "faction_base_modular_field_bed1_northeast", + "result": "faction_base_modular_hub_bed1_northeast", "description": "A proper bed in the northeast shack will give one of us a place to sleep soundly.", "category": "CC_BUILDING", "subcategory": "CSC_BUILDING_BASES", "autolearn": false, "never_learn": true, - "construction_blueprint": "fbmf_bed1_northeast", + "construction_blueprint": "fbmh_bed1_northeast", "blueprint_name": "northeast bed", - "blueprint_requires": [ { "id": "fbmf_northeast" } ], - "blueprint_provides": [ { "id": "bed" }, { "id": "fbmf_bed1_northeast" } ], - "blueprint_excludes": [ { "id": "fbmf_bed1_northeast" } ], + "blueprint_requires": [ { "id": "fbmh_northeast" } ], + "blueprint_provides": [ { "id": "bed" }, { "id": "fbmh_bed1_northeast" } ], + "blueprint_excludes": [ { "id": "fbmh_bed1_northeast" } ], "blueprint_autocalc": true }, { "type": "recipe", - "result": "faction_base_modular_field_strawbed2_northeast", + "result": "faction_base_modular_hub_strawbed2_northeast", "description": "Another straw bed in the northeast shack will make sleeping easier.", "category": "CC_BUILDING", "subcategory": "CSC_BUILDING_BASES", "autolearn": false, "never_learn": true, - "construction_blueprint": "fbmf_strawbed2_northeast", + "construction_blueprint": "fbmh_strawbed2_northeast", "blueprint_name": "northeast straw bed", - "blueprint_requires": [ { "id": "fbmf_bed1_northeast" }, { "id": "fbmf_northeast", "amount": 2 } ], - "blueprint_provides": [ { "id": "bed" }, { "id": "fbmf_bed2_northeast" } ], - "blueprint_excludes": [ { "id": "fbmf_bed2_northeast" } ], + "blueprint_requires": [ { "id": "fbmh_bed1_northeast" }, { "id": "fbmh_northeast", "amount": 2 } ], + "blueprint_provides": [ { "id": "bed" }, { "id": "fbmh_bed2_northeast" } ], + "blueprint_excludes": [ { "id": "fbmh_bed2_northeast" } ], "blueprint_autocalc": true }, { "type": "recipe", - "result": "faction_base_modular_field_bed2_northeast", + "result": "faction_base_modular_hub_bed2_northeast", "description": "Another proper bed in the northeast shack will give one of us a place to sleep soundly.", "category": "CC_BUILDING", "subcategory": "CSC_BUILDING_BASES", "autolearn": false, "never_learn": true, - "construction_blueprint": "fbmf_bed2_northeast", + "construction_blueprint": "fbmh_bed2_northeast", "blueprint_name": "northeast bed", - "blueprint_requires": [ { "id": "fbmf_bed1_northeast" }, { "id": "fbmf_northeast", "amount": 2 } ], - "blueprint_provides": [ { "id": "bed" }, { "id": "fbmf_bed2_northeast" } ], - "blueprint_excludes": [ { "id": "fbmf_bed2_northeast" } ], + "blueprint_requires": [ { "id": "fbmh_bed1_northeast" }, { "id": "fbmh_northeast", "amount": 2 } ], + "blueprint_provides": [ { "id": "bed" }, { "id": "fbmh_bed2_northeast" } ], + "blueprint_excludes": [ { "id": "fbmh_bed2_northeast" } ], "blueprint_autocalc": true }, { "type": "recipe", - "result": "faction_base_modular_field_tent_strawbed3_east", + "result": "faction_base_modular_hub_tent_strawbed3_east", "description": "A pair of straw beds in the east tent will allow us to house two more people and expand the camp.", "category": "CC_BUILDING", "subcategory": "CSC_BUILDING_BASES", "autolearn": false, "never_learn": true, - "construction_blueprint": "fbmf_tent_strawbed3_east", + "construction_blueprint": "fbmh_tent_strawbed3_east", "blueprint_name": "east straw beds", - "blueprint_requires": [ { "id": "fbmf_tent_east" } ], - "blueprint_provides": [ { "id": "bed", "amount": 2 }, { "id": "fbmf_bed1_east" }, { "id": "fbmf_bed2_east" } ], - "blueprint_excludes": [ { "id": "fbmf_bed1_east" }, { "id": "fbmf_bed2_east" } ], + "blueprint_requires": [ { "id": "fbmh_tent_east" } ], + "blueprint_provides": [ { "id": "bed", "amount": 2 }, { "id": "fbmh_bed1_east" }, { "id": "fbmh_bed2_east" } ], + "blueprint_excludes": [ { "id": "fbmh_bed1_east" }, { "id": "fbmh_bed2_east" } ], "blueprint_autocalc": true }, { "type": "recipe", - "result": "faction_base_modular_field_tent_bed3_east", + "result": "faction_base_modular_hub_tent_bed3_east", "description": "A pair of proper beds in the east tent will allow us to house two more people and expand the camp.", "category": "CC_BUILDING", "subcategory": "CSC_BUILDING_BASES", "autolearn": false, "never_learn": true, - "construction_blueprint": "fbmf_tent_bed3_east", + "construction_blueprint": "fbmh_tent_bed3_east", "blueprint_name": "east beds", - "blueprint_requires": [ { "id": "fbmf_tent_east" } ], - "blueprint_provides": [ { "id": "bed", "amount": 2 }, { "id": "fbmf_bed1_east" }, { "id": "fbmf_bed2_east" } ], - "blueprint_excludes": [ { "id": "fbmf_bed1_east" }, { "id": "fbmf_bed2_east" } ], + "blueprint_requires": [ { "id": "fbmh_tent_east" } ], + "blueprint_provides": [ { "id": "bed", "amount": 2 }, { "id": "fbmh_bed1_east" }, { "id": "fbmh_bed2_east" } ], + "blueprint_excludes": [ { "id": "fbmh_bed1_east" }, { "id": "fbmh_bed2_east" } ], "blueprint_autocalc": true }, { "type": "recipe", - "result": "faction_base_modular_field_strawbed3_east", + "result": "faction_base_modular_hub_strawbed3_east", "description": "A pair of straw beds in the east room will allow us to house two more people and expand the camp.", "category": "CC_BUILDING", "subcategory": "CSC_BUILDING_BASES", "autolearn": false, "never_learn": true, - "construction_blueprint": "fbmf_room_strawbed3_east", + "construction_blueprint": "fbmh_room_strawbed3_east", "blueprint_name": "east straw beds", - "blueprint_requires": [ { "id": "fbmf_east", "amount": 4 } ], - "blueprint_provides": [ { "id": "bed", "amount": 2 }, { "id": "fbmf_bed1_east" }, { "id": "fbmf_bed2_east" } ], - "blueprint_excludes": [ { "id": "fbmf_bed1_east" }, { "id": "fbmf_bed2_east" }, { "id": "fbmf_tent_east" } ], + "blueprint_requires": [ { "id": "fbmh_east", "amount": 4 } ], + "blueprint_provides": [ { "id": "bed", "amount": 2 }, { "id": "fbmh_bed1_east" }, { "id": "fbmh_bed2_east" } ], + "blueprint_excludes": [ { "id": "fbmh_bed1_east" }, { "id": "fbmh_bed2_east" }, { "id": "fbmh_tent_east" } ], "blueprint_autocalc": true }, { "type": "recipe", - "result": "faction_base_modular_field_room_bed3_east", + "result": "faction_base_modular_hub_room_bed3_east", "description": "A pair of proper beds in the east room will allow us to house two more people and expand the camp.", "category": "CC_BUILDING", "subcategory": "CSC_BUILDING_BASES", "autolearn": false, "never_learn": true, - "construction_blueprint": "fbmf_room_bed3_east", + "construction_blueprint": "fbmh_room_bed3_east", "blueprint_name": "east beds", - "blueprint_requires": [ { "id": "fbmf_east", "amount": 4 } ], - "blueprint_provides": [ { "id": "bed", "amount": 2 }, { "id": "fbmf_bed1_east" }, { "id": "fbmf_bed2_east" } ], - "blueprint_excludes": [ { "id": "fbmf_bed1_east" }, { "id": "fbmf_bed2_east" }, { "id": "fbmf_tent_east" } ], + "blueprint_requires": [ { "id": "fbmh_east", "amount": 4 } ], + "blueprint_provides": [ { "id": "bed", "amount": 2 }, { "id": "fbmh_bed1_east" }, { "id": "fbmh_bed2_east" } ], + "blueprint_excludes": [ { "id": "fbmh_bed1_east" }, { "id": "fbmh_bed2_east" }, { "id": "fbmh_tent_east" } ], "blueprint_autocalc": true }, { "type": "recipe", - "result": "faction_base_modular_field_tent_strawbed3_southeast", + "result": "faction_base_modular_hub_tent_strawbed3_southeast", "description": "A pair of straw beds in the southeast tent will allow us to house two more people and expand the camp.", "category": "CC_BUILDING", "subcategory": "CSC_BUILDING_BASES", "autolearn": false, "never_learn": true, - "construction_blueprint": "fbmf_tent_strawbed3_southeast", + "construction_blueprint": "fbmh_tent_strawbed3_southeast", "blueprint_name": "southeast straw beds", - "blueprint_requires": [ { "id": "fbmf_tent_southeast" } ], - "blueprint_provides": [ { "id": "bed", "amount": 2 }, { "id": "fbmf_bed1_southeast" }, { "id": "fbmf_bed2_southeast" } ], - "blueprint_excludes": [ { "id": "fbmf_bed1_southeast" }, { "id": "fbmf_bed2_southeast" } ], + "blueprint_requires": [ { "id": "fbmh_tent_southeast" } ], + "blueprint_provides": [ { "id": "bed", "amount": 2 }, { "id": "fbmh_bed1_southeast" }, { "id": "fbmh_bed2_southeast" } ], + "blueprint_excludes": [ { "id": "fbmh_bed1_southeast" }, { "id": "fbmh_bed2_southeast" } ], "blueprint_autocalc": true }, { "type": "recipe", - "result": "faction_base_modular_field_tent_bed3_southeast", + "result": "faction_base_modular_hub_tent_bed3_southeast", "description": "A pair of proper beds in the southeast tent will allow us to house two more people and expand the camp.", "category": "CC_BUILDING", "subcategory": "CSC_BUILDING_BASES", "autolearn": false, "never_learn": true, - "construction_blueprint": "fbmf_tent_bed3_southeast", + "construction_blueprint": "fbmh_tent_bed3_southeast", "blueprint_name": "southeast beds", - "blueprint_requires": [ { "id": "fbmf_tent_southeast" } ], - "blueprint_provides": [ { "id": "bed", "amount": 2 }, { "id": "fbmf_bed1_southeast" }, { "id": "fbmf_bed2_southeast" } ], - "blueprint_excludes": [ { "id": "fbmf_bed1_southeast" }, { "id": "fbmf_bed2_southeast" } ], + "blueprint_requires": [ { "id": "fbmh_tent_southeast" } ], + "blueprint_provides": [ { "id": "bed", "amount": 2 }, { "id": "fbmh_bed1_southeast" }, { "id": "fbmh_bed2_southeast" } ], + "blueprint_excludes": [ { "id": "fbmh_bed1_southeast" }, { "id": "fbmh_bed2_southeast" } ], "blueprint_autocalc": true }, { "type": "recipe", - "result": "faction_base_modular_field_room_strawbed3_southeast", + "result": "faction_base_modular_hub_room_strawbed3_southeast", "description": "A pair of straw beds in the southeast room will allow us to house two more people and expand the camp.", "category": "CC_BUILDING", "subcategory": "CSC_BUILDING_BASES", "autolearn": false, "never_learn": true, - "construction_blueprint": "fbmf_room_strawbed3_southeast", + "construction_blueprint": "fbmh_room_strawbed3_southeast", "blueprint_name": "southeast straw beds", - "blueprint_requires": [ { "id": "fbmf_southeast", "amount": 4 } ], - "blueprint_provides": [ { "id": "bed", "amount": 2 }, { "id": "fbmf_bed1_southeast" }, { "id": "fbmf_bed2_southeast" } ], - "blueprint_excludes": [ { "id": "fbmf_bed1_southeast" }, { "id": "fbmf_bed2_southeast" }, { "id": "fbmf_tent_southeast" } ], + "blueprint_requires": [ { "id": "fbmh_southeast", "amount": 4 } ], + "blueprint_provides": [ { "id": "bed", "amount": 2 }, { "id": "fbmh_bed1_southeast" }, { "id": "fbmh_bed2_southeast" } ], + "blueprint_excludes": [ { "id": "fbmh_bed1_southeast" }, { "id": "fbmh_bed2_southeast" }, { "id": "fbmh_tent_southeast" } ], "blueprint_autocalc": true }, { "type": "recipe", - "result": "faction_base_modular_field_room_bed3_southeast", + "result": "faction_base_modular_hub_room_bed3_southeast", "description": "A pair of proper beds in the southeast room will allow us to house two more people and expand the camp.", "category": "CC_BUILDING", "subcategory": "CSC_BUILDING_BASES", "autolearn": false, "never_learn": true, - "construction_blueprint": "fbmf_room_bed3_southeast", + "construction_blueprint": "fbmh_room_bed3_southeast", "blueprint_name": "southeast beds", - "blueprint_requires": [ { "id": "fbmf_southeast", "amount": 4 } ], - "blueprint_provides": [ { "id": "bed", "amount": 2 }, { "id": "fbmf_bed1_southeast" }, { "id": "fbmf_bed2_southeast" } ], - "blueprint_excludes": [ { "id": "fbmf_bed1_southeast" }, { "id": "fbmf_bed2_southeast" }, { "id": "fbmf_tent_southeast" } ], + "blueprint_requires": [ { "id": "fbmh_southeast", "amount": 4 } ], + "blueprint_provides": [ { "id": "bed", "amount": 2 }, { "id": "fbmh_bed1_southeast" }, { "id": "fbmh_bed2_southeast" } ], + "blueprint_excludes": [ { "id": "fbmh_bed1_southeast" }, { "id": "fbmh_bed2_southeast" }, { "id": "fbmh_tent_southeast" } ], "blueprint_autocalc": true }, { "type": "recipe", - "result": "faction_base_modular_field_strawbed3_northwest", + "result": "faction_base_modular_hub_strawbed3_northwest", "description": "A pair of straw beds in the northwest building will allow us to house two more people and expand the camp.", "category": "CC_BUILDING", "subcategory": "CSC_BUILDING_BASES", "autolearn": false, "never_learn": true, - "construction_blueprint": "fbmf_strawbed3_northwest", + "construction_blueprint": "fbmh_strawbed3_northwest", "blueprint_name": "northwest straw beds", - "blueprint_requires": [ { "id": "fbmf_northwest", "amount": 4 } ], - "blueprint_provides": [ { "id": "bed", "amount": 2 }, { "id": "fbmf_bed1_northwest" }, { "id": "fbmf_bed2_northwest" } ], - "blueprint_excludes": [ { "id": "fbmf_bed1_northwest" }, { "id": "fbmf_bed2_northwest" } ], + "blueprint_requires": [ { "id": "fbmh_northwest", "amount": 4 } ], + "blueprint_provides": [ { "id": "bed", "amount": 2 }, { "id": "fbmh_bed1_northwest" }, { "id": "fbmh_bed2_northwest" } ], + "blueprint_excludes": [ { "id": "fbmh_bed1_northwest" }, { "id": "fbmh_bed2_northwest" } ], "blueprint_autocalc": true }, { "type": "recipe", - "result": "faction_base_modular_field_bed3_northwest", + "result": "faction_base_modular_hub_bed3_northwest", "description": "A pair of proper beds in the northwest building will allow us to house two more people and expand the camp.", "category": "CC_BUILDING", "subcategory": "CSC_BUILDING_BASES", "autolearn": false, "never_learn": true, - "construction_blueprint": "fbmf_bed3_northwest", + "construction_blueprint": "fbmh_bed3_northwest", "blueprint_name": "northwest beds", - "blueprint_requires": [ { "id": "fbmf_northwest", "amount": 4 } ], - "blueprint_provides": [ { "id": "bed", "amount": 2 }, { "id": "fbmf_bed1_northwest" }, { "id": "fbmf_bed2_northwest" } ], - "blueprint_excludes": [ { "id": "fbmf_bed1_northwest" }, { "id": "fbmf_bed2_northwest" } ], + "blueprint_requires": [ { "id": "fbmh_northwest", "amount": 4 } ], + "blueprint_provides": [ { "id": "bed", "amount": 2 }, { "id": "fbmh_bed1_northwest" }, { "id": "fbmh_bed2_northwest" } ], + "blueprint_excludes": [ { "id": "fbmh_bed1_northwest" }, { "id": "fbmh_bed2_northwest" } ], "blueprint_autocalc": true }, { "type": "recipe", - "result": "faction_base_modular_field_tent_strawbed3_west", + "result": "faction_base_modular_hub_tent_strawbed3_west", "description": "A pair of straw beds in the west tent will allow us to house two more people and expand the camp.", "category": "CC_BUILDING", "subcategory": "CSC_BUILDING_BASES", "autolearn": false, "never_learn": true, - "construction_blueprint": "fbmf_tent_strawbed3_west", + "construction_blueprint": "fbmh_tent_strawbed3_west", "blueprint_name": "west straw beds", - "blueprint_requires": [ { "id": "fbmf_tent_west" } ], - "blueprint_provides": [ { "id": "bed", "amount": 2 }, { "id": "fbmf_bed1_west" }, { "id": "fbmf_bed2_west" } ], - "blueprint_excludes": [ { "id": "fbmf_bed1_west" }, { "id": "fbmf_bed2_west" } ], + "blueprint_requires": [ { "id": "fbmh_tent_west" } ], + "blueprint_provides": [ { "id": "bed", "amount": 2 }, { "id": "fbmh_bed1_west" }, { "id": "fbmh_bed2_west" } ], + "blueprint_excludes": [ { "id": "fbmh_bed1_west" }, { "id": "fbmh_bed2_west" } ], "blueprint_autocalc": true }, { "type": "recipe", - "result": "faction_base_modular_field_tent_bed3_west", + "result": "faction_base_modular_hub_tent_bed3_west", "description": "A pair of proper beds in the west tent will allow us to house two more people and expand the camp.", "category": "CC_BUILDING", "subcategory": "CSC_BUILDING_BASES", "autolearn": false, "never_learn": true, - "construction_blueprint": "fbmf_tent_bed3_west", + "construction_blueprint": "fbmh_tent_bed3_west", "blueprint_name": "west beds", - "blueprint_requires": [ { "id": "fbmf_tent_west" } ], - "blueprint_provides": [ { "id": "bed", "amount": 2 }, { "id": "fbmf_bed1_west" }, { "id": "fbmf_bed2_west" } ], - "blueprint_excludes": [ { "id": "fbmf_bed1_west" }, { "id": "fbmf_bed2_west" } ], + "blueprint_requires": [ { "id": "fbmh_tent_west" } ], + "blueprint_provides": [ { "id": "bed", "amount": 2 }, { "id": "fbmh_bed1_west" }, { "id": "fbmh_bed2_west" } ], + "blueprint_excludes": [ { "id": "fbmh_bed1_west" }, { "id": "fbmh_bed2_west" } ], "blueprint_autocalc": true }, { "type": "recipe", - "result": "faction_base_modular_field_room_strawbed3_west", + "result": "faction_base_modular_hub_room_strawbed3_west", "description": "A pair of straw beds in the west room will allow us to house two more people and expand the camp.", "category": "CC_BUILDING", "subcategory": "CSC_BUILDING_BASES", "autolearn": false, "never_learn": true, - "construction_blueprint": "fbmf_room_strawbed3_west", + "construction_blueprint": "fbmh_room_strawbed3_west", "blueprint_name": "west straw beds", - "blueprint_requires": [ { "id": "fbmf_west", "amount": 4 } ], - "blueprint_provides": [ { "id": "bed", "amount": 2 }, { "id": "fbmf_bed1_west" }, { "id": "fbmf_bed2_west" } ], - "blueprint_excludes": [ { "id": "fbmf_bed1_west" }, { "id": "fbmf_bed2_west" }, { "id": "fbmf_tent_west" } ], + "blueprint_requires": [ { "id": "fbmh_west", "amount": 4 } ], + "blueprint_provides": [ { "id": "bed", "amount": 2 }, { "id": "fbmh_bed1_west" }, { "id": "fbmh_bed2_west" } ], + "blueprint_excludes": [ { "id": "fbmh_bed1_west" }, { "id": "fbmh_bed2_west" }, { "id": "fbmh_tent_west" } ], "blueprint_autocalc": true }, { "type": "recipe", - "result": "faction_base_modular_field_room_bed3_west", + "result": "faction_base_modular_hub_room_bed3_west", "description": "A pair of proper beds in the west room will allow us to house two more people and expand the camp.", "category": "CC_BUILDING", "subcategory": "CSC_BUILDING_BASES", "autolearn": false, "never_learn": true, - "construction_blueprint": "fbmf_room_bed3_west", + "construction_blueprint": "fbmh_room_bed3_west", "blueprint_name": "west beds", - "blueprint_requires": [ { "id": "fbmf_west", "amount": 4 } ], - "blueprint_provides": [ { "id": "bed", "amount": 2 }, { "id": "fbmf_bed1_west" }, { "id": "fbmf_bed2_west" } ], - "blueprint_excludes": [ { "id": "fbmf_bed1_west" }, { "id": "fbmf_bed2_west" }, { "id": "fbmf_tent_west" } ], + "blueprint_requires": [ { "id": "fbmh_west", "amount": 4 } ], + "blueprint_provides": [ { "id": "bed", "amount": 2 }, { "id": "fbmh_bed1_west" }, { "id": "fbmh_bed2_west" } ], + "blueprint_excludes": [ { "id": "fbmh_bed1_west" }, { "id": "fbmh_bed2_west" }, { "id": "fbmh_tent_west" } ], "blueprint_autocalc": true }, { "type": "recipe", - "result": "faction_base_modular_field_tent_strawbed3_southwest", + "result": "faction_base_modular_hub_tent_strawbed3_southwest", "description": "A pair of straw beds in the southwest tent will allow us to house two more people and expand the camp.", "category": "CC_BUILDING", "subcategory": "CSC_BUILDING_BASES", "autolearn": false, "never_learn": true, - "construction_blueprint": "fbmf_tent_strawbed3_southwest", + "construction_blueprint": "fbmh_tent_strawbed3_southwest", "blueprint_name": "southwest straw beds", - "blueprint_requires": [ { "id": "fbmf_tent_southwest" } ], - "blueprint_provides": [ { "id": "bed", "amount": 2 }, { "id": "fbmf_bed1_southwest" }, { "id": "fbmf_bed2_southwest" } ], - "blueprint_excludes": [ { "id": "fbmf_bed1_southwest" }, { "id": "fbmf_bed2_southwest" } ], + "blueprint_requires": [ { "id": "fbmh_tent_southwest" } ], + "blueprint_provides": [ { "id": "bed", "amount": 2 }, { "id": "fbmh_bed1_southwest" }, { "id": "fbmh_bed2_southwest" } ], + "blueprint_excludes": [ { "id": "fbmh_bed1_southwest" }, { "id": "fbmh_bed2_southwest" } ], "blueprint_autocalc": true }, { "type": "recipe", - "result": "faction_base_modular_field_tent_bed3_southwest", + "result": "faction_base_modular_hub_tent_bed3_southwest", "description": "A pair of proper beds in the southwest tent will allow us to house two more people and expand the camp.", "category": "CC_BUILDING", "subcategory": "CSC_BUILDING_BASES", "autolearn": false, "never_learn": true, - "construction_blueprint": "fbmf_tent_bed3_southwest", + "construction_blueprint": "fbmh_tent_bed3_southwest", "blueprint_name": "southwest beds", - "blueprint_requires": [ { "id": "fbmf_tent_southwest" } ], - "blueprint_provides": [ { "id": "bed", "amount": 2 }, { "id": "fbmf_bed1_southwest" }, { "id": "fbmf_bed2_southwest" } ], - "blueprint_excludes": [ { "id": "fbmf_bed1_southwest" }, { "id": "fbmf_bed2_southwest" } ], + "blueprint_requires": [ { "id": "fbmh_tent_southwest" } ], + "blueprint_provides": [ { "id": "bed", "amount": 2 }, { "id": "fbmh_bed1_southwest" }, { "id": "fbmh_bed2_southwest" } ], + "blueprint_excludes": [ { "id": "fbmh_bed1_southwest" }, { "id": "fbmh_bed2_southwest" } ], "blueprint_autocalc": true }, { "type": "recipe", - "result": "faction_base_modular_field_room_strawbed3_southwest", + "result": "faction_base_modular_hub_room_strawbed3_southwest", "description": "A pair of straw beds in the southwest room will allow us to house two more people and expand the camp.", "category": "CC_BUILDING", "subcategory": "CSC_BUILDING_BASES", "autolearn": false, "never_learn": true, - "construction_blueprint": "fbmf_room_strawbed3_southwest", + "construction_blueprint": "fbmh_room_strawbed3_southwest", "blueprint_name": "southwest straw beds", - "blueprint_requires": [ { "id": "fbmf_southwest", "amount": 4 } ], - "blueprint_provides": [ { "id": "bed", "amount": 2 }, { "id": "fbmf_bed1_southwest" }, { "id": "fbmf_bed2_southwest" } ], - "blueprint_excludes": [ { "id": "fbmf_bed1_southwest" }, { "id": "fbmf_bed2_southwest" }, { "id": "fbmf_tent_southwest" } ], + "blueprint_requires": [ { "id": "fbmh_southwest", "amount": 4 } ], + "blueprint_provides": [ { "id": "bed", "amount": 2 }, { "id": "fbmh_bed1_southwest" }, { "id": "fbmh_bed2_southwest" } ], + "blueprint_excludes": [ { "id": "fbmh_bed1_southwest" }, { "id": "fbmh_bed2_southwest" }, { "id": "fbmh_tent_southwest" } ], "blueprint_autocalc": true }, { "type": "recipe", - "result": "faction_base_modular_field_room_bed3_southwest", + "result": "faction_base_modular_hub_room_bed3_southwest", "description": "A pair of proper beds in the southwest room will allow us to house two more people and expand the camp.", "category": "CC_BUILDING", "subcategory": "CSC_BUILDING_BASES", "autolearn": false, "never_learn": true, - "construction_blueprint": "fbmf_room_bed3_southwest", + "construction_blueprint": "fbmh_room_bed3_southwest", "blueprint_name": "southwest beds", - "blueprint_requires": [ { "id": "fbmf_southwest", "amount": 4 } ], - "blueprint_provides": [ { "id": "bed", "amount": 2 }, { "id": "fbmf_bed1_southwest" }, { "id": "fbmf_bed2_southwest" } ], - "blueprint_excludes": [ { "id": "fbmf_bed1_southwest" }, { "id": "fbmf_bed2_southwest" }, { "id": "fbmf_tent_southwest" } ], + "blueprint_requires": [ { "id": "fbmh_southwest", "amount": 4 } ], + "blueprint_provides": [ { "id": "bed", "amount": 2 }, { "id": "fbmh_bed1_southwest" }, { "id": "fbmh_bed2_southwest" } ], + "blueprint_excludes": [ { "id": "fbmh_bed1_southwest" }, { "id": "fbmh_bed2_southwest" }, { "id": "fbmh_tent_southwest" } ], "blueprint_autocalc": true }, { "type": "recipe", - "result": "faction_base_modular_field_core_kitchen_fireplace_center", + "result": "faction_base_modular_hub_core_kitchen_fireplace_center", "description": "A fireplace, counter, and some pots and pans in the central building will allow us to cook simple recipes and organize hunting expeditions.", "category": "CC_BUILDING", "subcategory": "CSC_BUILDING_BASES", "autolearn": false, "never_learn": true, - "construction_blueprint": "fbmf_core_kitchen_fireplace_center", + "construction_blueprint": "fbmh_core_kitchen_fireplace_center", "blueprint_name": "central fireplace", - "blueprint_requires": [ { "id": "fbmf_center", "amount": 2 }, { "id": "fbmf_ne_center" } ], + "blueprint_requires": [ { "id": "fbmh_center", "amount": 2 }, { "id": "fbmh_ne_center" } ], "blueprint_provides": [ { "id": "trapping" }, { "id": "hunting" }, { "id": "kitchen" }, { "id": "kitchen_recipes_1" } ], "blueprint_resources": [ "fake_fireplace", "pot" ], "blueprint_autocalc": true }, { "type": "recipe", - "result": "faction_base_modular_field_core_kitchen_butchery_center", + "result": "faction_base_modular_hub_core_kitchen_butchery_center", "description": "We need a butchery rack to maximize the harvest from our hunting and trapping efforts.", "category": "CC_BUILDING", "subcategory": "CSC_BUILDING_BASES", "autolearn": false, "never_learn": true, - "construction_blueprint": "fbmf_core_kitchen_butchery_center", + "construction_blueprint": "fbmh_core_kitchen_butchery_center", "blueprint_name": "central butchery rack", - "blueprint_requires": [ { "id": "fbmf_center", "amount": 2 }, { "id": "fbmf_ne_center" } ], + "blueprint_requires": [ { "id": "fbmh_center", "amount": 2 }, { "id": "fbmh_ne_center" } ], "blueprint_provides": [ { "id": "trapping" }, { "id": "hunting" } ], "blueprint_autocalc": true }, { "type": "recipe", - "result": "faction_base_modular_field_core_kitchen_toolrack_center", + "result": "faction_base_modular_hub_core_kitchen_toolrack_center", "description": "A tool rack in the central building will give us a place to store tools.", "category": "CC_BUILDING", "subcategory": "CSC_BUILDING_BASES", "autolearn": false, "never_learn": true, - "construction_blueprint": "fbmf_core_kitchen_toolrack_center", + "construction_blueprint": "fbmh_core_kitchen_toolrack_center", "blueprint_name": "central tool rack", - "blueprint_requires": [ { "id": "fbmf_center", "amount": 2 }, { "id": "fbmf_nw_center" } ], + "blueprint_requires": [ { "id": "fbmh_center", "amount": 2 }, { "id": "fbmh_nw_center" } ], "blueprint_provides": [ { "id": "tool_storage" } ], "blueprint_autocalc": true }, { "type": "recipe", - "result": "faction_base_modular_field_core_kitchen_table_center", + "result": "faction_base_modular_hub_core_kitchen_table_center", "description": "Setting up some tables and chairs will make the central building into a dining area, and we can also use them as a workspace to organize the camp.", "category": "CC_BUILDING", "subcategory": "CSC_BUILDING_BASES", "autolearn": false, "never_learn": true, - "construction_blueprint": "fbmf_core_kitchen_table_center", + "construction_blueprint": "fbmh_core_kitchen_table_center", "blueprint_name": "central dining hall", - "blueprint_requires": [ { "id": "fbmf_center", "amount": 4 }, { "id": "fbmf_ne_center" }, { "id": "fbmf_nw_center" } ], + "blueprint_requires": [ { "id": "fbmh_center", "amount": 4 }, { "id": "fbmh_ne_center" }, { "id": "fbmh_nw_center" } ], "blueprint_provides": [ { "id": "relaying" }, { "id": "walls" }, { "id": "recruiting" }, { "id": "scouting" }, { "id": "patrolling" } ], "blueprint_autocalc": true }, { "type": "recipe", - "result": "faction_base_modular_field_core_kitchen_table_south", + "result": "faction_base_modular_hub_core_kitchen_table_south", "description": "Setting up some tables and chairs will make the central building into a dining area, and we can also use them as a workspace to organize the camp.", "category": "CC_BUILDING", "subcategory": "CSC_BUILDING_BASES", "skill_used": "fabrication", "autolearn": false, "never_learn": true, - "construction_blueprint": "fbmf_core_kitchen_table_south", + "construction_blueprint": "fbmh_core_kitchen_table_south", "blueprint_name": "south dining hall", - "blueprint_requires": [ { "id": "fbmf_south", "amount": 4 }, { "id": "fbmf_se_south" }, { "id": "fbmf_sw_south" } ], + "blueprint_requires": [ { "id": "fbmh_south", "amount": 4 }, { "id": "fbmh_se_south" }, { "id": "fbmh_sw_south" } ], "blueprint_provides": [ { "id": "relaying" }, { "id": "walls" }, { "id": "recruiting" }, { "id": "scouting" }, { "id": "patrolling" } ], "blueprint_autocalc": true }, { "type": "recipe", - "result": "faction_base_modular_field_core_kitchen_stove_south", + "result": "faction_base_modular_hub_core_kitchen_stove_south", "description": "A wood stove, counter, and some pots and pans in the south half of the central building will allow us to cook simple recipes and organize hunting expeditions. The stove will be more efficient than a fireplace.", "category": "CC_BUILDING", "subcategory": "CSC_BUILDING_BASES", "autolearn": false, "never_learn": true, - "construction_blueprint": "fbmf_core_kitchen_stove_south", + "construction_blueprint": "fbmh_core_kitchen_stove_south", "blueprint_name": "south wood stove", "blueprint_resources": [ "fake_stove" ], - "blueprint_requires": [ { "id": "fbmf_south", "amount": 2 }, { "id": "fbmf_sw_south" } ], + "blueprint_requires": [ { "id": "fbmh_south", "amount": 2 }, { "id": "fbmh_sw_south" } ], "blueprint_provides": [ { "id": "trapping" }, { "id": "hunting" }, { "id": "kitchen" }, { "id": "kitchen_recipes_1" } ], "blueprint_autocalc": true }, { "type": "recipe", - "result": "faction_base_modular_field_well_north", + "result": "faction_base_modular_hub_well_north", "description": "Digging a well will give us easy access to water.", "category": "CC_BUILDING", "subcategory": "CSC_BUILDING_BASES", "autolearn": false, "never_learn": true, - "construction_blueprint": "fbmf_well_north", + "construction_blueprint": "fbmh_well_north", "blueprint_name": "north water well", - "blueprint_requires": [ { "id": "fbmf_northeast", "amount": 4 }, { "id": "fbmf_fire_northeast" }, { "id": "fbmf_bed2_northeast" } ], + "blueprint_requires": [ { "id": "fbmh_northeast", "amount": 4 }, { "id": "fbmh_fire_northeast" }, { "id": "fbmh_bed2_northeast" } ], "blueprint_autocalc": true }, { "type": "recipe", - "result": "faction_base_modular_field_root_cellar_north", + "result": "faction_base_modular_hub_root_cellar_north", "description": "Digging a root cellar will give us a way to preserve food.", "category": "CC_BUILDING", "subcategory": "CSC_BUILDING_BASES", "autolearn": false, "never_learn": true, - "construction_blueprint": "fbmf_root_cellar_north", + "construction_blueprint": "fbmh_root_cellar_north", "blueprint_name": "north root cellar", "blueprint_provides": [ { "id": "pantry" } ], - "blueprint_requires": [ { "id": "fbmf_northeast", "amount": 4 }, { "id": "fbmf_fire_northeast" }, { "id": "fbmf_bed2_northeast" } ], + "blueprint_requires": [ { "id": "fbmh_northeast", "amount": 4 }, { "id": "fbmh_fire_northeast" }, { "id": "fbmh_bed2_northeast" } ], "blueprint_autocalc": true }, { "type": "recipe", - "result": "faction_base_modular_field_radio_tower_north", + "result": "faction_base_modular_hub_radio_tower_north", "description": "We could build a radio tower to improve the range of our radios.", "category": "CC_BUILDING", "subcategory": "CSC_BUILDING_BASES", @@ -524,10 +549,10 @@ "autolearn": false, "never_learn": true, "time": "24 h", - "construction_blueprint": "fbmf_radio_tower_north", + "construction_blueprint": "fbmh_radio_tower_north", "blueprint_name": "north radio tower", - "blueprint_provides": [ { "id": "fbmf_radio_tower_north" } ], - "blueprint_requires": [ { "id": "fbmf_northeast", "amount": 4 }, { "id": "fbmf_fire_northeast" }, { "id": "fbmf_bed2_northeast" } ], + "blueprint_provides": [ { "id": "fbmh_radio_tower_north" } ], + "blueprint_requires": [ { "id": "fbmh_northeast", "amount": 4 }, { "id": "fbmh_fire_northeast" }, { "id": "fbmh_bed2_northeast" } ], "qualities": [ { "id": "HAMMER", "level": 2 }, { "id": "SAW_M", "level": 1 }, @@ -551,7 +576,7 @@ }, { "type": "recipe", - "result": "faction_base_modular_field_radio_console_north", + "result": "faction_base_modular_hub_radio_console_north", "description": "Adding a console to control the radio tower will help with recruiting more survivors.", "category": "CC_BUILDING", "subcategory": "CSC_BUILDING_BASES", @@ -560,10 +585,10 @@ "autolearn": false, "never_learn": true, "time": "24 h", - "construction_blueprint": "fbmf_radio_console_north", + "construction_blueprint": "fbmh_radio_console_north", "blueprint_name": "north radio console", - "blueprint_provides": [ { "id": "fbmf_radio_console_north" }, { "id": "radio" } ], - "blueprint_requires": [ { "id": "fbmf_radio_tower_north" } ], + "blueprint_provides": [ { "id": "fbmh_radio_console_north" }, { "id": "radio" } ], + "blueprint_requires": [ { "id": "fbmh_radio_tower_north" } ], "qualities": [ { "id": "SAW_M", "level": 1 }, { "id": "WRENCH", "level": 1 }, { "id": "SCREW", "level": 1 } ], "components": [ [ [ "processor", 2 ] ], @@ -588,7 +613,7 @@ "autolearn": false, "never_learn": true, "time": "1 m", - "construction_blueprint": "faction_base_modular_field_0", + "construction_blueprint": "faction_base_modular_hub_0", "blueprint_name": "basic survey", "blueprint_requires": [ { "id": "not_an_upgrade" } ] }, @@ -602,7 +627,7 @@ "autolearn": false, "never_learn": true, "time": "1 m", - "construction_blueprint": "faction_base_modular_field_0", + "construction_blueprint": "faction_base_modular_hub_0", "blueprint_name": "basic survey", "blueprint_requires": [ { "id": "not_an_upgrade" } ] }, @@ -616,7 +641,7 @@ "autolearn": false, "never_learn": true, "time": "1 m", - "construction_blueprint": "faction_base_modular_field_0", + "construction_blueprint": "faction_base_modular_hub_0", "blueprint_name": "basic survey", "blueprint_requires": [ { "id": "not_an_upgrade" } ] }, @@ -630,7 +655,7 @@ "autolearn": false, "never_learn": true, "time": "1 m", - "construction_blueprint": "faction_base_modular_field_0", + "construction_blueprint": "faction_base_modular_hub_0", "blueprint_name": "basic survey", "blueprint_requires": [ { "id": "not_an_upgrade" } ] } diff --git a/data/json/recipes/basecamps/recipe_modular_field_defenses.json b/data/json/recipes/basecamps/recipe_modular_field_defenses.json index 200aab48d7a08..e474d09f60d96 100644 --- a/data/json/recipes/basecamps/recipe_modular_field_defenses.json +++ b/data/json/recipes/basecamps/recipe_modular_field_defenses.json @@ -1,120 +1,122 @@ [ { "type": "recipe", - "result": "faction_base_modular_field_trench_north", + "result": "faction_base_modular_hub_trench_north", "description": "Digging a trench along the north edge of the camp would provide some defense and generate building materials.", "category": "CC_BUILDING", "subcategory": "CSC_BUILDING_BASES", "autolearn": false, "never_learn": true, - "construction_blueprint": "fbmf_trench_north", + "construction_blueprint": "fbmh_trench_north", "blueprint_name": "north trench", - "blueprint_provides": [ { "id": "fbmf_trench_north" } ], - "blueprint_requires": [ { "id": "fbmf_northeast", "amount": 4 }, { "id": "fbmf_fire_northeast" }, { "id": "fbmf_bed2_northeast" } ], + "blueprint_provides": [ { "id": "fbmh_trench_north" } ], + "blueprint_requires": [ { "id": "fbmh_northeast", "amount": 4 }, { "id": "fbmh_fire_northeast" }, { "id": "fbmh_bed2_northeast" } ], + "blueprint_excludes": [ { "id": "fbm_no_dig" } ], "blueprint_autocalc": true }, { "type": "recipe", - "result": "faction_base_modular_field_trench_south", + "result": "faction_base_modular_hub_trench_south", "description": "Digging a trench along the south edge of the camp would provide some defense and generate building materials.", "category": "CC_BUILDING", "subcategory": "CSC_BUILDING_BASES", "autolearn": false, "never_learn": true, - "construction_blueprint": "fbmf_trench_south", + "construction_blueprint": "fbmh_trench_south", "blueprint_name": "south trench", - "blueprint_provides": [ { "id": "fbmf_trench_south" } ], - "blueprint_requires": [ { "id": "fbmf_northeast", "amount": 4 }, { "id": "fbmf_fire_northeast" }, { "id": "fbmf_bed2_northeast" } ], + "blueprint_provides": [ { "id": "fbmh_trench_south" } ], + "blueprint_requires": [ { "id": "fbmh_northeast", "amount": 4 }, { "id": "fbmh_fire_northeast" }, { "id": "fbmh_bed2_northeast" } ], + "blueprint_excludes": [ { "id": "fbm_no_dig" } ], "blueprint_autocalc": true }, { "type": "recipe", - "result": "faction_base_modular_field_trench_northeast", + "result": "faction_base_modular_hub_trench_northeast", "description": "Digging a trench along the northeast corner of the camp would provide some defense and generate building materials. If we have solid buildings all along the east side of the camp, we would only need to dig the trench long enough to reach the buildings.", "category": "CC_BUILDING", "subcategory": "CSC_BUILDING_BASES", "skill_used": "fabrication", "never_learn": true, - "construction_blueprint": "fbmf_trench_corner_northeast", + "construction_blueprint": "fbmh_trench_corner_northeast", "blueprint_name": "northeast trench", - "blueprint_provides": [ { "id": "fbmf_trench_northeast" } ], - "blueprint_requires": [ { "id": "fbmf_northeast", "amount": 4 }, { "id": "fbmf_fire_northeast" }, { "id": "fbmf_bed2_northeast" } ], - "blueprint_excludes": [ { "id": "fbmf_trench_northeast" }, { "id": "fbmf_trench_east" } ], + "blueprint_provides": [ { "id": "fbmh_trench_northeast" } ], + "blueprint_requires": [ { "id": "fbmh_northeast", "amount": 4 }, { "id": "fbmh_fire_northeast" }, { "id": "fbmh_bed2_northeast" } ], + "blueprint_excludes": [ { "id": "fbm_no_dig" }, { "id": "fbmh_trench_northeast" }, { "id": "fbmh_trench_east" } ], "blueprint_autocalc": true }, { "type": "recipe", - "result": "faction_base_modular_field_trench_northwest", + "result": "faction_base_modular_hub_trench_northwest", "description": "Digging a trench along the northwest corner of the camp would provide some defense and generate building materials. If we have solid buildings all along the west side of the camp, we would only need to dig the trench long enough to reach the buildings.", "category": "CC_BUILDING", "subcategory": "CSC_BUILDING_BASES", "autolearn": false, "never_learn": true, - "construction_blueprint": "fbmf_trench_corner_northwest", + "construction_blueprint": "fbmh_trench_corner_northwest", "blueprint_name": "northwest trench", - "blueprint_provides": [ { "id": "fbmf_trench_northwest" } ], - "blueprint_requires": [ { "id": "fbmf_northeast", "amount": 4 }, { "id": "fbmf_fire_northeast" }, { "id": "fbmf_bed2_northeast" } ], - "blueprint_excludes": [ { "id": "fbmf_trench_northwest" }, { "id": "fbmf_trench_west" } ], + "blueprint_provides": [ { "id": "fbmh_trench_northwest" } ], + "blueprint_requires": [ { "id": "fbmh_northeast", "amount": 4 }, { "id": "fbmh_fire_northeast" }, { "id": "fbmh_bed2_northeast" } ], + "blueprint_excludes": [ { "id": "fbm_no_dig" }, { "id": "fbmh_trench_northwest" }, { "id": "fbmh_trench_west" } ], "blueprint_autocalc": true }, { "type": "recipe", - "result": "faction_base_modular_field_trench_southeast", + "result": "faction_base_modular_hub_trench_southeast", "description": "Digging a trench along the southeast corner of the camp would provide some defense and generate building materials. If we have solid buildings all along the east side of the camp, we would only need to dig the trench long enough to reach the buildings.", "category": "CC_BUILDING", "subcategory": "CSC_BUILDING_BASES", "autolearn": false, "never_learn": true, - "construction_blueprint": "fbmf_trench_corner_southeast", + "construction_blueprint": "fbmh_trench_corner_southeast", "blueprint_name": "southeast trench", - "blueprint_provides": [ { "id": "fbmf_trench_southeast" } ], - "blueprint_requires": [ { "id": "fbmf_northeast", "amount": 4 }, { "id": "fbmf_fire_northeast" }, { "id": "fbmf_bed2_northeast" } ], - "blueprint_excludes": [ { "id": "fbmf_trench_southeast" }, { "id": "fbmf_trench_east" } ], + "blueprint_provides": [ { "id": "fbmh_trench_southeast" } ], + "blueprint_requires": [ { "id": "fbmh_northeast", "amount": 4 }, { "id": "fbmh_fire_northeast" }, { "id": "fbmh_bed2_northeast" } ], + "blueprint_excludes": [ { "id": "fbm_no_dig" }, { "id": "fbmh_trench_southeast" }, { "id": "fbmh_trench_east" } ], "blueprint_autocalc": true }, { "type": "recipe", - "result": "faction_base_modular_field_trench_southwest", + "result": "faction_base_modular_hub_trench_southwest", "description": "Digging a trench along the southwest corner of the camp would provide some defense and generate building materials. If we have solid buildings all along the west side of the camp, we would only need to dig the trench long enough to reach the buildings.", "category": "CC_BUILDING", "subcategory": "CSC_BUILDING_BASES", "autolearn": false, "never_learn": true, - "construction_blueprint": "fbmf_trench_corner_southwest", + "construction_blueprint": "fbmh_trench_corner_southwest", "blueprint_name": "southwest trench", - "blueprint_provides": [ { "id": "fbmf_trench_southwest" } ], - "blueprint_requires": [ { "id": "fbmf_northeast", "amount": 4 }, { "id": "fbmf_fire_northeast" }, { "id": "fbmf_bed2_northeast" } ], - "blueprint_excludes": [ { "id": "fbmf_trench_southwest" }, { "id": "fbmf_trench_west" } ], + "blueprint_provides": [ { "id": "fbmh_trench_southwest" } ], + "blueprint_requires": [ { "id": "fbmh_northeast", "amount": 4 }, { "id": "fbmh_fire_northeast" }, { "id": "fbmh_bed2_northeast" } ], + "blueprint_excludes": [ { "id": "fbm_no_dig" }, { "id": "fbmh_trench_southwest" }, { "id": "fbmh_trench_west" } ], "blueprint_autocalc": true }, { "type": "recipe", - "result": "faction_base_modular_field_trench_east", + "result": "faction_base_modular_hub_trench_east", "description": "Digging a trench along the east edge of the camp would provide some defense and generate building materials. We'll need to run the trench the length of the camp if we don't have solid buildings all along the east side.", "category": "CC_BUILDING", "subcategory": "CSC_BUILDING_BASES", "autolearn": false, "never_learn": true, - "construction_blueprint": "fbmf_trench_east", + "construction_blueprint": "fbmh_trench_east", "blueprint_name": "east trench", - "blueprint_provides": [ { "id": "fbmf_trench_east" } ], - "blueprint_requires": [ { "id": "fbmf_northeast", "amount": 4 }, { "id": "fbmf_fire_northeast" }, { "id": "fbmf_bed2_northeast" } ], - "blueprint_excludes": [ { "id": "fbmf_trench_southeast" }, { "id": "fbmf_trench_northeast" } ], + "blueprint_provides": [ { "id": "fbmh_trench_east" } ], + "blueprint_requires": [ { "id": "fbmh_northeast", "amount": 4 }, { "id": "fbmh_fire_northeast" }, { "id": "fbmh_bed2_northeast" } ], + "blueprint_excludes": [ { "id": "fbm_no_dig" }, { "id": "fbmh_trench_southeast" }, { "id": "fbmh_trench_northeast" } ], "blueprint_autocalc": true }, { "type": "recipe", - "result": "faction_base_modular_field_trench_west", + "result": "faction_base_modular_hub_trench_west", "description": "Digging a trench along the west edge of the camp would provide some defense and generate building materials. We'll need to run the trench the length of the camp if we don't have solid buildings all along the west side.", "category": "CC_BUILDING", "subcategory": "CSC_BUILDING_BASES", "autolearn": false, "never_learn": true, - "construction_blueprint": "fbmf_trench_west", + "construction_blueprint": "fbmh_trench_west", "blueprint_name": "west trench", - "blueprint_provides": [ { "id": "fbmf_trench_west" } ], - "blueprint_requires": [ { "id": "fbmf_northeast", "amount": 4 }, { "id": "fbmf_fire_northeast" }, { "id": "fbmf_bed2_northeast" } ], - "blueprint_excludes": [ { "id": "fbmf_trench_southwest" }, { "id": "fbmf_trench_northwest" } ], + "blueprint_provides": [ { "id": "fbmh_trench_west" } ], + "blueprint_requires": [ { "id": "fbmh_northeast", "amount": 4 }, { "id": "fbmh_fire_northeast" }, { "id": "fbmh_bed2_northeast" } ], + "blueprint_excludes": [ { "id": "fbm_no_dig" }, { "id": "fbmh_trench_southwest" }, { "id": "fbmh_trench_northwest" } ], "blueprint_autocalc": true } ] diff --git a/data/json/recipes/basecamps/recipe_modular_field_metal.json b/data/json/recipes/basecamps/recipe_modular_field_metal.json index 2828f49324962..29dc1dc66254f 100644 --- a/data/json/recipes/basecamps/recipe_modular_field_metal.json +++ b/data/json/recipes/basecamps/recipe_modular_field_metal.json @@ -1,336 +1,336 @@ [ { "type": "recipe", - "result": "faction_base_modular_field_room0_metal_northeast", + "result": "faction_base_modular_hub_room0_metal_northeast", "description": "We need some shelter, so build half of a metal shack with a metal roof on the northeast side of the camp", "category": "CC_BUILDING", "subcategory": "CSC_BUILDING_BASES", "autolearn": false, "never_learn": true, - "construction_blueprint": "fbmf_room0_metal_northeast", + "construction_blueprint": "fbmh_room0_metal_northeast", "blueprint_name": "northeast shack", - "blueprint_requires": [ { "id": "faction_base_modular_field_0" } ], - "blueprint_provides": [ { "id": "fbmf_northeast" } ], - "blueprint_excludes": [ { "id": "fbmf_northeast" } ], + "blueprint_requires": [ { "id": "fbmh_0" } ], + "blueprint_provides": [ { "id": "fbmh_northeast" } ], + "blueprint_excludes": [ { "id": "fbmh_northeast" } ], "blueprint_autocalc": true }, { "type": "recipe", - "result": "faction_base_modular_field_room1_metal_northeast", + "result": "faction_base_modular_hub_room1_metal_northeast", "description": "We should use metal to expand the shelter so we have space for another bed.", "category": "CC_BUILDING", "subcategory": "CSC_BUILDING_BASES", "autolearn": false, "never_learn": true, - "construction_blueprint": "fbmf_room1_metal_northeast", + "construction_blueprint": "fbmh_room1_metal_northeast", "blueprint_name": "expand northeast shack", - "blueprint_requires": [ { "id": "fbmf_northeast" } ], - "blueprint_provides": [ { "id": "fbmf_northeast" } ], - "blueprint_excludes": [ { "id": "fbmf_northeast", "amount": 2 }, { "id": "fbmf_tent_northeast" } ], + "blueprint_requires": [ { "id": "fbmh_northeast" } ], + "blueprint_provides": [ { "id": "fbmh_northeast" } ], + "blueprint_excludes": [ { "id": "fbmh_northeast", "amount": 2 }, { "id": "fbmh_tent_northeast" } ], "blueprint_autocalc": true }, { "type": "recipe", - "result": "faction_base_modular_field_room2_metal_northeast", + "result": "faction_base_modular_hub_room2_metal_northeast", "description": "We should use metal to finish the northeast shack.", "category": "CC_BUILDING", "subcategory": "CSC_BUILDING_BASES", "autolearn": false, "never_learn": true, - "construction_blueprint": "fbmf_room2_metal_northeast", + "construction_blueprint": "fbmh_room2_metal_northeast", "blueprint_name": "finish northeast shack", - "blueprint_requires": [ { "id": "fbmf_northeast", "amount": 2 } ], - "blueprint_provides": [ { "id": "fbmf_northeast", "amount": 2 } ], - "blueprint_excludes": [ { "id": "fbmf_northeast", "amount": 4 }, { "id": "fbmf_tent_northeast" } ], + "blueprint_requires": [ { "id": "fbmh_northeast", "amount": 2 } ], + "blueprint_provides": [ { "id": "fbmh_northeast", "amount": 2 } ], + "blueprint_excludes": [ { "id": "fbmh_northeast", "amount": 4 }, { "id": "fbmh_tent_northeast" } ], "blueprint_autocalc": true }, { "type": "recipe", - "result": "faction_base_modular_field_shack4_metal_east", + "result": "faction_base_modular_hub_shack4_metal_east", "description": "We should expand our housing by putting up a metal building on the east side, which we can also use as part of the central building.", "category": "CC_BUILDING", "subcategory": "CSC_BUILDING_BASES", "autolearn": false, "never_learn": true, - "construction_blueprint": "fbmf_shack4_metal_east", + "construction_blueprint": "fbmh_shack4_metal_east", "blueprint_name": "east shack", - "blueprint_requires": [ { "id": "fbmf_tent_northeast" }, { "id": "fbmf_fire_northeast" }, { "id": "fbmf_bed2_northeast" } ], - "blueprint_provides": [ { "id": "fbmf_east", "amount": 4 } ], - "blueprint_excludes": [ { "id": "fbmf_east" } ], + "blueprint_requires": [ { "id": "fbmh_tent_northeast" }, { "id": "fbmh_fire_northeast" }, { "id": "fbmh_bed2_northeast" } ], + "blueprint_provides": [ { "id": "fbmh_east", "amount": 4 } ], + "blueprint_excludes": [ { "id": "fbmh_east" } ], "blueprint_autocalc": true }, { "type": "recipe", - "result": "faction_base_modular_field_room4_metal_east", + "result": "faction_base_modular_hub_room4_metal_east", "description": "We should expand our housing by adding a metal room on the east side, which we can also use as part of the central building.", "category": "CC_BUILDING", "subcategory": "CSC_BUILDING_BASES", "autolearn": false, "never_learn": true, - "construction_blueprint": "fbmf_room4_metal_east", + "construction_blueprint": "fbmh_room4_metal_east", "blueprint_name": "east room", - "blueprint_requires": [ { "id": "fbmf_northeast", "amount": 4 }, { "id": "fbmf_fire_northeast" }, { "id": "fbmf_bed2_northeast" } ], - "blueprint_provides": [ { "id": "fbmf_east", "amount": 4 } ], - "blueprint_excludes": [ { "id": "fbmf_east" }, { "id": "fbmf_tent_northeast" } ], + "blueprint_requires": [ { "id": "fbmh_northeast", "amount": 4 }, { "id": "fbmh_fire_northeast" }, { "id": "fbmh_bed2_northeast" } ], + "blueprint_provides": [ { "id": "fbmh_east", "amount": 4 } ], + "blueprint_excludes": [ { "id": "fbmh_east" }, { "id": "fbmh_tent_northeast" } ], "blueprint_autocalc": true }, { "type": "recipe", - "result": "faction_base_modular_field_shack4_metal_southeast", + "result": "faction_base_modular_hub_shack4_metal_southeast", "description": "We should expand our housing by putting up a metal building on the southeast side, which we can also use as part of the central building.", "category": "CC_BUILDING", "subcategory": "CSC_BUILDING_BASES", "autolearn": false, "never_learn": true, - "construction_blueprint": "fbmf_shack4_metal_southeast", + "construction_blueprint": "fbmh_shack4_metal_southeast", "blueprint_name": "southeast shack", - "blueprint_requires": [ { "id": "fbmf_tent_east" } ], - "blueprint_provides": [ { "id": "fbmf_southeast", "amount": 4 } ], - "blueprint_excludes": [ { "id": "fbmf_southeast" } ], + "blueprint_requires": [ { "id": "fbmh_tent_east" } ], + "blueprint_provides": [ { "id": "fbmh_southeast", "amount": 4 } ], + "blueprint_excludes": [ { "id": "fbmh_southeast" } ], "blueprint_autocalc": true }, { "type": "recipe", - "result": "faction_base_modular_field_room4_metal_southeast", + "result": "faction_base_modular_hub_room4_metal_southeast", "description": "We should expand our housing by adding a metal room on the southeast side, which we can also use as part of the central building.", "category": "CC_BUILDING", "subcategory": "CSC_BUILDING_BASES", "autolearn": false, "never_learn": true, - "construction_blueprint": "fbmf_room4_metal_southeast", + "construction_blueprint": "fbmh_room4_metal_southeast", "blueprint_name": "southeast room", - "blueprint_requires": [ { "id": "fbmf_east", "amount": 4 } ], - "blueprint_provides": [ { "id": "fbmf_southeast", "amount": 4 } ], - "blueprint_excludes": [ { "id": "fbmf_southeast" }, { "id": "fbmf_tent_east" } ], + "blueprint_requires": [ { "id": "fbmh_east", "amount": 4 } ], + "blueprint_provides": [ { "id": "fbmh_southeast", "amount": 4 } ], + "blueprint_excludes": [ { "id": "fbmh_southeast" }, { "id": "fbmh_tent_east" } ], "blueprint_autocalc": true }, { "type": "recipe", - "result": "faction_base_modular_field_room4_metal_northwest", + "result": "faction_base_modular_hub_room4_metal_northwest", "description": "We should expand our housing by putting up a metal building on the northwest side, which we can also use as part of the central building.", "category": "CC_BUILDING", "subcategory": "CSC_BUILDING_BASES", "autolearn": false, "never_learn": true, - "construction_blueprint": "fbmf_room4_metal_northwest", + "construction_blueprint": "fbmh_room4_metal_northwest", "blueprint_name": "northwest shack", - "blueprint_requires": [ { "id": "fbmf_northeast", "amount": 4 }, { "id": "fbmf_fire_northeast" }, { "id": "fbmf_bed2_northeast" } ], - "blueprint_provides": [ { "id": "fbmf_northwest", "amount": 4 } ], - "blueprint_excludes": [ { "id": "fbmf_northwest" } ], + "blueprint_requires": [ { "id": "fbmh_northeast", "amount": 4 }, { "id": "fbmh_fire_northeast" }, { "id": "fbmh_bed2_northeast" } ], + "blueprint_provides": [ { "id": "fbmh_northwest", "amount": 4 } ], + "blueprint_excludes": [ { "id": "fbmh_northwest" } ], "blueprint_autocalc": true }, { "type": "recipe", - "result": "faction_base_modular_field_shack4_metal_west", + "result": "faction_base_modular_hub_shack4_metal_west", "description": "We should expand our housing by putting up a metal building on the west side, which we can also use as part of the central building.", "category": "CC_BUILDING", "subcategory": "CSC_BUILDING_BASES", "autolearn": false, "never_learn": true, - "construction_blueprint": "fbmf_shack4_metal_west", + "construction_blueprint": "fbmh_shack4_metal_west", "blueprint_name": "west shack", - "blueprint_requires": [ { "id": "fbmf_tent_northwest" } ], - "blueprint_provides": [ { "id": "fbmf_west", "amount": 4 } ], - "blueprint_excludes": [ { "id": "fbmf_west" } ], + "blueprint_requires": [ { "id": "fbmh_tent_northwest" } ], + "blueprint_provides": [ { "id": "fbmh_west", "amount": 4 } ], + "blueprint_excludes": [ { "id": "fbmh_west" } ], "blueprint_autocalc": true }, { "type": "recipe", - "result": "faction_base_modular_field_room4_metal_west", + "result": "faction_base_modular_hub_room4_metal_west", "description": "We should expand our housing by adding a metal room on the west side, which we can also use as part of the central building.", "category": "CC_BUILDING", "subcategory": "CSC_BUILDING_BASES", "autolearn": false, "never_learn": true, - "construction_blueprint": "fbmf_room4_metal_west", + "construction_blueprint": "fbmh_room4_metal_west", "blueprint_name": "west room", - "blueprint_requires": [ { "id": "fbmf_northwest", "amount": 4 } ], - "blueprint_provides": [ { "id": "fbmf_west", "amount": 4 } ], - "blueprint_excludes": [ { "id": "fbmf_west" }, { "id": "fbmf_tent_northwest" } ], + "blueprint_requires": [ { "id": "fbmh_northwest", "amount": 4 } ], + "blueprint_provides": [ { "id": "fbmh_west", "amount": 4 } ], + "blueprint_excludes": [ { "id": "fbmh_west" }, { "id": "fbmh_tent_northwest" } ], "blueprint_autocalc": true }, { "type": "recipe", - "result": "faction_base_modular_field_shack4_metal_soutwest", + "result": "faction_base_modular_hub_shack4_metal_soutwest", "description": "We should expand our housing by putting up a metal building on the southwest side, which we can also use as part of the central building.", "category": "CC_BUILDING", "subcategory": "CSC_BUILDING_BASES", "autolearn": false, "never_learn": true, - "construction_blueprint": "fbmf_shack4_metal_southwest", + "construction_blueprint": "fbmh_shack4_metal_southwest", "blueprint_name": "southwest shack", - "blueprint_requires": [ { "id": "fbmf_tent_west" } ], - "blueprint_provides": [ { "id": "fbmf_southwest", "amount": 4 } ], - "blueprint_excludes": [ { "id": "fbmf_southwest" } ], + "blueprint_requires": [ { "id": "fbmh_tent_west" } ], + "blueprint_provides": [ { "id": "fbmh_southwest", "amount": 4 } ], + "blueprint_excludes": [ { "id": "fbmh_southwest" } ], "blueprint_autocalc": true }, { "type": "recipe", - "result": "faction_base_modular_field_room4_metal_southwest", + "result": "faction_base_modular_hub_room4_metal_southwest", "description": "We should expand our housing by adding a metal room on the southwest side, which we can also use as part of the central building.", "category": "CC_BUILDING", "subcategory": "CSC_BUILDING_BASES", "autolearn": false, "never_learn": true, - "construction_blueprint": "fbmf_room4_metal_southwest", + "construction_blueprint": "fbmh_room4_metal_southwest", "blueprint_name": "southwest room", - "blueprint_requires": [ { "id": "fbmf_west", "amount": 4 } ], - "blueprint_provides": [ { "id": "fbmf_southwest", "amount": 4 } ], - "blueprint_excludes": [ { "id": "fbmf_southwest" }, { "id": "fbmf_tent_west" } ], + "blueprint_requires": [ { "id": "fbmh_west", "amount": 4 } ], + "blueprint_provides": [ { "id": "fbmh_southwest", "amount": 4 } ], + "blueprint_excludes": [ { "id": "fbmh_southwest" }, { "id": "fbmh_tent_west" } ], "blueprint_autocalc": true }, { "type": "recipe", - "result": "faction_base_modular_field_core_shack_ne_metal_center", + "result": "faction_base_modular_hub_core_shack_ne_metal_center", "description": "A central building can act as a kitchen and dining hall. We should build the northeast quarter of one from metal.", "category": "CC_BUILDING", "subcategory": "CSC_BUILDING_BASES", "autolearn": false, "never_learn": true, - "construction_blueprint": "fbmf_core_shack_ne_metal_center", + "construction_blueprint": "fbmh_core_shack_ne_metal_center", "blueprint_name": "central building NE corner", - "blueprint_requires": [ { "id": "fbmf_tent_east" } ], - "blueprint_provides": [ { "id": "fbmf_center", "amount": 2 }, { "id": "fbmf_ne_center" } ], - "blueprint_excludes": [ { "id": "fbmf_ne_center" } ], + "blueprint_requires": [ { "id": "fbmh_tent_east" } ], + "blueprint_provides": [ { "id": "fbmh_center", "amount": 2 }, { "id": "fbmh_ne_center" } ], + "blueprint_excludes": [ { "id": "fbmh_ne_center" } ], "blueprint_autocalc": true }, { "type": "recipe", - "result": "faction_base_modular_field_core_ne_metal_center", + "result": "faction_base_modular_hub_core_ne_metal_center", "description": "A central building can act as a core and dining hall. We should build out from the east room with metal.", "category": "CC_BUILDING", "subcategory": "CSC_BUILDING_BASES", "autolearn": false, "never_learn": true, - "construction_blueprint": "fbmf_core_ne_metal_center", + "construction_blueprint": "fbmh_core_ne_metal_center", "blueprint_name": "central building NE corner", - "blueprint_requires": [ { "id": "fbmf_east", "amount": 4 } ], - "blueprint_provides": [ { "id": "fbmf_center", "amount": 2 }, { "id": "fbmf_ne_center" } ], - "blueprint_excludes": [ { "id": "fbmf_ne_center" }, { "id": "fbmf_tent_east" } ], + "blueprint_requires": [ { "id": "fbmh_east", "amount": 4 } ], + "blueprint_provides": [ { "id": "fbmh_center", "amount": 2 }, { "id": "fbmh_ne_center" } ], + "blueprint_excludes": [ { "id": "fbmh_ne_center" }, { "id": "fbmh_tent_east" } ], "blueprint_autocalc": true }, { "type": "recipe", - "result": "faction_base_modular_field_core_shack_nw_metal_center", + "result": "faction_base_modular_hub_core_shack_nw_metal_center", "description": "A central building can act as a core and dining hall. We should build the northwest quarter of one from metal.", "category": "CC_BUILDING", "subcategory": "CSC_BUILDING_BASES", "autolearn": false, "never_learn": true, - "construction_blueprint": "fbmf_core_shack_nw_metal_center", + "construction_blueprint": "fbmh_core_shack_nw_metal_center", "blueprint_name": "central building NW corner", - "blueprint_requires": [ { "id": "fbmf_tent_west" } ], - "blueprint_provides": [ { "id": "fbmf_center", "amount": 2 }, { "id": "fbmf_nw_center" } ], - "blueprint_excludes": [ { "id": "fbmf_nw_center" } ], + "blueprint_requires": [ { "id": "fbmh_tent_west" } ], + "blueprint_provides": [ { "id": "fbmh_center", "amount": 2 }, { "id": "fbmh_nw_center" } ], + "blueprint_excludes": [ { "id": "fbmh_nw_center" } ], "blueprint_autocalc": true }, { "type": "recipe", - "result": "faction_base_modular_field_core_nw_metal_center", + "result": "faction_base_modular_hub_core_nw_metal_center", "description": "A central building can act as a core and dining hall. We should build out from the west room with metal.", "category": "CC_BUILDING", "subcategory": "CSC_BUILDING_BASES", "autolearn": false, "never_learn": true, - "construction_blueprint": "fbmf_core_nw_metal_center", + "construction_blueprint": "fbmh_core_nw_metal_center", "blueprint_name": "central building NW corner", - "blueprint_requires": [ { "id": "fbmf_west", "amount": 4 } ], - "blueprint_provides": [ { "id": "fbmf_center", "amount": 2 }, { "id": "fbmf_nw_center" } ], - "blueprint_excludes": [ { "id": "fbmf_nw_center" }, { "id": "fbmf_tent_west" } ], + "blueprint_requires": [ { "id": "fbmh_west", "amount": 4 } ], + "blueprint_provides": [ { "id": "fbmh_center", "amount": 2 }, { "id": "fbmh_nw_center" } ], + "blueprint_excludes": [ { "id": "fbmh_nw_center" }, { "id": "fbmh_tent_west" } ], "blueprint_autocalc": true }, { "type": "recipe", - "result": "faction_base_modular_field_core_metal_center", + "result": "faction_base_modular_hub_core_metal_center", "description": "A central building can act as a core and dining hall. We should build between the east and west rooms with metal.", "category": "CC_BUILDING", "subcategory": "CSC_BUILDING_BASES", "autolearn": false, "never_learn": true, - "construction_blueprint": "fbmf_core_metal_center", + "construction_blueprint": "fbmh_core_metal_center", "blueprint_name": "central building north half", - "blueprint_requires": [ { "id": "fbmf_east", "amount": 4 }, { "id": "fbmf_west", "amount": 4 } ], - "blueprint_provides": [ { "id": "fbmf_center", "amount": 4 }, { "id": "fbmf_ne_center" }, { "id": "fbmf_nw_center" } ], - "blueprint_excludes": [ { "id": "fbmf_ne_center" }, { "id": "fbmf_nw_center" }, { "id": "fbmf_tent_east" }, { "id": "fbmf_tent_west" } ], + "blueprint_requires": [ { "id": "fbmh_east", "amount": 4 }, { "id": "fbmh_west", "amount": 4 } ], + "blueprint_provides": [ { "id": "fbmh_center", "amount": 4 }, { "id": "fbmh_ne_center" }, { "id": "fbmh_nw_center" } ], + "blueprint_excludes": [ { "id": "fbmh_ne_center" }, { "id": "fbmh_nw_center" }, { "id": "fbmh_tent_east" }, { "id": "fbmh_tent_west" } ], "blueprint_autocalc": true }, { "type": "recipe", - "result": "faction_base_modular_field_core_shack_se_metal_south", + "result": "faction_base_modular_hub_core_shack_se_metal_south", "description": "A central building can act as a core and dining hall. We should build the southeast quarter of one from metal.", "category": "CC_BUILDING", "subcategory": "CSC_BUILDING_BASES", "autolearn": false, "never_learn": true, - "construction_blueprint": "fbmf_core_shack_se_metal_south", + "construction_blueprint": "fbmh_core_shack_se_metal_south", "blueprint_name": "central building SE corner", - "blueprint_requires": [ { "id": "fbmf_tent_southeast" } ], - "blueprint_provides": [ { "id": "fbmf_south", "amount": 2 }, { "id": "fbmf_se_south" } ], - "blueprint_excludes": [ { "id": "fbmf_se_south" } ], + "blueprint_requires": [ { "id": "fbmh_tent_southeast" } ], + "blueprint_provides": [ { "id": "fbmh_south", "amount": 2 }, { "id": "fbmh_se_south" } ], + "blueprint_excludes": [ { "id": "fbmh_se_south" } ], "blueprint_autocalc": true }, { "type": "recipe", - "result": "faction_base_modular_field_core_se_metal_south", + "result": "faction_base_modular_hub_core_se_metal_south", "description": "A central building can act as a core and dining hall. We should build out from the southeast room with metal.", "category": "CC_BUILDING", "subcategory": "CSC_BUILDING_BASES", "autolearn": false, "never_learn": true, - "construction_blueprint": "fbmf_core_se_metal_south", + "construction_blueprint": "fbmh_core_se_metal_south", "blueprint_name": "central building SE corner", - "blueprint_requires": [ { "id": "fbmf_southeast", "amount": 4 } ], - "blueprint_provides": [ { "id": "fbmf_south", "amount": 2 }, { "id": "fbmf_se_south" } ], - "blueprint_excludes": [ { "id": "fbmf_se_south" }, { "id": "fbmf_tent_southeast" } ], + "blueprint_requires": [ { "id": "fbmh_southeast", "amount": 4 } ], + "blueprint_provides": [ { "id": "fbmh_south", "amount": 2 }, { "id": "fbmh_se_south" } ], + "blueprint_excludes": [ { "id": "fbmh_se_south" }, { "id": "fbmh_tent_southeast" } ], "blueprint_autocalc": true }, { "type": "recipe", - "result": "faction_base_modular_field_core_shack_sw_metal_south", + "result": "faction_base_modular_hub_core_shack_sw_metal_south", "description": "A central building can act as a core and dining hall. We should build the southwest quarter of one from metal.", "category": "CC_BUILDING", "subcategory": "CSC_BUILDING_BASES", "autolearn": false, "never_learn": true, - "construction_blueprint": "fbmf_core_shack_sw_metal_south", + "construction_blueprint": "fbmh_core_shack_sw_metal_south", "blueprint_name": "central building SW corner", - "blueprint_requires": [ { "id": "fbmf_tent_southwest" } ], - "blueprint_provides": [ { "id": "fbmf_south", "amount": 2 }, { "id": "fbmf_sw_south" } ], - "blueprint_excludes": [ { "id": "fbmf_sw_south" } ], + "blueprint_requires": [ { "id": "fbmh_tent_southwest" } ], + "blueprint_provides": [ { "id": "fbmh_south", "amount": 2 }, { "id": "fbmh_sw_south" } ], + "blueprint_excludes": [ { "id": "fbmh_sw_south" } ], "blueprint_autocalc": true }, { "type": "recipe", - "result": "faction_base_modular_field_core_sw_metal_south", + "result": "faction_base_modular_hub_core_sw_metal_south", "description": "A central building can act as a core and dining hall. We should build out from the southwest room with metal.", "category": "CC_BUILDING", "subcategory": "CSC_BUILDING_BASES", "autolearn": false, "never_learn": true, - "construction_blueprint": "fbmf_core_sw_metal_south", + "construction_blueprint": "fbmh_core_sw_metal_south", "blueprint_name": "central building SW corner", - "blueprint_requires": [ { "id": "fbmf_southwest", "amount": 4 } ], - "blueprint_provides": [ { "id": "fbmf_south", "amount": 2 }, { "id": "fbmf_sw_south" } ], - "blueprint_excludes": [ { "id": "fbmf_sw_south" }, { "id": "fbmf_tent_southwest" } ], + "blueprint_requires": [ { "id": "fbmh_southwest", "amount": 4 } ], + "blueprint_provides": [ { "id": "fbmh_south", "amount": 2 }, { "id": "fbmh_sw_south" } ], + "blueprint_excludes": [ { "id": "fbmh_sw_south" }, { "id": "fbmh_tent_southwest" } ], "blueprint_autocalc": true }, { "type": "recipe", - "result": "faction_base_modular_field_core_metal_south", + "result": "faction_base_modular_hub_core_metal_south", "description": "A central building can act as a core and dining hall. We should build between the southeast and southwest rooms with metal.", "category": "CC_BUILDING", "subcategory": "CSC_BUILDING_BASES", "autolearn": false, "never_learn": true, - "construction_blueprint": "fbmf_core_metal_south", + "construction_blueprint": "fbmh_core_metal_south", "blueprint_name": "central building south half", - "blueprint_requires": [ { "id": "fbmf_southeast", "amount": 4 }, { "id": "fbmf_southwest", "amount": 4 } ], - "blueprint_provides": [ { "id": "fbmf_south", "amount": 4 }, { "id": "fbmf_se_south" }, { "id": "fbmf_sw_south" } ], + "blueprint_requires": [ { "id": "fbmh_southeast", "amount": 4 }, { "id": "fbmh_southwest", "amount": 4 } ], + "blueprint_provides": [ { "id": "fbmh_south", "amount": 4 }, { "id": "fbmh_se_south" }, { "id": "fbmh_sw_south" } ], "blueprint_excludes": [ - { "id": "fbmf_se_south" }, - { "id": "fbmf_sw_south" }, - { "id": "fbmf_tent_southeast" }, - { "id": "fbmf_tent_southwest" } + { "id": "fbmh_se_south" }, + { "id": "fbmh_sw_south" }, + { "id": "fbmh_tent_southeast" }, + { "id": "fbmh_tent_southwest" } ], "blueprint_autocalc": true } diff --git a/data/json/recipes/basecamps/recipe_modular_field_tent.json b/data/json/recipes/basecamps/recipe_modular_field_tent.json index 708c4b8e8fec2..f81b2124d31f8 100644 --- a/data/json/recipes/basecamps/recipe_modular_field_tent.json +++ b/data/json/recipes/basecamps/recipe_modular_field_tent.json @@ -1,7 +1,7 @@ [ { "type": "recipe", - "result": "faction_base_modular_field_tent_northeast", + "result": "faction_base_modular_hub_tent_northeast", "description": "We need some shelter, so set up a tent on the northeast side of the camp.", "category": "CC_BUILDING", "subcategory": "CSC_BUILDING_BASES", @@ -9,16 +9,16 @@ "autolearn": false, "never_learn": true, "time": "3 h", - "construction_blueprint": "fbmf_tent_northeast", + "construction_blueprint": "fbmh_tent_northeast", "blueprint_name": "northeast tent", - "blueprint_requires": [ { "id": "faction_base_modular_field_0" } ], - "blueprint_provides": [ { "id": "fbmf_northeast", "amount": 4 }, { "id": "fbmf_tent_northeast" } ], - "blueprint_excludes": [ { "id": "fbmf_northeast" } ], + "blueprint_requires": [ { "id": "fbmh_0" } ], + "blueprint_provides": [ { "id": "fbmh_northeast", "amount": 4 }, { "id": "fbmh_tent_northeast" } ], + "blueprint_excludes": [ { "id": "fbmh_northeast" } ], "components": [ [ [ "large_tent_kit", 1 ], [ "broketent", 4 ], [ "tent_kit", 3 ], [ "shelter_kit", 4 ] ] ] }, { "type": "recipe", - "result": "faction_base_modular_field_tent_east", + "result": "faction_base_modular_hub_tent_east", "description": "We should expand our housing by putting up a tent on the east side, though doing so will mean we will need more materials to build the central building.", "category": "CC_BUILDING", "subcategory": "CSC_BUILDING_BASES", @@ -26,16 +26,16 @@ "autolearn": false, "never_learn": true, "time": "3 h", - "construction_blueprint": "fbmf_tent_east", + "construction_blueprint": "fbmh_tent_east", "blueprint_name": "east tent", - "blueprint_requires": [ { "id": "fbmf_northeast", "amount": 4 }, { "id": "fbmf_fire_northeast" }, { "id": "fbmf_bed2_northeast" } ], - "blueprint_provides": [ { "id": "fbmf_east", "amount": 4 }, { "id": "fbmf_tent_east" } ], - "blueprint_excludes": [ { "id": "fbmf_east" } ], + "blueprint_requires": [ { "id": "fbmh_northeast", "amount": 4 }, { "id": "fbmh_fire_northeast" }, { "id": "fbmh_bed2_northeast" } ], + "blueprint_provides": [ { "id": "fbmh_east", "amount": 4 }, { "id": "fbmh_tent_east" } ], + "blueprint_excludes": [ { "id": "fbmh_east" } ], "components": [ [ [ "large_tent_kit", 1 ], [ "broketent", 4 ], [ "tent_kit", 3 ], [ "shelter_kit", 4 ] ] ] }, { "type": "recipe", - "result": "faction_base_modular_field_tent_southeast", + "result": "faction_base_modular_hub_tent_southeast", "description": "We should expand our housing by putting up a tent on the southeast side, though doing so will mean we will need more materials to build the central building.", "category": "CC_BUILDING", "subcategory": "CSC_BUILDING_BASES", @@ -43,16 +43,16 @@ "autolearn": false, "never_learn": true, "time": "3 h", - "construction_blueprint": "fbmf_tent_southeast", + "construction_blueprint": "fbmh_tent_southeast", "blueprint_name": "southeast tent", - "blueprint_requires": [ { "id": "fbmf_east", "amount": 4 } ], - "blueprint_provides": [ { "id": "fbmf_southeast", "amount": 4 }, { "id": "fbmf_tent_southeast" } ], - "blueprint_excludes": [ { "id": "fbmf_southeast" } ], + "blueprint_requires": [ { "id": "fbmh_east", "amount": 4 } ], + "blueprint_provides": [ { "id": "fbmh_southeast", "amount": 4 }, { "id": "fbmh_tent_southeast" } ], + "blueprint_excludes": [ { "id": "fbmh_southeast" } ], "components": [ [ [ "large_tent_kit", 1 ], [ "broketent", 4 ], [ "tent_kit", 3 ], [ "shelter_kit", 4 ] ] ] }, { "type": "recipe", - "result": "faction_base_modular_field_tent_northwest", + "result": "faction_base_modular_hub_tent_northwest", "description": "We should expand our housing by putting up a tent on the northwest side, though doing so will mean we will need more materials to build the central building.", "category": "CC_BUILDING", "subcategory": "CSC_BUILDING_BASES", @@ -60,16 +60,16 @@ "autolearn": false, "never_learn": true, "time": "3 h", - "construction_blueprint": "fbmf_tent_northwest", + "construction_blueprint": "fbmh_tent_northwest", "blueprint_name": "northwest tent", - "blueprint_requires": [ { "id": "fbmf_northeast", "amount": 4 }, { "id": "fbmf_fire_northeast" }, { "id": "fbmf_bed2_northeast" } ], - "blueprint_provides": [ { "id": "fbmf_northwest", "amount": 4 }, { "id": "fbmf_tent_northwest" } ], - "blueprint_excludes": [ { "id": "fbmf_northwest" } ], + "blueprint_requires": [ { "id": "fbmh_northeast", "amount": 4 }, { "id": "fbmh_fire_northeast" }, { "id": "fbmh_bed2_northeast" } ], + "blueprint_provides": [ { "id": "fbmh_northwest", "amount": 4 }, { "id": "fbmh_tent_northwest" } ], + "blueprint_excludes": [ { "id": "fbmh_northwest" } ], "components": [ [ [ "large_tent_kit", 1 ], [ "broketent", 4 ], [ "tent_kit", 3 ], [ "shelter_kit", 4 ] ] ] }, { "type": "recipe", - "result": "faction_base_modular_field_tent_northwest", + "result": "faction_base_modular_hub_tent_northwest", "description": "We should expand our housing by putting up a tent on the west side, though doing so will mean we will need more materials to build the central building.", "category": "CC_BUILDING", "subcategory": "CSC_BUILDING_BASES", @@ -77,16 +77,16 @@ "autolearn": false, "never_learn": true, "time": "3 h", - "construction_blueprint": "fbmf_tent_west", + "construction_blueprint": "fbmh_tent_west", "blueprint_name": "west tent", - "blueprint_requires": [ { "id": "fbmf_northwest", "amount": 4 } ], - "blueprint_provides": [ { "id": "fbmf_west", "amount": 4 }, { "id": "fbmf_tent_west" } ], - "blueprint_excludes": [ { "id": "fbmf_west" } ], + "blueprint_requires": [ { "id": "fbmh_northwest", "amount": 4 } ], + "blueprint_provides": [ { "id": "fbmh_west", "amount": 4 }, { "id": "fbmh_tent_west" } ], + "blueprint_excludes": [ { "id": "fbmh_west" } ], "components": [ [ [ "large_tent_kit", 1 ], [ "broketent", 4 ], [ "tent_kit", 3 ], [ "shelter_kit", 4 ] ] ] }, { "type": "recipe", - "result": "faction_base_modular_field_tent_northwest", + "result": "faction_base_modular_hub_tent_northwest", "description": "We should expand our housing by putting up a tent on the southwest side, though doing so will mean we will need more materials to build the central building.", "category": "CC_BUILDING", "subcategory": "CSC_BUILDING_BASES", @@ -94,11 +94,11 @@ "autolearn": false, "never_learn": true, "time": "3 h", - "construction_blueprint": "fbmf_tent_southwest", + "construction_blueprint": "fbmh_tent_southwest", "blueprint_name": "southwest tent", - "blueprint_requires": [ { "id": "fbmf_west", "amount": 4 } ], - "blueprint_provides": [ { "id": "fbmf_southwest", "amount": 4 }, { "id": "fbmf_tent_southwest" } ], - "blueprint_excludes": [ { "id": "fbmf_southwest" } ], + "blueprint_requires": [ { "id": "fbmh_west", "amount": 4 } ], + "blueprint_provides": [ { "id": "fbmh_southwest", "amount": 4 }, { "id": "fbmh_tent_southwest" } ], + "blueprint_excludes": [ { "id": "fbmh_southwest" } ], "components": [ [ [ "large_tent_kit", 1 ], [ "broketent", 4 ], [ "tent_kit", 3 ], [ "shelter_kit", 4 ] ] ] } ] diff --git a/data/json/recipes/basecamps/recipe_modular_field_wad.json b/data/json/recipes/basecamps/recipe_modular_field_wad.json index e5142bd3da24c..bff0bd28da8d3 100644 --- a/data/json/recipes/basecamps/recipe_modular_field_wad.json +++ b/data/json/recipes/basecamps/recipe_modular_field_wad.json @@ -1,340 +1,340 @@ [ { "type": "recipe", - "result": "faction_base_modular_field_room0_wad_northeast", + "result": "faction_base_modular_hub_room0_wad_northeast", "description": "We need some shelter, so build half of a wattle-and-daub shack with a sod roof on the northeast side of the camp", "category": "CC_BUILDING", "subcategory": "CSC_BUILDING_BASES", "autolearn": false, "never_learn": true, - "construction_blueprint": "fbmf_room0_wad_northeast", + "construction_blueprint": "fbmh_room0_wad_northeast", "blueprint_name": "northeast shack", - "blueprint_requires": [ { "id": "faction_base_modular_field_0" } ], - "blueprint_provides": [ { "id": "fbmf_northeast" } ], - "blueprint_excludes": [ { "id": "fbmf_northeast" } ], + "blueprint_requires": [ { "id": "fbmh_0" } ], + "blueprint_provides": [ { "id": "fbmh_northeast" } ], + "blueprint_excludes": [ { "id": "fbmh_northeast" } ], "blueprint_autocalc": true }, { "type": "recipe", - "result": "faction_base_modular_field_room1_wad_northeast", + "result": "faction_base_modular_hub_room1_wad_northeast", "description": "We should use wattle-and-daub to expand the shelter so we have space for another bed.", "category": "CC_BUILDING", "subcategory": "CSC_BUILDING_BASES", "autolearn": false, "never_learn": true, - "construction_blueprint": "fbmf_room1_wad_northeast", + "construction_blueprint": "fbmh_room1_wad_northeast", "blueprint_name": "expand northeast shack", - "blueprint_requires": [ { "id": "fbmf_northeast" } ], - "blueprint_provides": [ { "id": "fbmf_northeast" } ], - "blueprint_excludes": [ { "id": "fbmf_northeast", "amount": 2 }, { "id": "fbmf_tent_northeast" } ], + "blueprint_requires": [ { "id": "fbmh_northeast" } ], + "blueprint_provides": [ { "id": "fbmh_northeast" } ], + "blueprint_excludes": [ { "id": "fbmh_northeast", "amount": 2 }, { "id": "fbmh_tent_northeast" } ], "blueprint_autocalc": true }, { "type": "recipe", - "result": "faction_base_modular_field_room2_wad_northeast", + "result": "faction_base_modular_hub_room2_wad_northeast", "description": "We should use wattle-and-daub to finish the northeast shack.", "category": "CC_BUILDING", "subcategory": "CSC_BUILDING_BASES", "skill_used": "fabrication", "autolearn": false, "never_learn": true, - "construction_blueprint": "fbmf_room2_wad_northeast", + "construction_blueprint": "fbmh_room2_wad_northeast", "blueprint_name": "finish northeast shack", - "blueprint_requires": [ { "id": "fbmf_northeast", "amount": 2 } ], - "blueprint_provides": [ { "id": "fbmf_northeast", "amount": 2 } ], - "blueprint_excludes": [ { "id": "fbmf_northeast", "amount": 4 }, { "id": "fbmf_tent_northeast" } ], + "blueprint_requires": [ { "id": "fbmh_northeast", "amount": 2 } ], + "blueprint_provides": [ { "id": "fbmh_northeast", "amount": 2 } ], + "blueprint_excludes": [ { "id": "fbmh_northeast", "amount": 4 }, { "id": "fbmh_tent_northeast" } ], "blueprint_autocalc": true }, { "type": "recipe", - "result": "faction_base_modular_field_shack4_wad_east", + "result": "faction_base_modular_hub_shack4_wad_east", "description": "We should expand our housing by putting up a wattle-and-daub building on the east side, which we can also use as part of the central building.", "category": "CC_BUILDING", "subcategory": "CSC_BUILDING_BASES", "autolearn": false, "never_learn": true, - "construction_blueprint": "fbmf_shack4_wad_east", + "construction_blueprint": "fbmh_shack4_wad_east", "blueprint_name": "east shack", - "blueprint_requires": [ { "id": "fbmf_tent_northeast" }, { "id": "fbmf_fire_northeast" }, { "id": "fbmf_bed2_northeast" } ], - "blueprint_provides": [ { "id": "fbmf_east", "amount": 4 } ], - "blueprint_excludes": [ { "id": "fbmf_east" } ], + "blueprint_requires": [ { "id": "fbmh_tent_northeast" }, { "id": "fbmh_fire_northeast" }, { "id": "fbmh_bed2_northeast" } ], + "blueprint_provides": [ { "id": "fbmh_east", "amount": 4 } ], + "blueprint_excludes": [ { "id": "fbmh_east" } ], "blueprint_autocalc": true }, { "type": "recipe", - "result": "faction_base_modular_field_room4_wad_east", + "result": "faction_base_modular_hub_room4_wad_east", "description": "We should expand our housing by adding a wattle-and-daub room on the east side, which we can also use as part of the central building.", "category": "CC_BUILDING", "subcategory": "CSC_BUILDING_BASES", "skill_used": "fabrication", "autolearn": false, "never_learn": true, - "construction_blueprint": "fbmf_room4_wad_east", + "construction_blueprint": "fbmh_room4_wad_east", "blueprint_name": "east room", - "blueprint_requires": [ { "id": "fbmf_northeast", "amount": 4 }, { "id": "fbmf_fire_northeast" }, { "id": "fbmf_bed2_northeast" } ], - "blueprint_provides": [ { "id": "fbmf_east", "amount": 4 } ], - "blueprint_excludes": [ { "id": "fbmf_east" }, { "id": "fbmf_tent_northeast" } ], + "blueprint_requires": [ { "id": "fbmh_northeast", "amount": 4 }, { "id": "fbmh_fire_northeast" }, { "id": "fbmh_bed2_northeast" } ], + "blueprint_provides": [ { "id": "fbmh_east", "amount": 4 } ], + "blueprint_excludes": [ { "id": "fbmh_east" }, { "id": "fbmh_tent_northeast" } ], "blueprint_autocalc": true }, { "type": "recipe", - "result": "faction_base_modular_field_shack4_wad_southeast", + "result": "faction_base_modular_hub_shack4_wad_southeast", "description": "We should expand our housing by putting up a wattle-and-daub building on the southeast side, which we can also use as part of the central building.", "category": "CC_BUILDING", "subcategory": "CSC_BUILDING_BASES", "autolearn": false, "never_learn": true, - "construction_blueprint": "fbmf_shack4_wad_southeast", + "construction_blueprint": "fbmh_shack4_wad_southeast", "blueprint_name": "southeast shack", - "blueprint_requires": [ { "id": "fbmf_tent_east" } ], - "blueprint_provides": [ { "id": "fbmf_southeast", "amount": 4 } ], - "blueprint_excludes": [ { "id": "fbmf_southeast" } ], + "blueprint_requires": [ { "id": "fbmh_tent_east" } ], + "blueprint_provides": [ { "id": "fbmh_southeast", "amount": 4 } ], + "blueprint_excludes": [ { "id": "fbmh_southeast" } ], "blueprint_autocalc": true }, { "type": "recipe", - "result": "faction_base_modular_field_room4_wad_southeast", + "result": "faction_base_modular_hub_room4_wad_southeast", "description": "We should expand our housing by adding a wattle-and-daub room on the southeast side, which we can also use as part of the central building.", "category": "CC_BUILDING", "subcategory": "CSC_BUILDING_BASES", "skills_required": [ [ "survival", 3 ], [ "tailor", 1 ] ], "autolearn": false, "never_learn": true, - "construction_blueprint": "fbmf_room4_wad_southeast", + "construction_blueprint": "fbmh_room4_wad_southeast", "blueprint_name": "southeast room", - "blueprint_requires": [ { "id": "fbmf_east", "amount": 4 } ], - "blueprint_provides": [ { "id": "fbmf_southeast", "amount": 4 } ], - "blueprint_excludes": [ { "id": "fbmf_southeast" }, { "id": "fbmf_tent_east" } ], + "blueprint_requires": [ { "id": "fbmh_east", "amount": 4 } ], + "blueprint_provides": [ { "id": "fbmh_southeast", "amount": 4 } ], + "blueprint_excludes": [ { "id": "fbmh_southeast" }, { "id": "fbmh_tent_east" } ], "blueprint_autocalc": true }, { "type": "recipe", - "result": "faction_base_modular_field_room4_wad_northwest", + "result": "faction_base_modular_hub_room4_wad_northwest", "description": "We should expand our housing by putting up a wattle-and-daub building on the northwest side, which we can also use as part of the central building.", "category": "CC_BUILDING", "subcategory": "CSC_BUILDING_BASES", "autolearn": false, "never_learn": true, - "construction_blueprint": "fbmf_room4_wad_northwest", + "construction_blueprint": "fbmh_room4_wad_northwest", "blueprint_name": "northwest shack", - "blueprint_requires": [ { "id": "fbmf_northeast", "amount": 4 }, { "id": "fbmf_fire_northeast" }, { "id": "fbmf_bed2_northeast" } ], - "blueprint_provides": [ { "id": "fbmf_northwest", "amount": 4 } ], - "blueprint_excludes": [ { "id": "fbmf_northwest" } ], + "blueprint_requires": [ { "id": "fbmh_northeast", "amount": 4 }, { "id": "fbmh_fire_northeast" }, { "id": "fbmh_bed2_northeast" } ], + "blueprint_provides": [ { "id": "fbmh_northwest", "amount": 4 } ], + "blueprint_excludes": [ { "id": "fbmh_northwest" } ], "blueprint_autocalc": true }, { "type": "recipe", - "result": "faction_base_modular_field_shack4_wad_west", + "result": "faction_base_modular_hub_shack4_wad_west", "description": "We should expand our housing by putting up a wattle-and-daub building on the west side, which we can also use as part of the central building.", "category": "CC_BUILDING", "subcategory": "CSC_BUILDING_BASES", "autolearn": false, "never_learn": true, - "construction_blueprint": "fbmf_shack4_wad_west", + "construction_blueprint": "fbmh_shack4_wad_west", "blueprint_name": "west shack", - "blueprint_requires": [ { "id": "fbmf_tent_northwest" } ], - "blueprint_provides": [ { "id": "fbmf_west", "amount": 4 } ], - "blueprint_excludes": [ { "id": "fbmf_west" } ], + "blueprint_requires": [ { "id": "fbmh_tent_northwest" } ], + "blueprint_provides": [ { "id": "fbmh_west", "amount": 4 } ], + "blueprint_excludes": [ { "id": "fbmh_west" } ], "blueprint_autocalc": true }, { "type": "recipe", - "result": "faction_base_modular_field_room4_wad_west", + "result": "faction_base_modular_hub_room4_wad_west", "description": "We should expand our housing by adding a wattle-and-daub room on the west side, which we can also use as part of the central building.", "category": "CC_BUILDING", "subcategory": "CSC_BUILDING_BASES", "autolearn": false, "never_learn": true, - "construction_blueprint": "fbmf_room4_wad_west", + "construction_blueprint": "fbmh_room4_wad_west", "blueprint_name": "west room", - "blueprint_requires": [ { "id": "fbmf_northwest", "amount": 4 } ], - "blueprint_provides": [ { "id": "fbmf_west", "amount": 4 } ], - "blueprint_excludes": [ { "id": "fbmf_west" }, { "id": "fbmf_tent_northwest" } ], + "blueprint_requires": [ { "id": "fbmh_northwest", "amount": 4 } ], + "blueprint_provides": [ { "id": "fbmh_west", "amount": 4 } ], + "blueprint_excludes": [ { "id": "fbmh_west" }, { "id": "fbmh_tent_northwest" } ], "blueprint_autocalc": true }, { "type": "recipe", - "result": "faction_base_modular_field_shack4_wad_southwest", + "result": "faction_base_modular_hub_shack4_wad_southwest", "description": "We should expand our housing by putting up a wattle-and-daub building on the southwest side, which we can also use as part of the central building.", "category": "CC_BUILDING", "subcategory": "CSC_BUILDING_BASES", "autolearn": false, "never_learn": true, - "construction_blueprint": "fbmf_shack4_wad_southwest", + "construction_blueprint": "fbmh_shack4_wad_southwest", "blueprint_name": "southwest shack", - "blueprint_requires": [ { "id": "fbmf_tent_west" } ], - "blueprint_provides": [ { "id": "fbmf_southwest", "amount": 4 } ], - "blueprint_excludes": [ { "id": "fbmf_southwest" } ], + "blueprint_requires": [ { "id": "fbmh_tent_west" } ], + "blueprint_provides": [ { "id": "fbmh_southwest", "amount": 4 } ], + "blueprint_excludes": [ { "id": "fbmh_southwest" } ], "blueprint_autocalc": true }, { "type": "recipe", - "result": "faction_base_modular_field_room4_wad_southwest", + "result": "faction_base_modular_hub_room4_wad_southwest", "description": "We should expand our housing by adding a wattle-and-daub room on the southwest side, which we can also use as part of the central building.", "category": "CC_BUILDING", "subcategory": "CSC_BUILDING_BASES", "autolearn": false, "never_learn": true, - "construction_blueprint": "fbmf_room4_wad_southwest", + "construction_blueprint": "fbmh_room4_wad_southwest", "blueprint_name": "southwest room", - "blueprint_requires": [ { "id": "fbmf_west", "amount": 4 } ], - "blueprint_provides": [ { "id": "fbmf_southwest", "amount": 4 } ], - "blueprint_excludes": [ { "id": "fbmf_southwest" }, { "id": "fbmf_tent_west" } ], + "blueprint_requires": [ { "id": "fbmh_west", "amount": 4 } ], + "blueprint_provides": [ { "id": "fbmh_southwest", "amount": 4 } ], + "blueprint_excludes": [ { "id": "fbmh_southwest" }, { "id": "fbmh_tent_west" } ], "blueprint_autocalc": true }, { "type": "recipe", - "result": "faction_base_modular_field_core_shack_ne_wad_center", + "result": "faction_base_modular_hub_core_shack_ne_wad_center", "description": "A central building can act as a kitchen and dining hall. We should build the northeast quarter of one from wattle-and-daub.", "category": "CC_BUILDING", "subcategory": "CSC_BUILDING_BASES", "autolearn": false, "never_learn": true, - "construction_blueprint": "fbmf_core_shack_ne_wad_center", + "construction_blueprint": "fbmh_core_shack_ne_wad_center", "blueprint_name": "central building NE corner", - "blueprint_requires": [ { "id": "fbmf_tent_east" } ], - "blueprint_provides": [ { "id": "fbmf_center", "amount": 2 }, { "id": "fbmf_ne_center" } ], - "blueprint_excludes": [ { "id": "fbmf_ne_center" } ], + "blueprint_requires": [ { "id": "fbmh_tent_east" } ], + "blueprint_provides": [ { "id": "fbmh_center", "amount": 2 }, { "id": "fbmh_ne_center" } ], + "blueprint_excludes": [ { "id": "fbmh_ne_center" } ], "blueprint_autocalc": true }, { "type": "recipe", - "result": "faction_base_modular_field_core_ne_wad_center", + "result": "faction_base_modular_hub_core_ne_wad_center", "description": "A central building can act as a core and dining hall. We should build out from the east room with wattle-and-daub.", "category": "CC_BUILDING", "subcategory": "CSC_BUILDING_BASES", "autolearn": false, "never_learn": true, - "construction_blueprint": "fbmf_core_ne_wad_center", + "construction_blueprint": "fbmh_core_ne_wad_center", "blueprint_name": "central building NE corner", - "blueprint_requires": [ { "id": "fbmf_east", "amount": 4 } ], - "blueprint_provides": [ { "id": "fbmf_center", "amount": 2 }, { "id": "fbmf_ne_center" } ], - "blueprint_excludes": [ { "id": "fbmf_ne_center" }, { "id": "fbmf_tent_east" } ], + "blueprint_requires": [ { "id": "fbmh_east", "amount": 4 } ], + "blueprint_provides": [ { "id": "fbmh_center", "amount": 2 }, { "id": "fbmh_ne_center" } ], + "blueprint_excludes": [ { "id": "fbmh_ne_center" }, { "id": "fbmh_tent_east" } ], "blueprint_autocalc": true }, { "type": "recipe", - "result": "faction_base_modular_field_core_shack_nw_wad_center", + "result": "faction_base_modular_hub_core_shack_nw_wad_center", "description": "A central building can act as a core and dining hall. We should build the northwest quarter of one from wattle-and-daub.", "category": "CC_BUILDING", "subcategory": "CSC_BUILDING_BASES", "autolearn": false, "never_learn": true, - "construction_blueprint": "fbmf_core_shack_nw_wad_center", + "construction_blueprint": "fbmh_core_shack_nw_wad_center", "blueprint_name": "central building NW corner", - "blueprint_requires": [ { "id": "fbmf_tent_west" } ], - "blueprint_provides": [ { "id": "fbmf_center", "amount": 2 }, { "id": "fbmf_nw_center" } ], - "blueprint_excludes": [ { "id": "fbmf_nw_center" } ], + "blueprint_requires": [ { "id": "fbmh_tent_west" } ], + "blueprint_provides": [ { "id": "fbmh_center", "amount": 2 }, { "id": "fbmh_nw_center" } ], + "blueprint_excludes": [ { "id": "fbmh_nw_center" } ], "blueprint_autocalc": true }, { "type": "recipe", - "result": "faction_base_modular_field_core_nw_wad_center", + "result": "faction_base_modular_hub_core_nw_wad_center", "description": "A central building can act as a core and dining hall. We should build out from the west room with wattle-and-daub.", "category": "CC_BUILDING", "subcategory": "CSC_BUILDING_BASES", "autolearn": false, "never_learn": true, - "construction_blueprint": "fbmf_core_nw_wad_center", + "construction_blueprint": "fbmh_core_nw_wad_center", "blueprint_name": "central building NW corner", - "blueprint_requires": [ { "id": "fbmf_west", "amount": 4 } ], - "blueprint_provides": [ { "id": "fbmf_center", "amount": 2 }, { "id": "fbmf_nw_center" } ], - "blueprint_excludes": [ { "id": "fbmf_nw_center" }, { "id": "fbmf_tent_west" } ], + "blueprint_requires": [ { "id": "fbmh_west", "amount": 4 } ], + "blueprint_provides": [ { "id": "fbmh_center", "amount": 2 }, { "id": "fbmh_nw_center" } ], + "blueprint_excludes": [ { "id": "fbmh_nw_center" }, { "id": "fbmh_tent_west" } ], "blueprint_autocalc": true }, { "type": "recipe", - "result": "faction_base_modular_field_core_wad_center", + "result": "faction_base_modular_hub_core_wad_center", "description": "A central building can act as a core and dining hall. We should build between the east and west rooms with wattle-and-daub.", "category": "CC_BUILDING", "subcategory": "CSC_BUILDING_BASES", "autolearn": false, "never_learn": true, - "construction_blueprint": "fbmf_core_wad_center", + "construction_blueprint": "fbmh_core_wad_center", "blueprint_name": "central building north half", - "blueprint_requires": [ { "id": "fbmf_east", "amount": 4 }, { "id": "fbmf_west", "amount": 4 } ], - "blueprint_provides": [ { "id": "fbmf_center", "amount": 4 }, { "id": "fbmf_ne_center" }, { "id": "fbmf_nw_center" } ], - "blueprint_excludes": [ { "id": "fbmf_ne_center" }, { "id": "fbmf_nw_center" }, { "id": "fbmf_tent_east" }, { "id": "fbmf_tent_west" } ], + "blueprint_requires": [ { "id": "fbmh_east", "amount": 4 }, { "id": "fbmh_west", "amount": 4 } ], + "blueprint_provides": [ { "id": "fbmh_center", "amount": 4 }, { "id": "fbmh_ne_center" }, { "id": "fbmh_nw_center" } ], + "blueprint_excludes": [ { "id": "fbmh_ne_center" }, { "id": "fbmh_nw_center" }, { "id": "fbmh_tent_east" }, { "id": "fbmh_tent_west" } ], "blueprint_autocalc": true }, { "type": "recipe", - "result": "faction_base_modular_field_core_shack_se_wad_south", + "result": "faction_base_modular_hub_core_shack_se_wad_south", "description": "A central building can act as a core and dining hall. We should build the southeast quarter of one from wattle-and-daub.", "category": "CC_BUILDING", "subcategory": "CSC_BUILDING_BASES", "autolearn": false, "never_learn": true, - "construction_blueprint": "fbmf_core_shack_se_wad_south", + "construction_blueprint": "fbmh_core_shack_se_wad_south", "blueprint_name": "central building SE corner", - "blueprint_requires": [ { "id": "fbmf_tent_southeast" } ], - "blueprint_provides": [ { "id": "fbmf_south", "amount": 2 }, { "id": "fbmf_se_south" } ], - "blueprint_excludes": [ { "id": "fbmf_se_south" } ], + "blueprint_requires": [ { "id": "fbmh_tent_southeast" } ], + "blueprint_provides": [ { "id": "fbmh_south", "amount": 2 }, { "id": "fbmh_se_south" } ], + "blueprint_excludes": [ { "id": "fbmh_se_south" } ], "blueprint_autocalc": true }, { "type": "recipe", - "result": "faction_base_modular_field_core_se_wad_south", + "result": "faction_base_modular_hub_core_se_wad_south", "description": "A central building can act as a core and dining hall. We should build out from the southeast room with wattle-and-daub.", "category": "CC_BUILDING", "subcategory": "CSC_BUILDING_BASES", "skill_used": "fabrication", "autolearn": false, "never_learn": true, - "construction_blueprint": "fbmf_core_se_wad_south", + "construction_blueprint": "fbmh_core_se_wad_south", "blueprint_name": "central building SE corner", - "blueprint_requires": [ { "id": "fbmf_southeast", "amount": 4 } ], - "blueprint_provides": [ { "id": "fbmf_south", "amount": 2 }, { "id": "fbmf_se_south" } ], - "blueprint_excludes": [ { "id": "fbmf_se_south" }, { "id": "fbmf_tent_southeast" } ], + "blueprint_requires": [ { "id": "fbmh_southeast", "amount": 4 } ], + "blueprint_provides": [ { "id": "fbmh_south", "amount": 2 }, { "id": "fbmh_se_south" } ], + "blueprint_excludes": [ { "id": "fbmh_se_south" }, { "id": "fbmh_tent_southeast" } ], "blueprint_autocalc": true }, { "type": "recipe", - "result": "faction_base_modular_field_core_shack_sw_wad_south", + "result": "faction_base_modular_hub_core_shack_sw_wad_south", "description": "A central building can act as a core and dining hall. We should build the southwest quarter of one from wattle-and-daub.", "category": "CC_BUILDING", "subcategory": "CSC_BUILDING_BASES", "autolearn": false, "never_learn": true, - "construction_blueprint": "fbmf_core_shack_sw_wad_south", + "construction_blueprint": "fbmh_core_shack_sw_wad_south", "blueprint_name": "central building SW corner", - "blueprint_requires": [ { "id": "fbmf_tent_southwest" } ], - "blueprint_provides": [ { "id": "fbmf_south", "amount": 2 }, { "id": "fbmf_sw_south" } ], - "blueprint_excludes": [ { "id": "fbmf_sw_south" } ], + "blueprint_requires": [ { "id": "fbmh_tent_southwest" } ], + "blueprint_provides": [ { "id": "fbmh_south", "amount": 2 }, { "id": "fbmh_sw_south" } ], + "blueprint_excludes": [ { "id": "fbmh_sw_south" } ], "blueprint_autocalc": true }, { "type": "recipe", - "result": "faction_base_modular_field_core_sw_wad_south", + "result": "faction_base_modular_hub_core_sw_wad_south", "description": "A central building can act as a core and dining hall. We should build out from the southwest room with wattle-and-daub.", "category": "CC_BUILDING", "subcategory": "CSC_BUILDING_BASES", "autolearn": false, "never_learn": true, - "construction_blueprint": "fbmf_core_sw_wad_south", + "construction_blueprint": "fbmh_core_sw_wad_south", "blueprint_name": "central building SW corner", - "blueprint_requires": [ { "id": "fbmf_southwest", "amount": 4 } ], - "blueprint_provides": [ { "id": "fbmf_south", "amount": 2 }, { "id": "fbmf_sw_south" } ], - "blueprint_excludes": [ { "id": "fbmf_sw_south" }, { "id": "fbmf_tent_southwest" } ], + "blueprint_requires": [ { "id": "fbmh_southwest", "amount": 4 } ], + "blueprint_provides": [ { "id": "fbmh_south", "amount": 2 }, { "id": "fbmh_sw_south" } ], + "blueprint_excludes": [ { "id": "fbmh_sw_south" }, { "id": "fbmh_tent_southwest" } ], "blueprint_autocalc": true }, { "type": "recipe", - "result": "faction_base_modular_field_core_wad_south", + "result": "faction_base_modular_hub_core_wad_south", "description": "A central building can act as a core and dining hall. We should build between the southeast and southwest rooms with wattle-and-daub.", "category": "CC_BUILDING", "subcategory": "CSC_BUILDING_BASES", "autolearn": false, "never_learn": true, - "construction_blueprint": "fbmf_core_wad_south", + "construction_blueprint": "fbmh_core_wad_south", "blueprint_name": "central building south half", - "blueprint_requires": [ { "id": "fbmf_southeast", "amount": 4 }, { "id": "fbmf_southwest", "amount": 4 } ], - "blueprint_provides": [ { "id": "fbmf_south", "amount": 4 }, { "id": "fbmf_se_south" }, { "id": "fbmf_sw_south" } ], + "blueprint_requires": [ { "id": "fbmh_southeast", "amount": 4 }, { "id": "fbmh_southwest", "amount": 4 } ], + "blueprint_provides": [ { "id": "fbmh_south", "amount": 4 }, { "id": "fbmh_se_south" }, { "id": "fbmh_sw_south" } ], "blueprint_excludes": [ - { "id": "fbmf_se_south" }, - { "id": "fbmf_sw_south" }, - { "id": "fbmf_tent_southeast" }, - { "id": "fbmf_tent_southwest" } + { "id": "fbmh_se_south" }, + { "id": "fbmh_sw_south" }, + { "id": "fbmh_tent_southeast" }, + { "id": "fbmh_tent_southwest" } ], "blueprint_autocalc": true } diff --git a/data/json/recipes/basecamps/recipe_modular_field_wood.json b/data/json/recipes/basecamps/recipe_modular_field_wood.json index 7c10c661bfddb..2b7ab9c43c927 100644 --- a/data/json/recipes/basecamps/recipe_modular_field_wood.json +++ b/data/json/recipes/basecamps/recipe_modular_field_wood.json @@ -1,336 +1,336 @@ [ { "type": "recipe", - "result": "faction_base_modular_field_room0_wood_northeast", + "result": "faction_base_modular_hub_room0_wood_northeast", "description": "We need some shelter, so build half of a wood panel shack with a wooden roof on the northeast side of the camp", "category": "CC_BUILDING", "subcategory": "CSC_BUILDING_BASES", "autolearn": false, "never_learn": true, - "construction_blueprint": "fbmf_room0_wood_northeast", + "construction_blueprint": "fbmh_room0_wood_northeast", "blueprint_name": "northeast shack", - "blueprint_requires": [ { "id": "faction_base_modular_field_0" } ], - "blueprint_provides": [ { "id": "fbmf_northeast" } ], - "blueprint_excludes": [ { "id": "fbmf_northeast" } ], + "blueprint_requires": [ { "id": "fbmh_0" } ], + "blueprint_provides": [ { "id": "fbmh_northeast" } ], + "blueprint_excludes": [ { "id": "fbmh_northeast" } ], "blueprint_autocalc": true }, { "type": "recipe", - "result": "faction_base_modular_field_room1_wood_northeast", + "result": "faction_base_modular_hub_room1_wood_northeast", "description": "We should use wood panel to expand the shelter so we have space for another bed.", "category": "CC_BUILDING", "subcategory": "CSC_BUILDING_BASES", "autolearn": false, "never_learn": true, - "construction_blueprint": "fbmf_room1_wood_northeast", + "construction_blueprint": "fbmh_room1_wood_northeast", "blueprint_name": "expand northeast shack", - "blueprint_requires": [ { "id": "fbmf_northeast" } ], - "blueprint_provides": [ { "id": "fbmf_northeast" } ], - "blueprint_excludes": [ { "id": "fbmf_northeast", "amount": 2 }, { "id": "fbmf_tent_northeast" } ], + "blueprint_requires": [ { "id": "fbmh_northeast" } ], + "blueprint_provides": [ { "id": "fbmh_northeast" } ], + "blueprint_excludes": [ { "id": "fbmh_northeast", "amount": 2 }, { "id": "fbmh_tent_northeast" } ], "blueprint_autocalc": true }, { "type": "recipe", - "result": "faction_base_modular_field_room2_wood_northeast", + "result": "faction_base_modular_hub_room2_wood_northeast", "description": "We should use wood panel to finish the northeast shack.", "category": "CC_BUILDING", "subcategory": "CSC_BUILDING_BASES", "autolearn": false, "never_learn": true, - "construction_blueprint": "fbmf_room2_wood_northeast", + "construction_blueprint": "fbmh_room2_wood_northeast", "blueprint_name": "finish northeast shack", - "blueprint_requires": [ { "id": "fbmf_northeast", "amount": 2 } ], - "blueprint_provides": [ { "id": "fbmf_northeast", "amount": 2 } ], - "blueprint_excludes": [ { "id": "fbmf_northeast", "amount": 4 }, { "id": "fbmf_tent_northeast" } ], + "blueprint_requires": [ { "id": "fbmh_northeast", "amount": 2 } ], + "blueprint_provides": [ { "id": "fbmh_northeast", "amount": 2 } ], + "blueprint_excludes": [ { "id": "fbmh_northeast", "amount": 4 }, { "id": "fbmh_tent_northeast" } ], "blueprint_autocalc": true }, { "type": "recipe", - "result": "faction_base_modular_field_shack4_wood_east", + "result": "faction_base_modular_hub_shack4_wood_east", "description": "We should expand our housing by putting up a wood panel building on the east side, which we can also use as part of the central building.", "category": "CC_BUILDING", "subcategory": "CSC_BUILDING_BASES", "autolearn": false, "never_learn": true, - "construction_blueprint": "fbmf_shack4_wood_east", + "construction_blueprint": "fbmh_shack4_wood_east", "blueprint_name": "east shack", - "blueprint_requires": [ { "id": "fbmf_tent_northeast" }, { "id": "fbmf_fire_northeast" }, { "id": "fbmf_bed2_northeast" } ], - "blueprint_provides": [ { "id": "fbmf_east", "amount": 4 } ], - "blueprint_excludes": [ { "id": "fbmf_east" } ], + "blueprint_requires": [ { "id": "fbmh_tent_northeast" }, { "id": "fbmh_fire_northeast" }, { "id": "fbmh_bed2_northeast" } ], + "blueprint_provides": [ { "id": "fbmh_east", "amount": 4 } ], + "blueprint_excludes": [ { "id": "fbmh_east" } ], "blueprint_autocalc": true }, { "type": "recipe", - "result": "faction_base_modular_field_room4_wood_east", + "result": "faction_base_modular_hub_room4_wood_east", "description": "We should expand our housing by adding a wood panel room on the east side, which we can also use as part of the central building.", "category": "CC_BUILDING", "subcategory": "CSC_BUILDING_BASES", "autolearn": false, "never_learn": true, - "construction_blueprint": "fbmf_room4_wood_east", + "construction_blueprint": "fbmh_room4_wood_east", "blueprint_name": "east room", - "blueprint_requires": [ { "id": "fbmf_northeast", "amount": 4 }, { "id": "fbmf_fire_northeast" }, { "id": "fbmf_bed2_northeast" } ], - "blueprint_provides": [ { "id": "fbmf_east", "amount": 4 } ], - "blueprint_excludes": [ { "id": "fbmf_east" }, { "id": "fbmf_tent_northeast" } ], + "blueprint_requires": [ { "id": "fbmh_northeast", "amount": 4 }, { "id": "fbmh_fire_northeast" }, { "id": "fbmh_bed2_northeast" } ], + "blueprint_provides": [ { "id": "fbmh_east", "amount": 4 } ], + "blueprint_excludes": [ { "id": "fbmh_east" }, { "id": "fbmh_tent_northeast" } ], "blueprint_autocalc": true }, { "type": "recipe", - "result": "faction_base_modular_field_shack4_wood_southeast", + "result": "faction_base_modular_hub_shack4_wood_southeast", "description": "We should expand our housing by putting up a wood panel building on the southeast side, which we can also use as part of the central building.", "category": "CC_BUILDING", "subcategory": "CSC_BUILDING_BASES", "autolearn": false, "never_learn": true, - "construction_blueprint": "fbmf_shack4_wood_southeast", + "construction_blueprint": "fbmh_shack4_wood_southeast", "blueprint_name": "southeast shack", - "blueprint_requires": [ { "id": "fbmf_tent_east" } ], - "blueprint_provides": [ { "id": "fbmf_southeast", "amount": 4 } ], - "blueprint_excludes": [ { "id": "fbmf_southeast" } ], + "blueprint_requires": [ { "id": "fbmh_tent_east" } ], + "blueprint_provides": [ { "id": "fbmh_southeast", "amount": 4 } ], + "blueprint_excludes": [ { "id": "fbmh_southeast" } ], "blueprint_autocalc": true }, { "type": "recipe", - "result": "faction_base_modular_field_room4_wood_southeast", + "result": "faction_base_modular_hub_room4_wood_southeast", "description": "We should expand our housing by adding a wood panel room on the southeast side, which we can also use as part of the central building.", "category": "CC_BUILDING", "subcategory": "CSC_BUILDING_BASES", "autolearn": false, "never_learn": true, - "construction_blueprint": "fbmf_room4_wood_southeast", + "construction_blueprint": "fbmh_room4_wood_southeast", "blueprint_name": "southeast room", - "blueprint_requires": [ { "id": "fbmf_east", "amount": 4 } ], - "blueprint_provides": [ { "id": "fbmf_southeast", "amount": 4 } ], - "blueprint_excludes": [ { "id": "fbmf_southeast" }, { "id": "fbmf_tent_east" } ], + "blueprint_requires": [ { "id": "fbmh_east", "amount": 4 } ], + "blueprint_provides": [ { "id": "fbmh_southeast", "amount": 4 } ], + "blueprint_excludes": [ { "id": "fbmh_southeast" }, { "id": "fbmh_tent_east" } ], "blueprint_autocalc": true }, { "type": "recipe", - "result": "faction_base_modular_field_room4_wood_northwest", + "result": "faction_base_modular_hub_room4_wood_northwest", "description": "We should expand our housing by putting up a wood panel building on the northwest side, which we can also use as part of the central building.", "category": "CC_BUILDING", "subcategory": "CSC_BUILDING_BASES", "autolearn": false, "never_learn": true, - "construction_blueprint": "fbmf_room4_wood_northwest", + "construction_blueprint": "fbmh_room4_wood_northwest", "blueprint_name": "northwest shack", - "blueprint_requires": [ { "id": "fbmf_northeast", "amount": 4 }, { "id": "fbmf_fire_northeast" }, { "id": "fbmf_bed2_northeast" } ], - "blueprint_provides": [ { "id": "fbmf_northwest", "amount": 4 } ], - "blueprint_excludes": [ { "id": "fbmf_northwest" } ], + "blueprint_requires": [ { "id": "fbmh_northeast", "amount": 4 }, { "id": "fbmh_fire_northeast" }, { "id": "fbmh_bed2_northeast" } ], + "blueprint_provides": [ { "id": "fbmh_northwest", "amount": 4 } ], + "blueprint_excludes": [ { "id": "fbmh_northwest" } ], "blueprint_autocalc": true }, { "type": "recipe", - "result": "faction_base_modular_field_shack4_wood_west", + "result": "faction_base_modular_hub_shack4_wood_west", "description": "We should expand our housing by putting up a wood panel building on the west side, which we can also use as part of the central building.", "category": "CC_BUILDING", "subcategory": "CSC_BUILDING_BASES", "autolearn": false, "never_learn": true, - "construction_blueprint": "fbmf_shack4_wood_west", + "construction_blueprint": "fbmh_shack4_wood_west", "blueprint_name": "west shack", - "blueprint_requires": [ { "id": "fbmf_tent_northwest" } ], - "blueprint_provides": [ { "id": "fbmf_west", "amount": 4 } ], - "blueprint_excludes": [ { "id": "fbmf_west" } ], + "blueprint_requires": [ { "id": "fbmh_tent_northwest" } ], + "blueprint_provides": [ { "id": "fbmh_west", "amount": 4 } ], + "blueprint_excludes": [ { "id": "fbmh_west" } ], "blueprint_autocalc": true }, { "type": "recipe", - "result": "faction_base_modular_field_room4_wood_west", + "result": "faction_base_modular_hub_room4_wood_west", "description": "We should expand our housing by adding a wood panel room on the west side, which we can also use as part of the central building.", "category": "CC_BUILDING", "subcategory": "CSC_BUILDING_BASES", "autolearn": false, "never_learn": true, - "construction_blueprint": "fbmf_room4_wood_west", + "construction_blueprint": "fbmh_room4_wood_west", "blueprint_name": "west room", - "blueprint_requires": [ { "id": "fbmf_northwest", "amount": 4 } ], - "blueprint_provides": [ { "id": "fbmf_west", "amount": 4 } ], - "blueprint_excludes": [ { "id": "fbmf_west" }, { "id": "fbmf_tent_northwest" } ], + "blueprint_requires": [ { "id": "fbmh_northwest", "amount": 4 } ], + "blueprint_provides": [ { "id": "fbmh_west", "amount": 4 } ], + "blueprint_excludes": [ { "id": "fbmh_west" }, { "id": "fbmh_tent_northwest" } ], "blueprint_autocalc": true }, { "type": "recipe", - "result": "faction_base_modular_field_shack4_wood_southwest", + "result": "faction_base_modular_hub_shack4_wood_southwest", "description": "We should expand our housing by putting up a wood panel building on the southwest side, which we can also use as part of the central building.", "category": "CC_BUILDING", "subcategory": "CSC_BUILDING_BASES", "autolearn": false, "never_learn": true, - "construction_blueprint": "fbmf_shack4_wood_southwest", + "construction_blueprint": "fbmh_shack4_wood_southwest", "blueprint_name": "southwest shack", - "blueprint_requires": [ { "id": "fbmf_tent_west" } ], - "blueprint_provides": [ { "id": "fbmf_southwest", "amount": 4 } ], - "blueprint_excludes": [ { "id": "fbmf_southwest" } ], + "blueprint_requires": [ { "id": "fbmh_tent_west" } ], + "blueprint_provides": [ { "id": "fbmh_southwest", "amount": 4 } ], + "blueprint_excludes": [ { "id": "fbmh_southwest" } ], "blueprint_autocalc": true }, { "type": "recipe", - "result": "faction_base_modular_field_room4_wood_southwest", + "result": "faction_base_modular_hub_room4_wood_southwest", "description": "We should expand our housing by adding a wood panel room on the southwest side, which we can also use as part of the central building.", "category": "CC_BUILDING", "subcategory": "CSC_BUILDING_BASES", "autolearn": false, "never_learn": true, - "construction_blueprint": "fbmf_room4_wood_southwest", + "construction_blueprint": "fbmh_room4_wood_southwest", "blueprint_name": "southwest room", - "blueprint_requires": [ { "id": "fbmf_west", "amount": 4 } ], - "blueprint_provides": [ { "id": "fbmf_southwest", "amount": 4 } ], - "blueprint_excludes": [ { "id": "fbmf_southwest" }, { "id": "fbmf_tent_west" } ], + "blueprint_requires": [ { "id": "fbmh_west", "amount": 4 } ], + "blueprint_provides": [ { "id": "fbmh_southwest", "amount": 4 } ], + "blueprint_excludes": [ { "id": "fbmh_southwest" }, { "id": "fbmh_tent_west" } ], "blueprint_autocalc": true }, { "type": "recipe", - "result": "faction_base_modular_field_core_shack_ne_wood_center", + "result": "faction_base_modular_hub_core_shack_ne_wood_center", "description": "A central building can act as a kitchen and dining hall. We should build the northeast quarter of one from wood panel.", "category": "CC_BUILDING", "subcategory": "CSC_BUILDING_BASES", "autolearn": false, "never_learn": true, - "construction_blueprint": "fbmf_core_shack_ne_wood_center", + "construction_blueprint": "fbmh_core_shack_ne_wood_center", "blueprint_name": "central building NE corner", - "blueprint_requires": [ { "id": "fbmf_tent_east" } ], - "blueprint_provides": [ { "id": "fbmf_center", "amount": 2 }, { "id": "fbmf_ne_center" } ], - "blueprint_excludes": [ { "id": "fbmf_ne_center" } ], + "blueprint_requires": [ { "id": "fbmh_tent_east" } ], + "blueprint_provides": [ { "id": "fbmh_center", "amount": 2 }, { "id": "fbmh_ne_center" } ], + "blueprint_excludes": [ { "id": "fbmh_ne_center" } ], "blueprint_autocalc": true }, { "type": "recipe", - "result": "faction_base_modular_field_core_ne_wood_center", + "result": "faction_base_modular_hub_core_ne_wood_center", "description": "A central building can act as a core and dining hall. We should build out from the east room with wood panel.", "category": "CC_BUILDING", "subcategory": "CSC_BUILDING_BASES", "autolearn": false, "never_learn": true, - "construction_blueprint": "fbmf_core_ne_wood_center", + "construction_blueprint": "fbmh_core_ne_wood_center", "blueprint_name": "central building NE corner", - "blueprint_requires": [ { "id": "fbmf_east", "amount": 4 } ], - "blueprint_provides": [ { "id": "fbmf_center", "amount": 2 }, { "id": "fbmf_ne_center" } ], - "blueprint_excludes": [ { "id": "fbmf_ne_center" }, { "id": "fbmf_tent_east" } ], + "blueprint_requires": [ { "id": "fbmh_east", "amount": 4 } ], + "blueprint_provides": [ { "id": "fbmh_center", "amount": 2 }, { "id": "fbmh_ne_center" } ], + "blueprint_excludes": [ { "id": "fbmh_ne_center" }, { "id": "fbmh_tent_east" } ], "blueprint_autocalc": true }, { "type": "recipe", - "result": "faction_base_modular_field_core_nw_wood_center", + "result": "faction_base_modular_hub_core_nw_wood_center", "description": "A central building can act as a core and dining hall. We should build the northwest quarter of one from wood panel.", "category": "CC_BUILDING", "subcategory": "CSC_BUILDING_BASES", "autolearn": false, "never_learn": true, - "construction_blueprint": "fbmf_core_shack_nw_wood_center", + "construction_blueprint": "fbmh_core_shack_nw_wood_center", "blueprint_name": "central building NW corner", - "blueprint_requires": [ { "id": "fbmf_tent_west" } ], - "blueprint_provides": [ { "id": "fbmf_center", "amount": 2 }, { "id": "fbmf_nw_center" } ], - "blueprint_excludes": [ { "id": "fbmf_nw_center" } ], + "blueprint_requires": [ { "id": "fbmh_tent_west" } ], + "blueprint_provides": [ { "id": "fbmh_center", "amount": 2 }, { "id": "fbmh_nw_center" } ], + "blueprint_excludes": [ { "id": "fbmh_nw_center" } ], "blueprint_autocalc": true }, { "type": "recipe", - "result": "faction_base_modular_field_core_nw_wood_center", + "result": "faction_base_modular_hub_core_nw_wood_center", "description": "A central building can act as a core and dining hall. We should build out from the west room with wood panel.", "category": "CC_BUILDING", "subcategory": "CSC_BUILDING_BASES", "autolearn": false, "never_learn": true, - "construction_blueprint": "fbmf_core_nw_wood_center", + "construction_blueprint": "fbmh_core_nw_wood_center", "blueprint_name": "central building NW corner", - "blueprint_requires": [ { "id": "fbmf_west", "amount": 4 } ], - "blueprint_provides": [ { "id": "fbmf_center", "amount": 2 }, { "id": "fbmf_nw_center" } ], - "blueprint_excludes": [ { "id": "fbmf_nw_center" }, { "id": "fbmf_tent_west" } ], + "blueprint_requires": [ { "id": "fbmh_west", "amount": 4 } ], + "blueprint_provides": [ { "id": "fbmh_center", "amount": 2 }, { "id": "fbmh_nw_center" } ], + "blueprint_excludes": [ { "id": "fbmh_nw_center" }, { "id": "fbmh_tent_west" } ], "blueprint_autocalc": true }, { "type": "recipe", - "result": "faction_base_modular_field_core_wood_center", + "result": "faction_base_modular_hub_core_wood_center", "description": "A central building can act as a core and dining hall. We should build between the east and west rooms with wood panel.", "category": "CC_BUILDING", "subcategory": "CSC_BUILDING_BASES", "autolearn": false, "never_learn": true, - "construction_blueprint": "fbmf_core_wood_center", + "construction_blueprint": "fbmh_core_wood_center", "blueprint_name": "central building north half", - "blueprint_requires": [ { "id": "fbmf_east", "amount": 4 }, { "id": "fbmf_west", "amount": 4 } ], - "blueprint_provides": [ { "id": "fbmf_center", "amount": 4 }, { "id": "fbmf_ne_center" }, { "id": "fbmf_nw_center" } ], - "blueprint_excludes": [ { "id": "fbmf_ne_center" }, { "id": "fbmf_nw_center" }, { "id": "fbmf_tent_east" }, { "id": "fbmf_tent_west" } ], + "blueprint_requires": [ { "id": "fbmh_east", "amount": 4 }, { "id": "fbmh_west", "amount": 4 } ], + "blueprint_provides": [ { "id": "fbmh_center", "amount": 4 }, { "id": "fbmh_ne_center" }, { "id": "fbmh_nw_center" } ], + "blueprint_excludes": [ { "id": "fbmh_ne_center" }, { "id": "fbmh_nw_center" }, { "id": "fbmh_tent_east" }, { "id": "fbmh_tent_west" } ], "blueprint_autocalc": true }, { "type": "recipe", - "result": "faction_base_modular_field_core_shack_se_wood_south", + "result": "faction_base_modular_hub_core_shack_se_wood_south", "description": "A central building can act as a core and dining hall. We should build the southeast quarter of one from wood panel.", "category": "CC_BUILDING", "subcategory": "CSC_BUILDING_BASES", "autolearn": false, "never_learn": true, - "construction_blueprint": "fbmf_core_shack_se_wood_south", + "construction_blueprint": "fbmh_core_shack_se_wood_south", "blueprint_name": "central building SE corner", - "blueprint_requires": [ { "id": "fbmf_tent_southeast" } ], - "blueprint_provides": [ { "id": "fbmf_south", "amount": 2 }, { "id": "fbmf_se_south" } ], - "blueprint_excludes": [ { "id": "fbmf_se_south" } ], + "blueprint_requires": [ { "id": "fbmh_tent_southeast" } ], + "blueprint_provides": [ { "id": "fbmh_south", "amount": 2 }, { "id": "fbmh_se_south" } ], + "blueprint_excludes": [ { "id": "fbmh_se_south" } ], "blueprint_autocalc": true }, { "type": "recipe", - "result": "faction_base_modular_field_core_se_wood_south", + "result": "faction_base_modular_hub_core_se_wood_south", "description": "A central building can act as a core and dining hall. We should build out from the southeast room with wood panel.", "category": "CC_BUILDING", "subcategory": "CSC_BUILDING_BASES", "autolearn": false, "never_learn": true, - "construction_blueprint": "fbmf_core_se_wood_south", + "construction_blueprint": "fbmh_core_se_wood_south", "blueprint_name": "central building SE corner", - "blueprint_requires": [ { "id": "fbmf_southeast", "amount": 4 } ], - "blueprint_provides": [ { "id": "fbmf_south", "amount": 2 }, { "id": "fbmf_se_south" } ], - "blueprint_excludes": [ { "id": "fbmf_se_south" }, { "id": "fbmf_tent_southeast" } ], + "blueprint_requires": [ { "id": "fbmh_southeast", "amount": 4 } ], + "blueprint_provides": [ { "id": "fbmh_south", "amount": 2 }, { "id": "fbmh_se_south" } ], + "blueprint_excludes": [ { "id": "fbmh_se_south" }, { "id": "fbmh_tent_southeast" } ], "blueprint_autocalc": true }, { "type": "recipe", - "result": "faction_base_modular_field_core_shack_sw_wood_south", + "result": "faction_base_modular_hub_core_shack_sw_wood_south", "description": "A central building can act as a core and dining hall. We should build the southwest quarter of one from wood panel.", "category": "CC_BUILDING", "subcategory": "CSC_BUILDING_BASES", "autolearn": false, "never_learn": true, - "construction_blueprint": "fbmf_core_shack_sw_wood_south", + "construction_blueprint": "fbmh_core_shack_sw_wood_south", "blueprint_name": "central building SW corner", - "blueprint_requires": [ { "id": "fbmf_tent_southwest" } ], - "blueprint_provides": [ { "id": "fbmf_south", "amount": 2 }, { "id": "fbmf_sw_south" } ], - "blueprint_excludes": [ { "id": "fbmf_sw_south" } ], + "blueprint_requires": [ { "id": "fbmh_tent_southwest" } ], + "blueprint_provides": [ { "id": "fbmh_south", "amount": 2 }, { "id": "fbmh_sw_south" } ], + "blueprint_excludes": [ { "id": "fbmh_sw_south" } ], "blueprint_autocalc": true }, { "type": "recipe", - "result": "faction_base_modular_field_core_sw_wood_south", + "result": "faction_base_modular_hub_core_sw_wood_south", "description": "A central building can act as a core and dining hall. We should build out from the southwest room with wood panel.", "category": "CC_BUILDING", "subcategory": "CSC_BUILDING_BASES", "autolearn": false, "never_learn": true, - "construction_blueprint": "fbmf_core_sw_wood_south", + "construction_blueprint": "fbmh_core_sw_wood_south", "blueprint_name": "central building SW corner", - "blueprint_requires": [ { "id": "fbmf_southwest", "amount": 4 } ], - "blueprint_provides": [ { "id": "fbmf_south", "amount": 2 }, { "id": "fbmf_sw_south" } ], - "blueprint_excludes": [ { "id": "fbmf_sw_south" }, { "id": "fbmf_tent_southwest" } ], + "blueprint_requires": [ { "id": "fbmh_southwest", "amount": 4 } ], + "blueprint_provides": [ { "id": "fbmh_south", "amount": 2 }, { "id": "fbmh_sw_south" } ], + "blueprint_excludes": [ { "id": "fbmh_sw_south" }, { "id": "fbmh_tent_southwest" } ], "blueprint_autocalc": true }, { "type": "recipe", - "result": "faction_base_modular_field_core_wood_south", + "result": "faction_base_modular_hub_core_wood_south", "description": "A central building can act as a core and dining hall. We should build between the southeast and southwest rooms with wood panel.", "category": "CC_BUILDING", "subcategory": "CSC_BUILDING_BASES", "autolearn": false, "never_learn": true, - "construction_blueprint": "fbmf_core_wood_south", + "construction_blueprint": "fbmh_core_wood_south", "blueprint_name": "central building south half", - "blueprint_requires": [ { "id": "fbmf_southeast", "amount": 4 }, { "id": "fbmf_southwest", "amount": 4 } ], - "blueprint_provides": [ { "id": "fbmf_south", "amount": 4 }, { "id": "fbmf_se_south" }, { "id": "fbmf_sw_south" } ], + "blueprint_requires": [ { "id": "fbmh_southeast", "amount": 4 }, { "id": "fbmh_southwest", "amount": 4 } ], + "blueprint_provides": [ { "id": "fbmh_south", "amount": 4 }, { "id": "fbmh_se_south" }, { "id": "fbmh_sw_south" } ], "blueprint_excludes": [ - { "id": "fbmf_se_south" }, - { "id": "fbmf_sw_south" }, - { "id": "fbmf_tent_southeast" }, - { "id": "fbmf_tent_southwest" } + { "id": "fbmh_se_south" }, + { "id": "fbmh_sw_south" }, + { "id": "fbmh_tent_southeast" }, + { "id": "fbmh_tent_southwest" } ], "blueprint_autocalc": true } diff --git a/data/json/recipes/chem/mutagens.json b/data/json/recipes/chem/mutagens.json index 292ebe7d14cb8..22251e7149695 100644 --- a/data/json/recipes/chem/mutagens.json +++ b/data/json/recipes/chem/mutagens.json @@ -30,7 +30,8 @@ ], [ [ "bleach", 2 ], [ "oxy_powder", 200 ] ], [ [ "ammonia", 1 ], [ "lye_powder", 100 ] ] - ] + ], + "flags": [ "SECRET" ] }, { "type": "recipe", @@ -59,7 +60,8 @@ "book_learn": [ [ "recipe_serum", 8 ], [ "recipe_labchem", 9 ] ], "qualities": [ { "id": "CHEM", "level": 3 }, { "id": "FINE_DISTILL", "level": 1 }, { "id": "CONCENTRATE", "level": 1 } ], "tools": [ [ [ "surface_heat", 37, "LIST" ] ] ], - "components": [ [ [ "mutagen", 2 ] ] ] + "components": [ [ [ "mutagen", 2 ] ] ], + "flags": [ "SECRET" ] }, { "type": "recipe", @@ -78,7 +80,8 @@ [ [ "mutagen", 1 ] ], [ [ "veggy", 3 ], [ "biollante_bud", 1 ], [ "datura_seed", 16 ] ], [ [ "ammonia", 1 ], [ "lye_powder", 100 ] ] - ] + ], + "flags": [ "SECRET" ] }, { "type": "recipe", @@ -93,7 +96,8 @@ "book_learn": [ [ "recipe_serum", 8 ], [ "recipe_creepy", 8 ] ], "qualities": [ { "id": "CHEM", "level": 3 }, { "id": "FINE_DISTILL", "level": 1 }, { "id": "CONCENTRATE", "level": 1 } ], "tools": [ [ [ "surface_heat", 37, "LIST" ] ] ], - "components": [ [ [ "mutagen_plant", 2 ] ] ] + "components": [ [ [ "mutagen_plant", 2 ] ] ], + "flags": [ "SECRET" ] }, { "type": "recipe", @@ -112,7 +116,8 @@ [ [ "mutagen", 1 ] ], [ [ "honey_bottled", 3 ], [ "honeycomb", 3 ], [ "bee_sting", 3 ], [ "wasp_sting", 3 ] ], [ [ "ammonia", 1 ], [ "lye_powder", 100 ] ] - ] + ], + "flags": [ "SECRET" ] }, { "type": "recipe", @@ -127,7 +132,8 @@ "book_learn": [ [ "recipe_serum", 8 ], [ "recipe_maiar", 8 ] ], "qualities": [ { "id": "CHEM", "level": 3 }, { "id": "FINE_DISTILL", "level": 1 }, { "id": "CONCENTRATE", "level": 1 } ], "tools": [ [ [ "surface_heat", 37, "LIST" ] ] ], - "components": [ [ [ "mutagen_insect", 2 ] ] ] + "components": [ [ [ "mutagen_insect", 2 ] ] ], + "flags": [ "SECRET" ] }, { "type": "recipe", @@ -142,7 +148,8 @@ "book_learn": [ [ "recipe_maiar", 8 ] ], "qualities": [ { "id": "CHEM", "level": 3 }, { "id": "SEPARATE", "level": 1 }, { "id": "ANALYSIS", "level": 1 } ], "tools": [ [ [ "surface_heat", 25, "LIST" ] ] ], - "components": [ [ [ "mutagen", 1 ] ], [ [ "spider_egg", 1 ], [ "chitin_piece", 4 ] ], [ [ "ammonia", 1 ], [ "lye_powder", 100 ] ] ] + "components": [ [ [ "mutagen", 1 ] ], [ [ "spider_egg", 1 ], [ "chitin_piece", 4 ] ], [ [ "ammonia", 1 ], [ "lye_powder", 100 ] ] ], + "flags": [ "SECRET" ] }, { "type": "recipe", @@ -157,7 +164,8 @@ "book_learn": [ [ "recipe_serum", 8 ], [ "recipe_maiar", 8 ] ], "qualities": [ { "id": "CHEM", "level": 3 }, { "id": "FINE_DISTILL", "level": 1 }, { "id": "CONCENTRATE", "level": 1 } ], "tools": [ [ [ "surface_heat", 37, "LIST" ] ] ], - "components": [ [ [ "mutagen_spider", 2 ] ] ] + "components": [ [ [ "mutagen_spider", 2 ] ] ], + "flags": [ "SECRET" ] }, { "type": "recipe", @@ -172,7 +180,8 @@ "book_learn": [ [ "recipe_maiar", 8 ], [ "recipe_creepy", 8 ] ], "qualities": [ { "id": "CHEM", "level": 3 }, { "id": "SEPARATE", "level": 1 }, { "id": "ANALYSIS", "level": 1 } ], "tools": [ [ [ "surface_heat", 25, "LIST" ] ] ], - "components": [ [ [ "mutagen", 1 ] ], [ [ "sewage", 3 ], [ "slime_scrap", 3 ] ], [ [ "ammonia", 1 ], [ "lye_powder", 100 ] ] ] + "components": [ [ [ "mutagen", 1 ] ], [ [ "sewage", 3 ], [ "slime_scrap", 3 ] ], [ [ "ammonia", 1 ], [ "lye_powder", 100 ] ] ], + "flags": [ "SECRET" ] }, { "type": "recipe", @@ -187,7 +196,8 @@ "book_learn": [ [ "recipe_serum", 8 ], [ "recipe_maiar", 8 ], [ "recipe_creepy", 8 ] ], "qualities": [ { "id": "CHEM", "level": 3 }, { "id": "SEPARATE", "level": 1 }, { "id": "ANALYSIS", "level": 1 } ], "tools": [ [ [ "surface_heat", 37, "LIST" ] ] ], - "components": [ [ [ "mutagen_slime", 2 ] ] ] + "components": [ [ [ "mutagen_slime", 2 ] ] ], + "flags": [ "SECRET" ] }, { "type": "recipe", @@ -206,7 +216,8 @@ [ [ "mutagen", 1 ] ], [ [ "fish", 2 ], [ "can_sardine", 1 ], [ "can_tuna", 1 ], [ "can_salmon", 1 ], [ "can_herring", 1 ] ], [ [ "ammonia", 1 ], [ "lye_powder", 100 ] ] - ] + ], + "flags": [ "SECRET" ] }, { "type": "recipe", @@ -221,7 +232,8 @@ "book_learn": [ [ "recipe_serum", 8 ], [ "recipe_animal", 8 ] ], "qualities": [ { "id": "CHEM", "level": 3 }, { "id": "FINE_DISTILL", "level": 1 }, { "id": "CONCENTRATE", "level": 1 } ], "tools": [ [ [ "surface_heat", 37, "LIST" ] ] ], - "components": [ [ [ "mutagen_fish", 2 ] ] ] + "components": [ [ [ "mutagen_fish", 2 ] ] ], + "flags": [ "SECRET" ] }, { "type": "recipe", @@ -240,7 +252,8 @@ [ [ "mutagen", 1 ] ], [ [ "meat_tainted", 3 ], [ "dry_meat_tainted", 3 ] ], [ [ "ammonia", 1 ], [ "lye_powder", 100 ] ] - ] + ], + "flags": [ "SECRET" ] }, { "type": "recipe", @@ -255,7 +268,8 @@ "book_learn": [ [ "recipe_serum", 8 ], [ "recipe_creepy", 8 ] ], "qualities": [ { "id": "CHEM", "level": 3 }, { "id": "FINE_DISTILL", "level": 1 }, { "id": "CONCENTRATE", "level": 1 } ], "tools": [ [ [ "surface_heat", 37, "LIST" ] ] ], - "components": [ [ [ "mutagen_rat", 2 ] ] ] + "components": [ [ [ "mutagen_rat", 2 ] ] ], + "flags": [ "SECRET" ] }, { "type": "recipe", @@ -270,7 +284,8 @@ "book_learn": [ [ "recipe_animal", 7 ] ], "qualities": [ { "id": "CHEM", "level": 3 }, { "id": "SEPARATE", "level": 1 }, { "id": "ANALYSIS", "level": 1 } ], "tools": [ [ [ "surface_heat", 25, "LIST" ] ] ], - "components": [ [ [ "mutagen", 1 ] ], [ [ "meat", 3 ] ], [ [ "ammonia", 1 ], [ "lye_powder", 100 ] ] ] + "components": [ [ [ "mutagen", 1 ] ], [ [ "meat", 3 ] ], [ [ "ammonia", 1 ], [ "lye_powder", 100 ] ] ], + "flags": [ "SECRET" ] }, { "type": "recipe", @@ -285,7 +300,8 @@ "book_learn": [ [ "recipe_serum", 8 ], [ "recipe_animal", 8 ] ], "qualities": [ { "id": "CHEM", "level": 3 }, { "id": "FINE_DISTILL", "level": 1 }, { "id": "CONCENTRATE", "level": 1 } ], "tools": [ [ [ "surface_heat", 37, "LIST" ] ] ], - "components": [ [ [ "mutagen_beast", 2 ] ] ] + "components": [ [ [ "mutagen_beast", 2 ] ] ], + "flags": [ "SECRET" ] }, { "type": "recipe", @@ -300,7 +316,8 @@ "book_learn": [ [ "recipe_animal", 8 ] ], "qualities": [ { "id": "CHEM", "level": 3 }, { "id": "SEPARATE", "level": 1 }, { "id": "ANALYSIS", "level": 1 } ], "tools": [ [ [ "surface_heat", 25, "LIST" ] ] ], - "components": [ [ [ "mutagen", 1 ] ], [ [ "meat", 3 ] ], [ [ "ammonia", 1 ], [ "lye_powder", 100 ] ] ] + "components": [ [ [ "mutagen", 1 ] ], [ [ "meat", 3 ] ], [ [ "ammonia", 1 ], [ "lye_powder", 100 ] ] ], + "flags": [ "SECRET" ] }, { "type": "recipe", @@ -315,7 +332,8 @@ "book_learn": [ [ "recipe_serum", 8 ], [ "recipe_animal", 8 ] ], "qualities": [ { "id": "CHEM", "level": 3 }, { "id": "FINE_DISTILL", "level": 1 }, { "id": "CONCENTRATE", "level": 1 } ], "tools": [ [ [ "surface_heat", 37, "LIST" ] ] ], - "components": [ [ [ "mutagen_ursine", 2 ] ] ] + "components": [ [ [ "mutagen_ursine", 2 ] ] ], + "flags": [ "SECRET" ] }, { "type": "recipe", @@ -330,7 +348,8 @@ "book_learn": [ [ "recipe_animal", 8 ] ], "qualities": [ { "id": "CHEM", "level": 3 }, { "id": "SEPARATE", "level": 1 }, { "id": "ANALYSIS", "level": 1 } ], "tools": [ [ [ "surface_heat", 25, "LIST" ] ] ], - "components": [ [ [ "mutagen", 1 ] ], [ [ "meat", 1 ] ], [ [ "ammonia", 1 ], [ "lye_powder", 100 ] ] ] + "components": [ [ [ "mutagen", 1 ] ], [ [ "meat", 1 ] ], [ [ "ammonia", 1 ], [ "lye_powder", 100 ] ] ], + "flags": [ "SECRET" ] }, { "type": "recipe", @@ -345,7 +364,8 @@ "book_learn": [ [ "recipe_serum", 8 ], [ "recipe_animal", 8 ] ], "qualities": [ { "id": "CHEM", "level": 3 }, { "id": "FINE_DISTILL", "level": 1 }, { "id": "CONCENTRATE", "level": 1 } ], "tools": [ [ [ "surface_heat", 37, "LIST" ] ] ], - "components": [ [ [ "mutagen_mouse", 2 ] ] ] + "components": [ [ [ "mutagen_mouse", 2 ] ] ], + "flags": [ "SECRET" ] }, { "type": "recipe", @@ -360,7 +380,8 @@ "book_learn": [ [ "recipe_animal", 8 ] ], "qualities": [ { "id": "CHEM", "level": 3 }, { "id": "SEPARATE", "level": 1 }, { "id": "ANALYSIS", "level": 1 } ], "tools": [ [ [ "surface_heat", 25, "LIST" ] ] ], - "components": [ [ [ "mutagen", 1 ] ], [ [ "meat", 3 ] ], [ [ "ammonia", 1 ], [ "lye_powder", 100 ] ] ] + "components": [ [ [ "mutagen", 1 ] ], [ [ "meat", 3 ] ], [ [ "ammonia", 1 ], [ "lye_powder", 100 ] ] ], + "flags": [ "SECRET" ] }, { "type": "recipe", @@ -375,7 +396,8 @@ "book_learn": [ [ "recipe_serum", 8 ], [ "recipe_animal", 8 ] ], "qualities": [ { "id": "CHEM", "level": 3 }, { "id": "FINE_DISTILL", "level": 1 }, { "id": "CONCENTRATE", "level": 1 } ], "tools": [ [ [ "surface_heat", 37, "LIST" ] ] ], - "components": [ [ [ "mutagen_feline", 2 ] ] ] + "components": [ [ [ "mutagen_feline", 2 ] ] ], + "flags": [ "SECRET" ] }, { "type": "recipe", @@ -390,7 +412,8 @@ "book_learn": [ [ "recipe_animal", 8 ] ], "qualities": [ { "id": "CHEM", "level": 3 }, { "id": "SEPARATE", "level": 1 }, { "id": "ANALYSIS", "level": 1 } ], "tools": [ [ [ "surface_heat", 25, "LIST" ] ] ], - "components": [ [ [ "mutagen", 1 ] ], [ [ "meat", 3 ] ], [ [ "ammonia", 1 ], [ "lye_powder", 100 ] ] ] + "components": [ [ [ "mutagen", 1 ] ], [ [ "meat", 3 ] ], [ [ "ammonia", 1 ], [ "lye_powder", 100 ] ] ], + "flags": [ "SECRET" ] }, { "type": "recipe", @@ -405,7 +428,8 @@ "book_learn": [ [ "recipe_serum", 8 ], [ "recipe_animal", 8 ] ], "qualities": [ { "id": "CHEM", "level": 3 }, { "id": "FINE_DISTILL", "level": 1 }, { "id": "CONCENTRATE", "level": 1 } ], "tools": [ [ [ "surface_heat", 37, "LIST" ] ] ], - "components": [ [ [ "mutagen_lupine", 2 ] ] ] + "components": [ [ [ "mutagen_lupine", 2 ] ] ], + "flags": [ "SECRET" ] }, { "type": "recipe", @@ -420,7 +444,8 @@ "book_learn": [ [ "recipe_animal", 8 ] ], "qualities": [ { "id": "CHEM", "level": 3 }, { "id": "SEPARATE", "level": 1 }, { "id": "ANALYSIS", "level": 1 } ], "tools": [ [ [ "surface_heat", 25, "LIST" ] ] ], - "components": [ [ [ "mutagen", 1 ] ], [ [ "meat", 3 ] ], [ [ "ammonia", 1 ], [ "lye_powder", 100 ] ] ] + "components": [ [ [ "mutagen", 1 ] ], [ [ "meat", 3 ] ], [ [ "ammonia", 1 ], [ "lye_powder", 100 ] ] ], + "flags": [ "SECRET" ] }, { "type": "recipe", @@ -435,7 +460,8 @@ "book_learn": [ [ "recipe_serum", 8 ], [ "recipe_animal", 8 ] ], "qualities": [ { "id": "CHEM", "level": 3 }, { "id": "FINE_DISTILL", "level": 1 }, { "id": "CONCENTRATE", "level": 1 } ], "tools": [ [ [ "surface_heat", 37, "LIST" ] ] ], - "components": [ [ [ "mutagen_cattle", 2 ] ] ] + "components": [ [ [ "mutagen_cattle", 2 ] ] ], + "flags": [ "SECRET" ] }, { "type": "recipe", @@ -454,7 +480,8 @@ [ [ "mutagen", 1 ] ], [ [ "meat_tainted", 3 ], [ "dry_meat_tainted", 3 ], [ "can_chowder", 1 ], [ "can_clams", 1 ] ], [ [ "ammonia", 1 ], [ "lye_powder", 100 ] ] - ] + ], + "flags": [ "SECRET" ] }, { "type": "recipe", @@ -469,7 +496,8 @@ "book_learn": [ [ "recipe_serum", 8 ], [ "recipe_creepy", 8 ] ], "qualities": [ { "id": "CHEM", "level": 3 }, { "id": "FINE_DISTILL", "level": 1 }, { "id": "CONCENTRATE", "level": 1 } ], "tools": [ [ [ "surface_heat", 37, "LIST" ] ] ], - "components": [ [ [ "mutagen_cephalopod", 2 ] ] ] + "components": [ [ [ "mutagen_cephalopod", 2 ] ] ], + "flags": [ "SECRET" ] }, { "type": "recipe", @@ -484,7 +512,8 @@ "book_learn": [ [ "recipe_animal", 8 ] ], "qualities": [ { "id": "CHEM", "level": 3 }, { "id": "SEPARATE", "level": 1 }, { "id": "ANALYSIS", "level": 1 } ], "tools": [ [ [ "surface_heat", 25, "LIST" ] ] ], - "components": [ [ [ "mutagen", 1 ] ], [ [ "eggs_bird", 1, "LIST" ] ], [ [ "ammonia", 1 ], [ "lye_powder", 100 ] ] ] + "components": [ [ [ "mutagen", 1 ] ], [ [ "eggs_bird", 1, "LIST" ] ], [ [ "ammonia", 1 ], [ "lye_powder", 100 ] ] ], + "flags": [ "SECRET" ] }, { "type": "recipe", @@ -499,7 +528,8 @@ "book_learn": [ [ "recipe_serum", 8 ], [ "recipe_animal", 8 ] ], "qualities": [ { "id": "CHEM", "level": 3 }, { "id": "FINE_DISTILL", "level": 1 }, { "id": "CONCENTRATE", "level": 1 } ], "tools": [ [ [ "surface_heat", 37, "LIST" ] ] ], - "components": [ [ [ "mutagen_bird", 2 ] ] ] + "components": [ [ [ "mutagen_bird", 2 ] ] ], + "flags": [ "SECRET" ] }, { "type": "recipe", @@ -514,7 +544,8 @@ "book_learn": [ [ "recipe_animal", 8 ] ], "qualities": [ { "id": "CHEM", "level": 3 }, { "id": "SEPARATE", "level": 1 }, { "id": "ANALYSIS", "level": 1 } ], "tools": [ [ [ "surface_heat", 25, "LIST" ] ] ], - "components": [ [ [ "mutagen", 1 ] ], [ [ "egg_reptile", 1 ] ], [ [ "ammonia", 1 ], [ "lye_powder", 100 ] ] ] + "components": [ [ [ "mutagen", 1 ] ], [ [ "egg_reptile", 1 ] ], [ [ "ammonia", 1 ], [ "lye_powder", 100 ] ] ], + "flags": [ "SECRET" ] }, { "type": "recipe", @@ -529,7 +560,8 @@ "book_learn": [ [ "recipe_serum", 8 ], [ "recipe_animal", 8 ] ], "qualities": [ { "id": "CHEM", "level": 3 }, { "id": "FINE_DISTILL", "level": 1 }, { "id": "CONCENTRATE", "level": 1 } ], "tools": [ [ [ "surface_heat", 37, "LIST" ] ] ], - "components": [ [ [ "mutagen_lizard", 2 ] ] ] + "components": [ [ [ "mutagen_lizard", 2 ] ] ], + "flags": [ "SECRET" ] }, { "type": "recipe", @@ -544,7 +576,8 @@ "book_learn": [ [ "recipe_maiar", 8 ] ], "qualities": [ { "id": "CHEM", "level": 3 }, { "id": "SEPARATE", "level": 1 }, { "id": "ANALYSIS", "level": 1 } ], "tools": [ [ [ "surface_heat", 25, "LIST" ] ] ], - "components": [ [ [ "mutagen", 1 ] ], [ [ "meat", 3 ] ], [ [ "ammonia", 1 ], [ "lye_powder", 100 ] ] ] + "components": [ [ [ "mutagen", 1 ] ], [ [ "meat", 3 ] ], [ [ "ammonia", 1 ], [ "lye_powder", 100 ] ] ], + "flags": [ "SECRET" ] }, { "type": "recipe", @@ -559,7 +592,8 @@ "book_learn": [ [ "recipe_serum", 8 ], [ "recipe_maiar", 8 ] ], "qualities": [ { "id": "CHEM", "level": 3 }, { "id": "FINE_DISTILL", "level": 1 }, { "id": "CONCENTRATE", "level": 1 } ], "tools": [ [ [ "surface_heat", 37, "LIST" ] ] ], - "components": [ [ [ "mutagen_troglobite", 2 ] ] ] + "components": [ [ [ "mutagen_troglobite", 2 ] ] ], + "flags": [ "SECRET" ] }, { "type": "recipe", @@ -600,7 +634,8 @@ [ "hflesh_powder", 10 ], [ "protein_powder", 10 ] ] - ] + ], + "flags": [ "SECRET" ] }, { "type": "recipe", @@ -615,7 +650,8 @@ "book_learn": [ [ "recipe_medicalmut", 9 ], [ "recipe_serum", 9 ] ], "qualities": [ { "id": "CHEM", "level": 3 }, { "id": "FINE_DISTILL", "level": 1 }, { "id": "CONCENTRATE", "level": 1 } ], "tools": [ [ [ "surface_heat", 37, "LIST" ] ] ], - "components": [ [ [ "mutagen_medical", 2 ] ] ] + "components": [ [ [ "mutagen_medical", 2 ] ] ], + "flags": [ "SECRET" ] }, { "type": "recipe", @@ -634,7 +670,8 @@ [ [ "royal_jelly", 4 ], [ "mutagen", 2 ] ], [ [ "bleach", 3 ], [ "oxy_powder", 300 ] ], [ [ "ammonia", 2 ], [ "lye_powder", 200 ] ] - ] + ], + "flags": [ "SECRET" ] }, { "type": "recipe", @@ -649,7 +686,8 @@ "book_learn": [ [ "recipe_serum", 9 ], [ "recipe_labchem", 9 ] ], "qualities": [ { "id": "CHEM", "level": 3 }, { "id": "FINE_DISTILL", "level": 1 }, { "id": "CONCENTRATE", "level": 1 } ], "tools": [ [ [ "surface_heat", 37, "LIST" ] ] ], - "components": [ [ [ "purifier", 2 ] ] ] + "components": [ [ [ "purifier", 2 ] ] ], + "flags": [ "SECRET" ] }, { "type": "recipe", @@ -668,7 +706,8 @@ [ [ "mutagen_plant", 2 ], [ "iv_mutagen_plant", 1 ] ], [ [ "mutagen_bird", 2 ], [ "iv_mutagen_bird", 1 ] ], [ [ "purifier", 4 ], [ "iv_purifier", 2 ] ] - ] + ], + "flags": [ "SECRET" ] }, { "type": "recipe", @@ -683,7 +722,8 @@ "book_learn": [ [ "recipe_alpha", 9 ] ], "qualities": [ { "id": "CHEM", "level": 3 }, { "id": "FINE_DISTILL", "level": 1 }, { "id": "CONCENTRATE", "level": 1 } ], "tools": [ [ [ "surface_heat", 37, "LIST" ] ] ], - "components": [ [ [ "mutagen_alpha", 2 ] ] ] + "components": [ [ [ "mutagen_alpha", 2 ] ] ], + "flags": [ "SECRET" ] }, { "type": "recipe", @@ -697,7 +737,8 @@ "book_learn": [ [ "recipe_elfa", 10 ] ], "qualities": [ { "id": "CHEM", "level": 3 }, { "id": "SEPARATE", "level": 1 }, { "id": "ANALYSIS", "level": 1 } ], "tools": [ [ [ "surface_heat", 31, "LIST" ] ] ], - "components": [ [ [ "mutagen_slime", 2 ], [ "iv_mutagen_slime", 1 ] ], [ [ "mutagen_plant", 1 ] ], [ [ "mutagen_bird", 1 ] ] ] + "components": [ [ [ "mutagen_slime", 2 ], [ "iv_mutagen_slime", 1 ] ], [ [ "mutagen_plant", 1 ] ], [ [ "mutagen_bird", 1 ] ] ], + "flags": [ "SECRET" ] }, { "type": "recipe", @@ -712,7 +753,8 @@ "book_learn": [ [ "recipe_elfa", 10 ] ], "qualities": [ { "id": "CHEM", "level": 3 }, { "id": "FINE_DISTILL", "level": 1 }, { "id": "CONCENTRATE", "level": 1 } ], "tools": [ [ [ "surface_heat", 37, "LIST" ] ] ], - "components": [ [ [ "mutagen_elfa", 2 ] ] ] + "components": [ [ [ "mutagen_elfa", 2 ] ] ], + "flags": [ "SECRET" ] }, { "type": "recipe", @@ -727,7 +769,8 @@ "book_learn": [ [ "recipe_chimera", 9 ] ], "qualities": [ { "id": "CHEM", "level": 3 }, { "id": "SEPARATE", "level": 1 }, { "id": "ANALYSIS", "level": 1 } ], "tools": [ [ [ "surface_heat", 37, "LIST" ] ] ], - "components": [ [ [ "mutagen_lizard", 1 ] ], [ [ "mutagen_bird", 1 ] ], [ [ "mutagen_beast", 1 ] ], [ [ "mutagen_cattle", 1 ] ] ] + "components": [ [ [ "mutagen_lizard", 1 ] ], [ [ "mutagen_bird", 1 ] ], [ [ "mutagen_beast", 1 ] ], [ [ "mutagen_cattle", 1 ] ] ], + "flags": [ "SECRET" ] }, { "type": "recipe", @@ -742,7 +785,8 @@ "book_learn": [ [ "recipe_chimera", 8 ] ], "qualities": [ { "id": "CHEM", "level": 3 }, { "id": "FINE_DISTILL", "level": 1 }, { "id": "CONCENTRATE", "level": 1 } ], "tools": [ [ [ "surface_heat", 37, "LIST" ] ] ], - "components": [ [ [ "mutagen_chimera", 2 ] ] ] + "components": [ [ [ "mutagen_chimera", 2 ] ] ], + "flags": [ "SECRET" ] }, { "type": "recipe", @@ -756,7 +800,8 @@ "book_learn": [ [ "recipe_raptor", 9 ] ], "qualities": [ { "id": "CHEM", "level": 3 }, { "id": "SEPARATE", "level": 1 }, { "id": "ANALYSIS", "level": 1 } ], "tools": [ [ [ "surface_heat", 31, "LIST" ] ] ], - "components": [ [ [ "mutagen_lizard", 1 ] ], [ [ "mutagen_bird", 1 ] ], [ [ "purifier", 1 ] ] ] + "components": [ [ [ "mutagen_lizard", 1 ] ], [ [ "mutagen_bird", 1 ] ], [ [ "purifier", 1 ] ] ], + "flags": [ "SECRET" ] }, { "type": "recipe", @@ -771,6 +816,7 @@ "book_learn": [ [ "recipe_raptor", 9 ] ], "qualities": [ { "id": "CHEM", "level": 3 }, { "id": "FINE_DISTILL", "level": 1 }, { "id": "CONCENTRATE", "level": 1 } ], "tools": [ [ [ "surface_heat", 37, "LIST" ] ] ], - "components": [ [ [ "mutagen_raptor", 2 ] ] ] + "components": [ [ [ "mutagen_raptor", 2 ] ] ], + "flags": [ "SECRET" ] } ] diff --git a/data/json/recipes/other/parts.json b/data/json/recipes/other/parts.json index 1cf3307d61cf2..841a1ea833a09 100644 --- a/data/json/recipes/other/parts.json +++ b/data/json/recipes/other/parts.json @@ -1,4 +1,17 @@ [ + { + "result": "hinge", + "type": "recipe", + "category": "CC_OTHER", + "subcategory": "CSC_OTHER_PARTS", + "skill_used": "fabrication", + "difficulty": 5, + "time": "210 m", + "autolearn": true, + "using": [ [ "forging_standard", 1 ], [ "steel_tiny", 1 ] ], + "qualities": [ { "id": "ANVIL", "level": 3 }, { "id": "HAMMER", "level": 3 }, { "id": "CHISEL", "level": 3 } ], + "tools": [ [ [ "tongs", -1 ] ], [ [ "crucible", -1 ], [ "crucible_clay", -1 ] ] ] + }, { "result": "sheet_metal", "type": "recipe", diff --git a/data/json/recipes/recipe_deconstruction.json b/data/json/recipes/recipe_deconstruction.json index cbb09b158a692..23d1050697260 100644 --- a/data/json/recipes/recipe_deconstruction.json +++ b/data/json/recipes/recipe_deconstruction.json @@ -1830,6 +1830,86 @@ "qualities": [ { "id": "CUT", "level": 1 } ], "components": [ [ [ "wild_herbs", 10 ] ] ] }, + { + "result": "hickory_nut", + "type": "uncraft", + "skill_used": "survival", + "difficulty": 1, + "time": "6 m", + "qualities": [ { "id": "HAMMER", "level": 1 } ], + "components": [ [ [ "hickory_nut_unshelled", 1 ] ] ], + "flags": [ "BLIND_EASY" ] + }, + { + "result": "hazelnut", + "type": "uncraft", + "skill_used": "survival", + "difficulty": 1, + "time": "6 m", + "qualities": [ { "id": "HAMMER", "level": 1 } ], + "components": [ [ [ "hazelnut_unshelled", 1 ] ] ], + "flags": [ "BLIND_EASY" ] + }, + { + "result": "chestnut", + "type": "uncraft", + "skill_used": "survival", + "difficulty": 1, + "time": "6 m", + "qualities": [ { "id": "HAMMER", "level": 1 } ], + "components": [ [ [ "chestnut_unshelled", 1 ] ] ], + "flags": [ "BLIND_EASY" ] + }, + { + "result": "almond", + "type": "uncraft", + "skill_used": "survival", + "difficulty": 1, + "time": "6 m", + "qualities": [ { "id": "HAMMER", "level": 1 } ], + "components": [ [ [ "almond_unshelled", 1 ] ] ], + "flags": [ "BLIND_EASY" ] + }, + { + "result": "pistachio", + "type": "uncraft", + "skill_used": "survival", + "difficulty": 1, + "time": "6 m", + "qualities": [ { "id": "HAMMER", "level": 1 } ], + "components": [ [ [ "pistachio_unshelled", 1 ] ] ], + "flags": [ "BLIND_EASY" ] + }, + { + "result": "pecan", + "type": "uncraft", + "skill_used": "survival", + "difficulty": 1, + "time": "6 m", + "qualities": [ { "id": "HAMMER", "level": 1 } ], + "components": [ [ [ "pecan_unshelled", 1 ] ] ], + "flags": [ "BLIND_EASY" ] + }, + { + "result": "walnut", + "type": "uncraft", + "skill_used": "survival", + "difficulty": 1, + "time": "6 m", + "qualities": [ { "id": "HAMMER", "level": 1 } ], + "components": [ [ [ "walnut_unshelled", 1 ] ] ], + "flags": [ "BLIND_EASY" ] + }, + { + "result": "peanut", + "type": "uncraft", + "skill_used": "survival", + "difficulty": 1, + "time": "6 m", + "qualities": [ { "id": "HAMMER", "level": 1 } ], + "components": [ [ [ "peanut_unshelled", 1 ] ] ], + "flags": [ "BLIND_EASY" ] + }, { "result": "tieclip", "type": "uncraft", @@ -1867,6 +1947,14 @@ "components": [ [ [ "rag", 5 ] ] ], "flags": [ "BLIND_HARD" ] }, + { + "result": "tshirt_tour", + "type": "uncraft", + "skill_used": "tailor", + "time": "0 m", + "components": [ [ [ "rag", 5 ] ] ], + "flags": [ "BLIND_HARD" ] + }, { "result": "usb_drive", "type": "uncraft", @@ -1907,6 +1995,13 @@ "components": [ [ [ "paper", 2 ] ] ], "flags": [ "BLIND_EASY" ] }, + { + "result": "hinge", + "type": "uncraft", + "time": "1 m", + "qualities": [ { "id": "HAMMER", "level": 1 } ], + "components": [ [ [ "sheet_metal_small", 1 ] ] ] + }, { "result": "wire", "type": "uncraft", @@ -1952,6 +2047,20 @@ "qualities": [ { "id": "CUT", "level": 1 } ], "components": [ [ [ "paper", 35 ] ] ] }, + { + "result": "box_medium", + "type": "uncraft", + "time": "4 m", + "qualities": [ { "id": "CUT", "level": 1 } ], + "components": [ [ [ "paper", 70 ] ] ] + }, + { + "result": "box_large", + "type": "uncraft", + "time": "6 m", + "qualities": [ { "id": "CUT", "level": 1 } ], + "components": [ [ [ "paper", 105 ] ] ] + }, { "result": "washing_machine", "type": "uncraft", @@ -2322,5 +2431,41 @@ "difficulty": 1, "qualities": [ { "id": "HAMMER", "level": 1 } ], "components": [ [ [ "adobe_brick", 20 ] ], [ [ "frame_wood_light", 1 ] ] ] + }, + { + "result": "guitar_electric", + "type": "uncraft", + "skill_used": "electronics", + "difficulty": 1, + "time": "7 m", + "qualities": [ { "id": "SCREW", "level": 1 }, { "id": "CUT", "level": 1 } ], + "components": [ + [ [ "shoulder_strap", 1 ] ], + [ [ "2x4", 1 ] ], + [ [ "amplifier", 1 ] ], + [ [ "cable", 10 ] ], + [ [ "scrap", 1 ] ], + [ [ "e_scrap", 2 ] ] + ] + }, + { + "result": "amplifier_head", + "type": "uncraft", + "skill_used": "electronics", + "difficulty": 1, + "time": "80 m", + "qualities": [ { "id": "SCREW", "level": 1 } ], + "components": [ + [ [ "circuit", 1 ] ], + [ [ "cable", 4 ] ], + [ [ "amplifier", 4 ] ], + [ [ "power_supply", 2 ] ], + [ [ "plastic_chunk", 4 ] ], + [ [ "scrap", 2 ] ], + [ [ "splinter", 1 ] ], + [ [ "solder_wire", 5 ] ], + [ [ "e_scrap", 3 ] ], + [ [ "RAM", 1 ] ] + ] } ] diff --git a/data/json/recipes/recipe_food.json b/data/json/recipes/recipe_food.json index c34adb9be4c0d..77edc0b9b6851 100644 --- a/data/json/recipes/recipe_food.json +++ b/data/json/recipes/recipe_food.json @@ -1045,17 +1045,6 @@ "tools": [ [ [ "surface_heat", 5, "LIST" ] ], [ [ "rock_quern", -1 ], [ "clay_quern", -1 ], [ "food_processor", 20 ] ] ], "components": [ [ [ "acorns", 1 ] ], [ [ "water", 2 ], [ "water_clean", 2 ] ] ] }, - { - "type": "recipe", - "result": "cooked_burrito", - "category": "CC_FOOD", - "subcategory": "CSC_FOOD_SNACK", - "skill_used": "cooking", - "time": "2 m", - "autolearn": true, - "tools": [ [ [ "surface_heat", 3, "LIST" ] ] ], - "components": [ [ [ "frozen_burrito", 1 ] ] ] - }, { "type": "recipe", "result": "cooked_dinner", @@ -3045,34 +3034,6 @@ "tools": [ [ [ "surface_heat", 5, "LIST" ] ] ], "components": [ [ [ "pinecone", 1 ] ] ] }, - { - "type": "recipe", - "result": "peanut_unshelled", - "category": "CC_FOOD", - "subcategory": "CSC_FOOD_VEGGI", - "skill_used": "survival", - "difficulty": 1, - "charges": 1, - "time": "6 m", - "autolearn": true, - "flags": [ "BLIND_EASY" ], - "qualities": [ { "id": "HAMMER", "level": 1 } ], - "components": [ [ [ "peanut", 1 ] ] ] - }, - { - "type": "recipe", - "result": "walnut_unshelled", - "category": "CC_FOOD", - "subcategory": "CSC_FOOD_VEGGI", - "skill_used": "survival", - "difficulty": 1, - "charges": 1, - "time": "6 m", - "autolearn": true, - "flags": [ "BLIND_EASY" ], - "qualities": [ { "id": "HAMMER", "level": 1 } ], - "components": [ [ [ "walnut", 1 ] ] ] - }, { "type": "recipe", "result": "walnut_roasted", @@ -3118,20 +3079,6 @@ "tools": [ [ [ "surface_heat", 5, "LIST" ] ] ], "components": [ [ [ "raw_edamame", 1 ] ] ] }, - { - "type": "recipe", - "result": "pecan_unshelled", - "category": "CC_FOOD", - "subcategory": "CSC_FOOD_VEGGI", - "skill_used": "survival", - "difficulty": 1, - "charges": 1, - "time": "6 m", - "autolearn": true, - "flags": [ "BLIND_EASY" ], - "qualities": [ { "id": "HAMMER", "level": 1 } ], - "components": [ [ [ "pecan", 1 ] ] ] - }, { "type": "recipe", "result": "pecan_roasted", @@ -3147,20 +3094,6 @@ "tools": [ [ [ "surface_heat", 5, "LIST" ] ] ], "components": [ [ [ "pecan_unshelled", 1 ] ] ] }, - { - "type": "recipe", - "result": "pistachio_unshelled", - "category": "CC_FOOD", - "subcategory": "CSC_FOOD_VEGGI", - "skill_used": "survival", - "difficulty": 1, - "charges": 1, - "time": "6 m", - "autolearn": true, - "flags": [ "BLIND_EASY" ], - "qualities": [ { "id": "HAMMER", "level": 1 } ], - "components": [ [ [ "pistachio", 1 ] ] ] - }, { "type": "recipe", "result": "pistachio_roasted", @@ -3176,20 +3109,6 @@ "tools": [ [ [ "surface_heat", 5, "LIST" ] ] ], "components": [ [ [ "pistachio_unshelled", 1 ] ] ] }, - { - "type": "recipe", - "result": "almond_unshelled", - "category": "CC_FOOD", - "subcategory": "CSC_FOOD_VEGGI", - "skill_used": "survival", - "difficulty": 1, - "charges": 1, - "time": "6 m", - "autolearn": true, - "flags": [ "BLIND_EASY" ], - "qualities": [ { "id": "HAMMER", "level": 1 } ], - "components": [ [ [ "almond", 1 ] ] ] - }, { "type": "recipe", "result": "almond_roasted", @@ -3205,20 +3124,6 @@ "tools": [ [ [ "surface_heat", 5, "LIST" ] ] ], "components": [ [ [ "almond_unshelled", 1 ] ] ] }, - { - "type": "recipe", - "result": "chestnut_unshelled", - "category": "CC_FOOD", - "subcategory": "CSC_FOOD_VEGGI", - "skill_used": "survival", - "difficulty": 1, - "charges": 1, - "time": "6 m", - "autolearn": true, - "flags": [ "BLIND_EASY" ], - "qualities": [ { "id": "HAMMER", "level": 1 } ], - "components": [ [ [ "chestnut", 1 ] ] ] - }, { "type": "recipe", "result": "chestnut_roasted", @@ -3234,20 +3139,6 @@ "tools": [ [ [ "surface_heat", 5, "LIST" ] ] ], "components": [ [ [ "chestnut_unshelled", 1 ] ] ] }, - { - "type": "recipe", - "result": "hazelnut_unshelled", - "category": "CC_FOOD", - "subcategory": "CSC_FOOD_VEGGI", - "skill_used": "survival", - "difficulty": 1, - "charges": 1, - "time": "6 m", - "autolearn": true, - "flags": [ "BLIND_EASY" ], - "qualities": [ { "id": "HAMMER", "level": 1 } ], - "components": [ [ [ "hazelnut", 1 ] ] ] - }, { "type": "recipe", "result": "hazelnut_roasted", @@ -3278,20 +3169,6 @@ "tools": [ [ [ "surface_heat", 5, "LIST" ] ] ], "components": [ [ [ "acorns", 1 ] ] ] }, - { - "type": "recipe", - "result": "hickory_nut_unshelled", - "category": "CC_FOOD", - "subcategory": "CSC_FOOD_VEGGI", - "skill_used": "survival", - "difficulty": 1, - "charges": 1, - "time": "6 m", - "autolearn": true, - "flags": [ "BLIND_EASY" ], - "qualities": [ { "id": "HAMMER", "level": 1 } ], - "components": [ [ [ "hickory_nut", 1 ] ] ] - }, { "type": "recipe", "result": "hickory_nut_roasted", @@ -4711,25 +4588,6 @@ [ [ "salt_water", 1 ], [ "saline", 1 ], [ "salt", 2 ], [ "chem_saltpetre", 1 ] ] ] }, - { - "type": "recipe", - "result": "bag_meat_vac", - "obsolete": true, - "category": "CC_FOOD", - "subcategory": "CSC_FOOD_MEAT", - "skill_used": "cooking", - "difficulty": 4, - "time": "20 m", - "autolearn": true, - "qualities": [ { "id": "CUT", "level": 1 }, { "id": "COOK", "level": 3 } ], - "tools": [ [ [ "vac_sealer", 10 ], [ "makeshift_sealer", 20 ] ] ], - "components": [ - [ [ "water", 1 ], [ "water_clean", 1 ] ], - [ [ "bag_plastic", 1 ] ], - [ [ "meat", 1 ] ], - [ [ "salt_water", 1 ], [ "saline", 1 ], [ "salt", 2 ], [ "chem_saltpetre", 1 ] ] - ] - }, { "type": "recipe", "result": "salted_fish", @@ -4751,25 +4609,6 @@ [ [ "salt_water", 1 ], [ "saline", 1 ], [ "salt", 1 ], [ "chem_saltpetre", 1 ] ] ] }, - { - "type": "recipe", - "result": "bag_fish_vac", - "obsolete": true, - "category": "CC_FOOD", - "subcategory": "CSC_FOOD_MEAT", - "skill_used": "cooking", - "difficulty": 4, - "time": "20 m", - "autolearn": true, - "qualities": [ { "id": "CUT", "level": 1 }, { "id": "COOK", "level": 3 } ], - "tools": [ [ [ "vac_sealer", 10 ], [ "makeshift_sealer", 20 ] ] ], - "components": [ - [ [ "water", 1 ], [ "water_clean", 1 ] ], - [ [ "bag_plastic", 1 ] ], - [ [ "fish", 1 ] ], - [ [ "salt_water", 1 ], [ "saline", 1 ], [ "salt", 1 ], [ "chem_saltpetre", 1 ] ] - ] - }, { "type": "recipe", "result": "hflesh_salted", @@ -4791,25 +4630,6 @@ [ [ "salt_water", 1 ], [ "saline", 1 ], [ "salt", 2 ], [ "chem_saltpetre", 1 ] ] ] }, - { - "type": "recipe", - "result": "bag_hflesh_vac", - "obsolete": true, - "category": "CC_FOOD", - "subcategory": "CSC_FOOD_MEAT", - "skill_used": "cooking", - "difficulty": 4, - "time": "20 m", - "book_learn": [ [ "cookbook_human", 4 ] ], - "qualities": [ { "id": "CUT", "level": 1 }, { "id": "COOK", "level": 3 } ], - "tools": [ [ [ "vac_sealer", 10 ], [ "makeshift_sealer", 20 ] ] ], - "components": [ - [ [ "water", 1 ], [ "water_clean", 1 ] ], - [ [ "bag_plastic", 1 ] ], - [ [ "human_flesh", 1 ] ], - [ [ "salt_water", 1 ], [ "saline", 1 ], [ "salt", 2 ], [ "chem_saltpetre", 1 ] ] - ] - }, { "type": "recipe", "result": "veggy_salted", @@ -4831,25 +4651,6 @@ [ [ "salt_water", 1 ], [ "saline", 1 ], [ "salt", 2 ], [ "chem_saltpetre", 1 ] ] ] }, - { - "type": "recipe", - "result": "bag_veggy_vac", - "obsolete": true, - "category": "CC_FOOD", - "subcategory": "CSC_FOOD_VEGGI", - "skill_used": "cooking", - "difficulty": 4, - "time": "20 m", - "autolearn": true, - "qualities": [ { "id": "CUT", "level": 1 }, { "id": "COOK", "level": 3 } ], - "tools": [ [ [ "vac_sealer", 10 ], [ "makeshift_sealer", 20 ] ] ], - "components": [ - [ [ "water", 1 ], [ "water_clean", 1 ] ], - [ [ "bag_plastic", 1 ] ], - [ [ "mushroom", 1 ], [ "veggy_any_uncooked", 1, "LIST" ] ], - [ [ "salt_water", 1 ], [ "saline", 1 ], [ "salt", 2 ], [ "chem_saltpetre", 1 ] ] - ] - }, { "type": "recipe", "result": "apple_sugar", @@ -4870,25 +4671,6 @@ [ [ "sugar", 8 ] ] ] }, - { - "type": "recipe", - "result": "bag_apple_vac", - "obsolete": true, - "category": "CC_FOOD", - "subcategory": "CSC_FOOD_VEGGI", - "skill_used": "cooking", - "difficulty": 4, - "time": "20 m", - "autolearn": true, - "qualities": [ { "id": "CUT", "level": 1 }, { "id": "COOK", "level": 3 } ], - "tools": [ [ [ "vac_sealer", 5 ], [ "makeshift_sealer", 10 ] ] ], - "components": [ - [ [ "water", 1 ], [ "water_clean", 1 ] ], - [ [ "bag_plastic", 1 ] ], - [ [ "sweet_fruit", 1, "LIST" ] ], - [ [ "sugar", 2 ] ] - ] - }, { "type": "recipe", "result": "kompot", @@ -8666,5 +8448,41 @@ "qualities": [ { "id": "CUT", "level": 1 }, { "id": "COOK", "level": 1 } ], "tools": [ [ [ "surface_heat", 8, "LIST" ] ] ], "components": [ [ [ "cactus_pad", 3 ] ] ] + }, + { + "type": "recipe", + "result": "homemade_burrito", + "category": "CC_FOOD", + "subcategory": "CSC_FOOD_MEAT", + "skill_used": "cooking", + "difficulty": 4, + "charges": 3, + "time": "30 m", + "autolearn": true, + "qualities": [ { "id": "CUT", "level": 1 }, { "id": "COOK", "level": 2 } ], + "tools": [ [ [ "surface_heat", 10, "LIST" ] ] ], + "components": [ + [ [ "meat", 1 ], [ "dry_meat", 1 ], [ "can_chicken", 1 ], [ "meat_smoked", 1 ] ], + [ [ "tortilla_corn", 3 ] ], + [ + [ "dry_beans", 1 ], + [ "raw_beans", 1 ], + [ "dry_lentils", 1 ], + [ "raw_lentils", 1 ], + [ "dry_rice", 1 ], + [ "can_beans", 1 ], + [ "beans_cooked", 1 ] + ], + [ + [ "lettuce", 2 ], + [ "irradiated_lettuce", 2 ], + [ "dandelion_cooked", 2 ], + [ "veggy_wild_cooked", 2 ], + [ "irradiated_cabbage", 2 ], + [ "cabbage", 2 ] + ], + [ [ "tomato", 1 ], [ "irradiated_tomato", 1 ], [ "can_tomato", 1 ], [ "onion", 1 ], [ "irradiated_onion", 1 ] ], + [ [ "pepper", 20 ], [ "chilly-p", 20 ], [ "garlic_clove", 6 ], [ "chili_pepper", 2 ] ] + ] } ] diff --git a/data/json/recipes/recipe_obsolete.json b/data/json/recipes/recipe_obsolete.json new file mode 100644 index 0000000000000..f0761356ae3d5 --- /dev/null +++ b/data/json/recipes/recipe_obsolete.json @@ -0,0 +1,1789 @@ +[ + { + "type": "recipe", + "result": "spear_stone", + "obsolete": true + }, + { + "type": "recipe", + "result": "cooked_burrito", + "obsolete": true + }, + { + "type": "recipe", + "result": "bolt_steel_bodkin", + "obsolete": true + }, + { + "type": "recipe", + "result": "arrow_metal_bodkin", + "obsolete": true + }, + { + "type": "recipe", + "result": "arrow_metal_target", + "obsolete": true + }, + { + "type": "recipe", + "result": "arrow_metal", + "obsolete": true + }, + { + "type": "recipe", + "result": "bolt_steel", + "obsolete": true + }, + { + "type": "recipe", + "result": "bolt_steel_target", + "obsolete": true + }, + { + "type": "recipe", + "result": "lightstrip_inactive", + "obsolete": true + }, + { + "type": "recipe", + "result": "lightstrip_dead", + "obsolete": true + }, + { + "type": "recipe", + "result": "milk", + "id_suffix": "from_powder", + "obsolete": true + }, + { + "type": "recipe", + "result": "milk", + "id_suffix": "from_condensed", + "obsolete": true + }, + { + "type": "recipe", + "result": "offal_cooked", + "obsolete": true + }, + { + "type": "recipe", + "result": "30gal_drum", + "obsolete": true + }, + { + "type": "recipe", + "result": "55gal_drum", + "obsolete": true + }, + { + "type": "recipe", + "result": "anesthesia", + "obsolete": true + }, + { + "type": "recipe", + "result": "reloaded_10mm", + "obsolete": true + }, + { + "type": "recipe", + "result": "scythe_war", + "obsolete": true + }, + { + "type": "recipe", + "result": "laser_sight", + "obsolete": true + }, + { + "type": "recipe", + "result": "rail_laser_sight", + "obsolete": true + }, + { + "type": "recipe", + "result": "goggles_nv", + "obsolete": true + }, + { + "type": "recipe", + "result": "goggles_ir", + "obsolete": true + }, + { + "type": "recipe", + "result": "diesel", + "obsolete": true + }, + { + "type": "recipe", + "result": "battery_compartment", + "obsolete": true + }, + { + "type": "recipe", + "result": "battery_atomic", + "obsolete": true + }, + { + "type": "recipe", + "result": "grenade", + "obsolete": true + }, + { + "type": "recipe", + "result": "peanut_unshelled", + "obsolete": true + }, + { + "type": "recipe", + "result": "walnut_unshelled", + "obsolete": true + }, + { + "type": "recipe", + "result": "pecan_unshelled", + "obsolete": true + }, + { + "type": "recipe", + "result": "pistachio_unshelled", + "obsolete": true + }, + { + "type": "recipe", + "result": "almond_unshelled", + "obsolete": true + }, + { + "type": "recipe", + "result": "chestnut_unshelled", + "obsolete": true + }, + { + "type": "recipe", + "result": "hazelnut_unshelled", + "obsolete": true + }, + { + "type": "recipe", + "result": "hickory_nut_unshelled", + "obsolete": true + }, + { + "type": "recipe", + "result": "bag_meat_vac", + "obsolete": true + }, + { + "type": "recipe", + "result": "bag_fish_vac", + "obsolete": true + }, + { + "type": "recipe", + "result": "bag_hflesh_vac", + "obsolete": true + }, + { + "type": "recipe", + "result": "bag_veggy_vac", + "obsolete": true + }, + { + "type": "recipe", + "result": "bag_apple_vac", + "obsolete": true + }, + { + "type": "recipe", + "result": "1st_aid", + "obsolete": true + }, + { + "type": "recipe", + "result": "20x66_bootleg_flechette", + "obsolete": true + }, + { + "type": "recipe", + "result": "20x66_bootleg_shot", + "obsolete": true + }, + { + "type": "recipe", + "result": "20x66_bootleg_slug", + "obsolete": true + }, + { + "type": "recipe", + "result": "2x4", + "obsolete": true + }, + { + "type": "recipe", + "result": "40mm_acidbomb", + "obsolete": true + }, + { + "type": "recipe", + "result": "8mm_bootleg", + "obsolete": true + }, + { + "type": "recipe", + "result": "8mm_bootleg_jsp", + "obsolete": true + }, + { + "type": "recipe", + "result": "acidfrom batteries", + "obsolete": true + }, + { + "type": "recipe", + "result": "alarmclockuncraft", + "obsolete": true + }, + { + "type": "recipe", + "result": "armor_bone", + "obsolete": true + }, + { + "type": "recipe", + "result": "arrow_field_point", + "obsolete": true + }, + { + "type": "recipe", + "result": "arrow_fire_hardened", + "obsolete": true + }, + { + "type": "recipe", + "result": "arrow_heavy_field_point", + "obsolete": true + }, + { + "type": "recipe", + "result": "arrow_heavy_fire_hardened", + "obsolete": true + }, + { + "type": "recipe", + "result": "arrow_metal_sharpened", + "obsolete": true + }, + { + "type": "recipe", + "result": "arrow_small_game", + "obsolete": true + }, + { + "type": "recipe", + "result": "arrowhead", + "obsolete": true + }, + { + "type": "recipe", + "result": "arrowhead_plastic", + "obsolete": true + }, + { + "type": "recipe", + "result": "badge_deputyuncraft", + "obsolete": true + }, + { + "type": "recipe", + "result": "bag_bundle_10", + "obsolete": true + }, + { + "type": "recipe", + "result": "barrel_small", + "obsolete": true + }, + { + "type": "recipe", + "result": "baseballuncraft", + "obsolete": true + }, + { + "type": "recipe", + "result": "battery", + "obsolete": true + }, + { + "type": "recipe", + "result": "battery_truck", + "obsolete": true + }, + { + "type": "recipe", + "result": "battletorch_doneuncraft", + "obsolete": true + }, + { + "type": "recipe", + "result": "bayonet", + "obsolete": true + }, + { + "type": "recipe", + "result": "beret_woolknitting", + "obsolete": true + }, + { + "type": "recipe", + "result": "bindleuncraft", + "obsolete": true + }, + { + "type": "recipe", + "result": "binocularsuncraft", + "obsolete": true + }, + { + "type": "recipe", + "result": "bio_batteries", + "obsolete": true + }, + { + "type": "recipe", + "result": "bio_blood_filteruncraft", + "obsolete": true + }, + { + "type": "recipe", + "result": "bio_digestionuncraft", + "obsolete": true + }, + { + "type": "recipe", + "result": "bio_evap", + "obsolete": true + }, + { + "type": "recipe", + "result": "bio_face_maskuncraft", + "obsolete": true + }, + { + "type": "recipe", + "result": "bio_flashlight", + "obsolete": true + }, + { + "type": "recipe", + "result": "bio_ground_sonaruncraft", + "obsolete": true + }, + { + "type": "recipe", + "result": "bio_laser", + "obsolete": true + }, + { + "type": "recipe", + "result": "bio_metabolicsuncraft", + "obsolete": true + }, + { + "type": "recipe", + "result": "bio_nanobotsuncraft", + "obsolete": true + }, + { + "type": "recipe", + "result": "bio_power_armor_interface", + "obsolete": true + }, + { + "type": "recipe", + "result": "bio_power_armor_interface_mkII", + "obsolete": true + }, + { + "type": "recipe", + "result": "bio_power_storage", + "obsolete": true + }, + { + "type": "recipe", + "result": "bio_power_storage_mkII", + "obsolete": true + }, + { + "type": "recipe", + "result": "bio_recycleruncraft", + "obsolete": true + }, + { + "type": "recipe", + "result": "bio_solar", + "obsolete": true + }, + { + "type": "recipe", + "result": "bio_water_extractor", + "obsolete": true + }, + { + "type": "recipe", + "result": "bladefrom steel", + "obsolete": true + }, + { + "type": "recipe", + "result": "blazerknitting", + "obsolete": true + }, + { + "type": "recipe", + "result": "blowgun", + "obsolete": true + }, + { + "type": "recipe", + "result": "blueberries_cooked", + "obsolete": true + }, + { + "type": "recipe", + "result": "boobytrapclosed_cans_such_as_drinks", + "obsolete": true + }, + { + "type": "recipe", + "result": "boobytrapopen_cans_such_as_food", + "obsolete": true + }, + { + "type": "recipe", + "result": "boots_bone", + "obsolete": true + }, + { + "type": "recipe", + "result": "boots_winterknitting", + "obsolete": true + }, + { + "type": "recipe", + "result": "bowl_pewteruncraft", + "obsolete": true + }, + { + "type": "recipe", + "result": "brew_bum_wine", + "obsolete": true + }, + { + "type": "recipe", + "result": "brew_fruit_winefrom_berries", + "obsolete": true + }, + { + "type": "recipe", + "result": "broken_copbot", + "obsolete": true + }, + { + "type": "recipe", + "result": "broken_eyebot", + "obsolete": true + }, + { + "type": "recipe", + "result": "broken_manhack", + "obsolete": true + }, + { + "type": "recipe", + "result": "broken_molebot", + "obsolete": true + }, + { + "type": "recipe", + "result": "broken_riotbot", + "obsolete": true + }, + { + "type": "recipe", + "result": "broken_skitterbot", + "obsolete": true + }, + { + "type": "recipe", + "result": "broken_tankbot", + "obsolete": true + }, + { + "type": "recipe", + "result": "broken_tripod", + "obsolete": true + }, + { + "type": "recipe", + "result": "caltropsfrom wire", + "obsolete": true + }, + { + "type": "recipe", + "result": "camera_prouncraft", + "obsolete": true + }, + { + "type": "recipe", + "result": "camerauncraft", + "obsolete": true + }, + { + "type": "recipe", + "result": "candlestickuncraft", + "obsolete": true + }, + { + "type": "recipe", + "result": "cell_phoneuncraft", + "obsolete": true + }, + { + "type": "recipe", + "result": "ceramic_bowluncraft", + "obsolete": true + }, + { + "type": "recipe", + "result": "ceramic_cupuncraft", + "obsolete": true + }, + { + "type": "recipe", + "result": "ceramic_plateuncraft", + "obsolete": true + }, + { + "type": "recipe", + "result": "char_purifieruncraft", + "obsolete": true + }, + { + "type": "recipe", + "result": "charcoal", + "obsolete": true + }, + { + "type": "recipe", + "result": "clockuncraft", + "obsolete": true + }, + { + "type": "recipe", + "result": "copper_braceletuncraft", + "obsolete": true + }, + { + "type": "recipe", + "result": "copper_earuncraft", + "obsolete": true + }, + { + "type": "recipe", + "result": "cotton_ballby hand", + "obsolete": true + }, + { + "type": "recipe", + "result": "cowl_woolknitting", + "obsolete": true + }, + { + "type": "recipe", + "result": "creepy_dolluncraft", + "obsolete": true + }, + { + "type": "recipe", + "result": "crude_brick", + "obsolete": true + }, + { + "type": "recipe", + "result": "cured_hidescraped", + "obsolete": true + }, + { + "type": "recipe", + "result": "dart", + "obsolete": true + }, + { + "type": "recipe", + "result": "diamond_bayonet", + "obsolete": true + }, + { + "type": "recipe", + "result": "diamond_broadsword", + "obsolete": true + }, + { + "type": "recipe", + "result": "diamond_dental_grilluncraft", + "obsolete": true + }, + { + "type": "recipe", + "result": "diamond_katana", + "obsolete": true + }, + { + "type": "recipe", + "result": "diamond_knife", + "obsolete": true + }, + { + "type": "recipe", + "result": "diamond_kukri", + "obsolete": true + }, + { + "type": "recipe", + "result": "diamond_machete", + "obsolete": true + }, + { + "type": "recipe", + "result": "diamond_nodachi", + "obsolete": true + }, + { + "type": "recipe", + "result": "diamond_pistol_bayonet", + "obsolete": true + }, + { + "type": "recipe", + "result": "diamond_rapier", + "obsolete": true + }, + { + "type": "recipe", + "result": "diamond_ringuncraft", + "obsolete": true + }, + { + "type": "recipe", + "result": "diamond_sword_bayonet", + "obsolete": true + }, + { + "type": "recipe", + "result": "diamond_wakizashi", + "obsolete": true + }, + { + "type": "recipe", + "result": "diamond_zweihander", + "obsolete": true + }, + { + "type": "recipe", + "result": "down_blanketuncraft", + "obsolete": true + }, + { + "type": "recipe", + "result": "down_pillowuncraft", + "obsolete": true + }, + { + "type": "recipe", + "result": "dynamite_radio", + "obsolete": true + }, + { + "type": "recipe", + "result": "eink_tablet_pcuncraft", + "obsolete": true + }, + { + "type": "recipe", + "result": "fanuncraft", + "obsolete": true + }, + { + "type": "recipe", + "result": "felt_patchuncraft", + "obsolete": true + }, + { + "type": "recipe", + "result": "fileuncraft", + "obsolete": true + }, + { + "type": "recipe", + "result": "fish_bait_bread", + "obsolete": true + }, + { + "type": "recipe", + "result": "fish_bait_fish", + "obsolete": true + }, + { + "type": "recipe", + "result": "fish_bait_meat", + "obsolete": true + }, + { + "type": "recipe", + "result": "fish_bait_veggy", + "obsolete": true + }, + { + "type": "recipe", + "result": "fletching", + "obsolete": true + }, + { + "type": "recipe", + "result": "fletchingmakeshift", + "obsolete": true + }, + { + "type": "recipe", + "result": "flyeruncraft", + "obsolete": true + }, + { + "type": "recipe", + "result": "foonuncraft", + "obsolete": true + }, + { + "type": "recipe", + "result": "footballuncraft", + "obsolete": true + }, + { + "type": "recipe", + "result": "forkuncraft", + "obsolete": true + }, + { + "type": "recipe", + "result": "gasbomb", + "obsolete": true + }, + { + "type": "recipe", + "result": "gasoline", + "obsolete": true + }, + { + "type": "recipe", + "result": "gauntlets_bone", + "obsolete": true + }, + { + "type": "recipe", + "result": "glass_bowluncraft", + "obsolete": true + }, + { + "type": "recipe", + "result": "glass_plateuncraft", + "obsolete": true + }, + { + "type": "recipe", + "result": "glassuncraft", + "obsolete": true + }, + { + "type": "recipe", + "result": "gloves_fingerlessfrom patches", + "obsolete": true + }, + { + "type": "recipe", + "result": "gloves_woolknitting", + "obsolete": true + }, + { + "type": "recipe", + "result": "gobag", + "obsolete": true + }, + { + "type": "recipe", + "result": "gold_braceletuncraft", + "obsolete": true + }, + { + "type": "recipe", + "result": "gold_dental_grilluncraft", + "obsolete": true + }, + { + "type": "recipe", + "result": "gold_earuncraft", + "obsolete": true + }, + { + "type": "recipe", + "result": "gold_watchuncraft", + "obsolete": true + }, + { + "type": "recipe", + "result": "golduncraft", + "obsolete": true + }, + { + "type": "recipe", + "result": "gunpowder", + "obsolete": true + }, + { + "type": "recipe", + "result": "hat_huntingknitting", + "obsolete": true + }, + { + "type": "recipe", + "result": "hat_knitknitting", + "obsolete": true + }, + { + "type": "recipe", + "result": "hd_steel_drum", + "obsolete": true + }, + { + "type": "recipe", + "result": "heavy_snare_kit", + "obsolete": true + }, + { + "type": "recipe", + "result": "helmet_bone", + "obsolete": true + }, + { + "type": "recipe", + "result": "helmet_netting", + "obsolete": true + }, + { + "type": "recipe", + "result": "honey_bottledfrom_honey_glassed", + "obsolete": true + }, + { + "type": "recipe", + "result": "honey_bottledfrom_honeycomb", + "obsolete": true + }, + { + "type": "recipe", + "result": "inhaler_sewergas", + "obsolete": true + }, + { + "type": "recipe", + "result": "jam_blueberries", + "obsolete": true + }, + { + "type": "recipe", + "result": "jam_strawberries", + "obsolete": true + }, + { + "type": "recipe", + "result": "jar_V8", + "obsolete": true + }, + { + "type": "recipe", + "result": "jar_apple_canned", + "obsolete": true + }, + { + "type": "recipe", + "result": "jar_broth", + "obsolete": true + }, + { + "type": "recipe", + "result": "jar_broth_bone", + "obsolete": true + }, + { + "type": "recipe", + "result": "jar_fish_canned", + "obsolete": true + }, + { + "type": "recipe", + "result": "jar_fish_pickled", + "obsolete": true + }, + { + "type": "recipe", + "result": "jar_human_canned", + "obsolete": true + }, + { + "type": "recipe", + "result": "jar_human_pickled", + "obsolete": true + }, + { + "type": "recipe", + "result": "jar_kompot", + "obsolete": true + }, + { + "type": "recipe", + "result": "jar_meat_canned", + "obsolete": true + }, + { + "type": "recipe", + "result": "jar_meat_pickled", + "obsolete": true + }, + { + "type": "recipe", + "result": "jar_soup_fish", + "obsolete": true + }, + { + "type": "recipe", + "result": "jar_soup_human", + "obsolete": true + }, + { + "type": "recipe", + "result": "jar_soup_meat", + "obsolete": true + }, + { + "type": "recipe", + "result": "jar_soup_veggy", + "obsolete": true + }, + { + "type": "recipe", + "result": "jar_soup_woods", + "obsolete": true + }, + { + "type": "recipe", + "result": "jar_tomato_canned", + "obsolete": true + }, + { + "type": "recipe", + "result": "jar_veggy_canned", + "obsolete": true + }, + { + "type": "recipe", + "result": "jar_veggy_pickled", + "obsolete": true + }, + { + "type": "recipe", + "result": "jug_plasticplastic-mod", + "obsolete": true + }, + { + "type": "recipe", + "result": "jumpsuit_xlfrom_jumpsuit", + "obsolete": true + }, + { + "type": "recipe", + "result": "kiln_done", + "obsolete": true + }, + { + "type": "recipe", + "result": "knife_steakuncraft", + "obsolete": true + }, + { + "type": "recipe", + "result": "l_HFPackuncraft", + "obsolete": true + }, + { + "type": "recipe", + "result": "laptop", + "obsolete": true + }, + { + "type": "recipe", + "result": "lawnmoweruncraft", + "obsolete": true + }, + { + "type": "recipe", + "result": "lead", + "obsolete": true + }, + { + "type": "recipe", + "result": "lead_plate", + "obsolete": true + }, + { + "type": "recipe", + "result": "light_snare_kit", + "obsolete": true + }, + { + "type": "recipe", + "result": "lighteruncraft", + "obsolete": true + }, + { + "type": "recipe", + "result": "lightstrip_deaduncraft", + "obsolete": true + }, + { + "type": "recipe", + "result": "locketuncraft", + "obsolete": true + }, + { + "type": "recipe", + "result": "makeshift_crowbaruncraft", + "obsolete": true + }, + { + "type": "recipe", + "result": "makeshift_slinguncraft", + "obsolete": true + }, + { + "type": "recipe", + "result": "many_years_old_newspaperuncraft", + "obsolete": true + }, + { + "type": "recipe", + "result": "mask_gas_xlexpand-existing", + "obsolete": true + }, + { + "type": "recipe", + "result": "mask_skiknitting", + "obsolete": true + }, + { + "type": "recipe", + "result": "material_shrd_limestoneuncraft", + "obsolete": true + }, + { + "type": "recipe", + "result": "mess_kituncraft", + "obsolete": true + }, + { + "type": "recipe", + "result": "metal_tank_small", + "obsolete": true + }, + { + "type": "recipe", + "result": "microwave", + "obsolete": true + }, + { + "type": "recipe", + "result": "mil_mess_kituncraft", + "obsolete": true + }, + { + "type": "recipe", + "result": "militarymapuncraft", + "obsolete": true + }, + { + "type": "recipe", + "result": "milkfrom powder", + "obsolete": true + }, + { + "type": "recipe", + "result": "mininuke", + "obsolete": true + }, + { + "type": "recipe", + "result": "mirrorfrom_steel", + "obsolete": true + }, + { + "type": "recipe", + "result": "mittensknitting", + "obsolete": true + }, + { + "type": "recipe", + "result": "months_old_newspaperuncraft", + "obsolete": true + }, + { + "type": "recipe", + "result": "mre_beef_boxuncraft", + "obsolete": true + }, + { + "type": "recipe", + "result": "mre_chicken_boxuncraft", + "obsolete": true + }, + { + "type": "recipe", + "result": "mre_hotdog_boxuncraft", + "obsolete": true + }, + { + "type": "recipe", + "result": "mre_ravioli_boxuncraft", + "obsolete": true + }, + { + "type": "recipe", + "result": "mre_veggy_boxuncraft", + "obsolete": true + }, + { + "type": "recipe", + "result": "multi_cookeruncraft", + "obsolete": true + }, + { + "type": "recipe", + "result": "necklaceuncraft", + "obsolete": true + }, + { + "type": "recipe", + "result": "newest_newspaperuncraft", + "obsolete": true + }, + { + "type": "recipe", + "result": "noise_emitterfrom-scratch", + "obsolete": true + }, + { + "type": "recipe", + "result": "noise_emitterradio-mod", + "obsolete": true + }, + { + "type": "recipe", + "result": "nx17", + "obsolete": true + }, + { + "type": "recipe", + "result": "omnicamerafrom-eyebots", + "obsolete": true + }, + { + "type": "recipe", + "result": "omnicamerafrom-scratch", + "obsolete": true + }, + { + "type": "recipe", + "result": "one_year_old_newspaperuncraft", + "obsolete": true + }, + { + "type": "recipe", + "result": "pdauncraft", + "obsolete": true + }, + { + "type": "recipe", + "result": "peacoatknitting", + "obsolete": true + }, + { + "type": "recipe", + "result": "pillowuncraft", + "obsolete": true + }, + { + "type": "recipe", + "result": "pipe_shotgunsawn", + "obsolete": true + }, + { + "type": "recipe", + "result": "pipebomb_radio", + "obsolete": true + }, + { + "type": "recipe", + "result": "pipeuncraft", + "obsolete": true + }, + { + "type": "recipe", + "result": "plastic_chunkfrom_milk", + "obsolete": true + }, + { + "type": "recipe", + "result": "plastic_chunkfrom_plastic_bags", + "obsolete": true + }, + { + "type": "recipe", + "result": "pocketwatchuncraft", + "obsolete": true + }, + { + "type": "recipe", + "result": "ponchoknitting", + "obsolete": true + }, + { + "type": "recipe", + "result": "power_armor_basic", + "obsolete": true + }, + { + "type": "recipe", + "result": "power_armor_helmet_basic", + "obsolete": true + }, + { + "type": "recipe", + "result": "processoruncraft", + "obsolete": true + }, + { + "type": "recipe", + "result": "radio_car_boxuncraft", + "obsolete": true + }, + { + "type": "recipe", + "result": "ragknitting", + "obsolete": true + }, + { + "type": "recipe", + "result": "raguncraft", + "obsolete": true + }, + { + "type": "recipe", + "result": "rebreather_xlmod_existing", + "obsolete": true + }, + { + "type": "recipe", + "result": "rechargeable_battery", + "obsolete": true + }, + { + "type": "recipe", + "result": "ref_lighteruncraft", + "obsolete": true + }, + { + "type": "recipe", + "result": "reloaded_40mm_flechette", + "obsolete": true + }, + { + "type": "recipe", + "result": "reloaded_40mm_shot", + "obsolete": true + }, + { + "type": "recipe", + "result": "reloaded_shot_beanbag", + "obsolete": true + }, + { + "type": "recipe", + "result": "reloaded_shot_he", + "obsolete": true + }, + { + "type": "recipe", + "result": "reloaded_signal_flare", + "obsolete": true + }, + { + "type": "recipe", + "result": "restaurantmapuncraft", + "obsolete": true + }, + { + "type": "recipe", + "result": "ringuncraft", + "obsolete": true + }, + { + "type": "recipe", + "result": "roadmapuncraft", + "obsolete": true + }, + { + "type": "recipe", + "result": "robot_controls", + "obsolete": true + }, + { + "type": "recipe", + "result": "rope_6from_cloth", + "obsolete": true + }, + { + "type": "recipe", + "result": "rope_6from_string", + "obsolete": true + }, + { + "type": "recipe", + "result": "saiga_sawn", + "obsolete": true + }, + { + "type": "recipe", + "result": "saltfrom_salt_water", + "obsolete": true + }, + { + "type": "recipe", + "result": "scarf_fur_longmerge_scarves", + "obsolete": true + }, + { + "type": "recipe", + "result": "scarf_longknitting", + "obsolete": true + }, + { + "type": "recipe", + "result": "scarfknitting", + "obsolete": true + }, + { + "type": "recipe", + "result": "sf_watchuncraft", + "obsolete": true + }, + { + "type": "recipe", + "result": "shaft_metal", + "obsolete": true + }, + { + "type": "recipe", + "result": "shaft_plastic", + "obsolete": true + }, + { + "type": "recipe", + "result": "shaft_wood", + "obsolete": true + }, + { + "type": "recipe", + "result": "shaft_wood_heavy", + "obsolete": true + }, + { + "type": "recipe", + "result": "shelter_kitrepair", + "obsolete": true + }, + { + "type": "recipe", + "result": "shorts_denimfrom fabric", + "obsolete": true + }, + { + "type": "recipe", + "result": "shot_scrapbag", + "obsolete": true + }, + { + "type": "recipe", + "result": "shot_scrapslug", + "obsolete": true + }, + { + "type": "recipe", + "result": "shotgun_sawn", + "obsolete": true + }, + { + "type": "recipe", + "result": "silver_braceletuncraft", + "obsolete": true + }, + { + "type": "recipe", + "result": "silver_earuncraft", + "obsolete": true + }, + { + "type": "recipe", + "result": "silveruncraft", + "obsolete": true + }, + { + "type": "recipe", + "result": "sleeping_bag", + "obsolete": true + }, + { + "type": "recipe", + "result": "sleeping_bag_fur", + "obsolete": true + }, + { + "type": "recipe", + "result": "sleeveless_duster_furfrom_duster_fur", + "obsolete": true + }, + { + "type": "recipe", + "result": "sleeveless_duster_furfrom_fur", + "obsolete": true + }, + { + "type": "recipe", + "result": "sleeveless_duster_leatherfrom_duster_leather", + "obsolete": true + }, + { + "type": "recipe", + "result": "sleeveless_duster_leatherfrom_leather", + "obsolete": true + }, + { + "type": "recipe", + "result": "sleeveless_duster_survivorfrom_duster_survivor", + "obsolete": true + }, + { + "type": "recipe", + "result": "sleeveless_duster_survivorfrom_stuff", + "obsolete": true + }, + { + "type": "recipe", + "result": "sleeveless_dusterfrom_duster", + "obsolete": true + }, + { + "type": "recipe", + "result": "sleeveless_dusterfrom_rags", + "obsolete": true + }, + { + "type": "recipe", + "result": "sleeveless_trenchcoat_furfrom_fur", + "obsolete": true + }, + { + "type": "recipe", + "result": "sleeveless_trenchcoat_furfrom_trenchcoat_fur", + "obsolete": true + }, + { + "type": "recipe", + "result": "sleeveless_trenchcoat_leatherfrom_leather", + "obsolete": true + }, + { + "type": "recipe", + "result": "sleeveless_trenchcoat_leatherfrom_trenchcoat_leather", + "obsolete": true + }, + { + "type": "recipe", + "result": "sleeveless_trenchcoat_survivorfrom_stuff", + "obsolete": true + }, + { + "type": "recipe", + "result": "sleeveless_trenchcoat_survivorfrom_trenchcoat_survivor", + "obsolete": true + }, + { + "type": "recipe", + "result": "sleeveless_trenchcoatfrom_rags", + "obsolete": true + }, + { + "type": "recipe", + "result": "sleeveless_trenchcoatfrom_trenchcoat", + "obsolete": true + }, + { + "type": "recipe", + "result": "small_relicuncraft", + "obsolete": true + }, + { + "type": "recipe", + "result": "small_storage_battery", + "obsolete": true + }, + { + "type": "recipe", + "result": "snare_trigger", + "obsolete": true + }, + { + "type": "recipe", + "result": "socks_woolknitting", + "obsolete": true + }, + { + "type": "recipe", + "result": "spoonuncraft", + "obsolete": true + }, + { + "type": "recipe", + "result": "sporkuncraft", + "obsolete": true + }, + { + "type": "recipe", + "result": "stockings_tent_armsfrom_rags", + "obsolete": true + }, + { + "type": "recipe", + "result": "stockings_tent_armsfrom_stockings", + "obsolete": true + }, + { + "type": "recipe", + "result": "stockings_tent_legsfrom_rags", + "obsolete": true + }, + { + "type": "recipe", + "result": "stockings_tent_legsfrom_stockings", + "obsolete": true + }, + { + "type": "recipe", + "result": "straw_basketuncraft", + "obsolete": true + }, + { + "type": "recipe", + "result": "straw_dolluncraft", + "obsolete": true + }, + { + "type": "recipe", + "result": "straw_fedorauncraft", + "obsolete": true + }, + { + "type": "recipe", + "result": "straw_hatuncraft", + "obsolete": true + }, + { + "type": "recipe", + "result": "straw_sandalsuncraft", + "obsolete": true + }, + { + "type": "recipe", + "result": "strawberries_cooked", + "obsolete": true + }, + { + "type": "recipe", + "result": "sugarfrom_beets", + "obsolete": true + }, + { + "type": "recipe", + "result": "sugarfrom_sweet_water", + "obsolete": true + }, + { + "type": "recipe", + "result": "sugarfrom_sweets", + "obsolete": true + }, + { + "type": "recipe", + "result": "sugarfrom_wood", + "obsolete": true + }, + { + "type": "recipe", + "result": "survivormapuncraft", + "obsolete": true + }, + { + "type": "recipe", + "result": "survnoteuncraft", + "obsolete": true + }, + { + "type": "recipe", + "result": "sweaterknitting", + "obsolete": true + }, + { + "type": "recipe", + "result": "sword_forged", + "obsolete": true + }, + { + "type": "recipe", + "result": "talking_dolluncraft", + "obsolete": true + }, + { + "type": "recipe", + "result": "tank_topuncraft", + "obsolete": true + }, + { + "type": "recipe", + "result": "tanning_hidemodern", + "obsolete": true + }, + { + "type": "recipe", + "result": "tanning_peltmodern", + "obsolete": true + }, + { + "type": "recipe", + "result": "television", + "obsolete": true + }, + { + "type": "recipe", + "result": "thermal_outfitthermal_outfit_from_bits", + "obsolete": true + }, + { + "type": "recipe", + "result": "thermal_outfitthermal_outfit_from_scratch", + "obsolete": true + }, + { + "type": "recipe", + "result": "tieclipuncraft", + "obsolete": true + }, + { + "type": "recipe", + "result": "tin_plateuncraft", + "obsolete": true + }, + { + "type": "recipe", + "result": "toaster", + "obsolete": true + }, + { + "type": "recipe", + "result": "toolboxuncraft", + "obsolete": true + }, + { + "type": "recipe", + "result": "touristmapuncraft", + "obsolete": true + }, + { + "type": "recipe", + "result": "tshirtuncraft", + "obsolete": true + }, + { + "type": "recipe", + "result": "usb_driveuncraft", + "obsolete": true + }, + { + "type": "recipe", + "result": "v_table", + "obsolete": true + }, + { + "type": "recipe", + "result": "vac_sealeruncraft", + "obsolete": true + }, + { + "type": "recipe", + "result": "veh_tracker", + "obsolete": true + }, + { + "type": "recipe", + "result": "vest_leatherfrom_patches", + "obsolete": true + }, + { + "type": "recipe", + "result": "water_acidfrom electrolysis", + "obsolete": true + }, + { + "type": "recipe", + "result": "weeks_old_newspaperuncraft", + "obsolete": true + }, + { + "type": "recipe", + "result": "wool_hoodieknitting", + "obsolete": true + }, + { + "type": "recipe", + "result": "wool_suitknitting", + "obsolete": true + }, + { + "type": "recipe", + "result": "wristwatchuncraft", + "obsolete": true + }, + { + "type": "recipe", + "result": "years_old_newspaperuncraft", + "obsolete": true + } +] diff --git a/data/json/recipes/recipe_others.json b/data/json/recipes/recipe_others.json index 7864d9c943ebe..c85846d192f48 100644 --- a/data/json/recipes/recipe_others.json +++ b/data/json/recipes/recipe_others.json @@ -4475,5 +4475,33 @@ "autolearn": true, "qualities": [ { "id": "DIG", "level": 3 } ], "components": [ [ [ "bag_canvas", 1 ] ], [ [ "material_soil", 3 ] ] ] + }, + { + "result": "anvil_bronze", + "type": "recipe", + "category": "CC_OTHER", + "subcategory": "CSC_OTHER_TOOLS", + "skill_used": "fabrication", + "difficulty": 2, + "time": 100000, + "autolearn": true, + "using": [ [ "forging_standard", 5 ] ], + "qualities": [ { "id": "HAMMER", "level": 1 }, { "id": "ANVIL", "level": 1 } ], + "tools": [ [ [ "crucible", -1 ], [ "crucible_clay", -1 ] ] ], + "components": [ [ [ "scrap_bronze", 10 ] ] ] + }, + { + "result": "scrap_bronze", + "type": "recipe", + "category": "CC_OTHER", + "subcategory": "CSC_OTHER_MATERIALS", + "skill_used": "fabrication", + "difficulty": 2, + "time": 10000, + "batch_time_factors": [ 90, 4 ], + "autolearn": true, + "using": [ [ "forging_standard", 1 ] ], + "tools": [ [ [ "crucible", -1 ], [ "crucible_clay", -1 ] ] ], + "components": [ [ [ "tin", 12 ] ], [ [ "copper", 50 ] ] ] } ] diff --git a/data/json/recipes/recipe_weapon.json b/data/json/recipes/recipe_weapon.json index 40db372008b33..7159990d8cea4 100644 --- a/data/json/recipes/recipe_weapon.json +++ b/data/json/recipes/recipe_weapon.json @@ -2987,6 +2987,36 @@ [ [ "steel_lump", 1 ], [ "steel_chunk", 4 ], [ "scrap", 12 ] ] ] }, + { + "type": "recipe", + "result": "2h_flail_wood", + "category": "CC_WEAPON", + "subcategory": "CSC_WEAPON_BASHING", + "skill_used": "fabrication", + "skills_required": [ "bashing", 2 ], + "difficulty": 3, + "time": "32 m", + "autolearn": true, + "qualities": [ { "id": "CUT", "level": 1 } ], + "components": [ [ [ "2x4", 1 ], [ "stick_long", 1 ] ], [ [ "leather", 5 ] ] ] + }, + { + "type": "recipe", + "result": "2h_flail_steel", + "category": "CC_WEAPON", + "subcategory": "CSC_WEAPON_BASHING", + "skill_used": "fabrication", + "difficulty": 7, + "time": "420 m", + "book_learn": [ [ "textbook_weapwest", 6 ] ], + "qualities": [ { "id": "ANVIL", "level": 3 }, { "id": "HAMMER", "level": 3 }, { "id": "CHISEL", "level": 3 } ], + "tools": [ [ [ "tongs", -1 ] ], [ [ "swage", -1 ] ], [ [ "forge", 350 ], [ "oxy_torch", 70 ] ] ], + "components": [ + [ [ "steel_lump", 3 ], [ "steel_chunk", 12 ], [ "scrap", 36 ] ], + [ [ "stick_long", 1 ] ], + [ [ "fur", 2 ], [ "leather", 2 ] ] + ] + }, { "type": "recipe", "result": "butterfly_swords", diff --git a/data/json/recipes/recipes.json b/data/json/recipes/recipes.json index 80cbc0271951a..c2b05c4a7bb9f 100644 --- a/data/json/recipes/recipes.json +++ b/data/json/recipes/recipes.json @@ -103,7 +103,7 @@ { "type": "recipe_category", "id": "CC_ANIMALS", - "recipe_subcategories": [ "CSC_ALL", "CSC_ANIMALS_CANINE ARMOR" ] + "recipe_subcategories": [ "CSC_ALL", "CSC_ANIMALS_CANINE ARMOR", "CSC_ANIMALS_EQUINE ARMOR" ] }, { "type": "recipe_category", diff --git a/data/json/recipes/weapon/cutting.json b/data/json/recipes/weapon/cutting.json index f08e754a2788d..07b73650607fa 100644 --- a/data/json/recipes/weapon/cutting.json +++ b/data/json/recipes/weapon/cutting.json @@ -12,5 +12,74 @@ "qualities": [ { "id": "ANVIL", "level": 3 }, { "id": "HAMMER", "level": 3 }, { "id": "CHISEL", "level": 3 } ], "tools": [ [ [ "tongs", -1 ] ], [ [ "swage", -1 ] ] ], "components": [ [ [ "2x4", 1 ], [ "stick", 2 ] ], [ [ "fur", 2 ], [ "leather", 2 ] ] ] + }, + { + "result": "dao", + "type": "recipe", + "category": "CC_WEAPON", + "subcategory": "CSC_WEAPON_CUTTING", + "skill_used": "fabrication", + "difficulty": 7, + "time": 55000, + "book_learn": [ [ "textbook_armschina", 5 ] ], + "using": [ [ "forging_standard", 2 ], [ "bronzesmithing_tools", 1 ] ], + "components": [ + [ + [ "rag", 1 ], + [ "felt_patch", 1 ], + [ "leather", 1 ], + [ "fur", 1 ], + [ "duct_tape", 50 ], + [ "cordage_short", 2, "LIST" ], + [ "filament", 100, "LIST" ] + ], + [ [ "scrap_bronze", 5 ] ] + ] + }, + { + "result": "sword_xiphos", + "type": "recipe", + "category": "CC_WEAPON", + "subcategory": "CSC_WEAPON_CUTTING", + "skill_used": "fabrication", + "difficulty": 6, + "time": 45000, + "book_learn": [ [ "textbook_weapwest", 4 ] ], + "using": [ [ "forging_standard", 2 ], [ "bronzesmithing_tools", 1 ] ], + "components": [ + [ + [ "rag", 1 ], + [ "felt_patch", 1 ], + [ "leather", 1 ], + [ "fur", 1 ], + [ "duct_tape", 50 ], + [ "cordage_short", 2, "LIST" ], + [ "filament", 100, "LIST" ] + ], + [ [ "scrap_bronze", 4 ] ] + ] + }, + { + "result": "khopesh", + "type": "recipe", + "category": "CC_WEAPON", + "subcategory": "CSC_WEAPON_CUTTING", + "skill_used": "fabrication", + "difficulty": 7, + "time": 55000, + "book_learn": [ [ "textbook_weapwest", 5 ] ], + "using": [ [ "forging_standard", 2 ], [ "bronzesmithing_tools", 1 ] ], + "components": [ + [ + [ "rag", 1 ], + [ "felt_patch", 1 ], + [ "leather", 1 ], + [ "fur", 1 ], + [ "duct_tape", 50 ], + [ "cordage_short", 2, "LIST" ], + [ "filament", 100, "LIST" ] + ], + [ [ "scrap_bronze", 5 ] ] + ] } ] diff --git a/data/json/recipes/weapon/mods.json b/data/json/recipes/weapon/mods.json index 2ccd7e64285ae..06213a8875ba2 100644 --- a/data/json/recipes/weapon/mods.json +++ b/data/json/recipes/weapon/mods.json @@ -51,6 +51,188 @@ "tools": [ [ [ "large_repairkit", 10 ], [ "small_repairkit", 30 ] ] ], "components": [ [ [ "scrap", 1 ] ], [ [ "plastic_chunk", 1 ] ] ] }, + { + "result": "sights_mount", + "type": "recipe", + "category": "CC_WEAPON", + "subcategory": "CSC_WEAPON_MODS", + "skill_used": "fabrication", + "difficulty": 3, + "skills_required": [ [ "gun", 4 ] ], + "time": 30000, + "book_learn": [ + [ "mag_guns", 4 ], + [ "mag_pistol", 4 ], + [ "mag_shotgun", 4 ], + [ "mag_smg", 4 ], + [ "mag_rifle", 4 ], + [ "manual_gun", 4 ], + [ "manual_pistol", 4 ], + [ "manual_shotgun", 4 ], + [ "manual_smg", 4 ], + [ "manual_rifle", 4 ] + ], + "using": [ [ "soldering_standard", 15 ] ], + "qualities": [ { "id": "HAMMER_FINE", "level": 1 }, { "id": "SAW_M_FINE", "level": 1 } ], + "tools": [ [ [ "large_repairkit", 10 ], [ "small_repairkit", 30 ] ] ], + "components": [ [ [ "scrap", 1 ] ], [ [ "plastic_chunk", 1 ] ] ] + }, + { + "result": "sights_mount_launcher", + "type": "recipe", + "category": "CC_WEAPON", + "subcategory": "CSC_WEAPON_MODS", + "skill_used": "fabrication", + "difficulty": 3, + "skills_required": [ [ "gun", 4 ] ], + "time": 30000, + "book_learn": [ + [ "mag_guns", 4 ], + [ "mag_pistol", 4 ], + [ "mag_shotgun", 4 ], + [ "mag_smg", 4 ], + [ "mag_rifle", 4 ], + [ "manual_gun", 4 ], + [ "manual_pistol", 4 ], + [ "manual_shotgun", 4 ], + [ "manual_smg", 4 ], + [ "manual_rifle", 4 ] + ], + "using": [ [ "soldering_standard", 15 ] ], + "qualities": [ { "id": "HAMMER_FINE", "level": 1 }, { "id": "SAW_M_FINE", "level": 1 } ], + "tools": [ [ [ "large_repairkit", 10 ], [ "small_repairkit", 30 ] ] ], + "components": [ [ [ "scrap", 1 ] ], [ [ "plastic_chunk", 1 ] ] ] + }, + { + "result": "sights_mount_pistol", + "type": "recipe", + "category": "CC_WEAPON", + "subcategory": "CSC_WEAPON_MODS", + "skill_used": "fabrication", + "difficulty": 3, + "skills_required": [ [ "gun", 4 ] ], + "time": 30000, + "book_learn": [ + [ "mag_guns", 4 ], + [ "mag_pistol", 4 ], + [ "mag_shotgun", 4 ], + [ "mag_smg", 4 ], + [ "mag_rifle", 4 ], + [ "manual_gun", 4 ], + [ "manual_pistol", 4 ], + [ "manual_shotgun", 4 ], + [ "manual_smg", 4 ], + [ "manual_rifle", 4 ] + ], + "using": [ [ "soldering_standard", 15 ] ], + "qualities": [ { "id": "HAMMER_FINE", "level": 1 }, { "id": "SAW_M_FINE", "level": 1 } ], + "tools": [ [ [ "large_repairkit", 10 ], [ "small_repairkit", 30 ] ] ], + "components": [ [ [ "scrap", 1 ] ], [ [ "plastic_chunk", 1 ] ] ] + }, + { + "result": "rail_mount", + "type": "recipe", + "category": "CC_WEAPON", + "subcategory": "CSC_WEAPON_MODS", + "skill_used": "fabrication", + "difficulty": 3, + "skills_required": [ [ "gun", 4 ] ], + "time": 30000, + "book_learn": [ + [ "mag_guns", 4 ], + [ "mag_pistol", 4 ], + [ "mag_shotgun", 4 ], + [ "mag_smg", 4 ], + [ "mag_rifle", 4 ], + [ "manual_gun", 4 ], + [ "manual_pistol", 4 ], + [ "manual_shotgun", 4 ], + [ "manual_smg", 4 ], + [ "manual_rifle", 4 ] + ], + "using": [ [ "soldering_standard", 15 ] ], + "qualities": [ { "id": "HAMMER_FINE", "level": 1 }, { "id": "SAW_M_FINE", "level": 1 } ], + "tools": [ [ [ "large_repairkit", 10 ], [ "small_repairkit", 30 ] ] ], + "components": [ [ [ "scrap", 1 ] ], [ [ "plastic_chunk", 1 ] ] ] + }, + { + "result": "underbarrel_mount", + "type": "recipe", + "category": "CC_WEAPON", + "subcategory": "CSC_WEAPON_MODS", + "skill_used": "fabrication", + "difficulty": 3, + "skills_required": [ [ "gun", 4 ] ], + "time": 30000, + "book_learn": [ + [ "mag_guns", 4 ], + [ "mag_pistol", 4 ], + [ "mag_shotgun", 4 ], + [ "mag_smg", 4 ], + [ "mag_rifle", 4 ], + [ "manual_gun", 4 ], + [ "manual_pistol", 4 ], + [ "manual_shotgun", 4 ], + [ "manual_smg", 4 ], + [ "manual_rifle", 4 ] + ], + "using": [ [ "soldering_standard", 15 ] ], + "qualities": [ { "id": "HAMMER_FINE", "level": 1 }, { "id": "SAW_M_FINE", "level": 1 } ], + "tools": [ [ [ "large_repairkit", 10 ], [ "small_repairkit", 30 ] ] ], + "components": [ [ [ "scrap", 1 ] ], [ [ "plastic_chunk", 1 ] ] ] + }, + { + "result": "stock_mount", + "type": "recipe", + "category": "CC_WEAPON", + "subcategory": "CSC_WEAPON_MODS", + "skill_used": "fabrication", + "difficulty": 3, + "skills_required": [ [ "gun", 5 ] ], + "time": 30000, + "book_learn": [ + [ "mag_guns", 4 ], + [ "mag_pistol", 4 ], + [ "mag_shotgun", 4 ], + [ "mag_smg", 4 ], + [ "mag_rifle", 4 ], + [ "manual_gun", 4 ], + [ "manual_pistol", 4 ], + [ "manual_shotgun", 4 ], + [ "manual_smg", 4 ], + [ "manual_rifle", 4 ] + ], + "using": [ [ "soldering_standard", 15 ] ], + "qualities": [ { "id": "HAMMER_FINE", "level": 1 }, { "id": "SAW_M_FINE", "level": 1 } ], + "tools": [ [ [ "large_repairkit", 10 ], [ "small_repairkit", 30 ] ] ], + "components": [ [ [ "scrap", 3 ] ] ] + }, + { + "result": "grip_mount", + "type": "recipe", + "category": "CC_WEAPON", + "subcategory": "CSC_WEAPON_MODS", + "skill_used": "fabrication", + "difficulty": 3, + "skills_required": [ [ "gun", 5 ] ], + "time": 30000, + "book_learn": [ + [ "mag_guns", 4 ], + [ "mag_pistol", 4 ], + [ "mag_shotgun", 4 ], + [ "mag_smg", 4 ], + [ "mag_rifle", 4 ], + [ "manual_gun", 4 ], + [ "manual_pistol", 4 ], + [ "manual_shotgun", 4 ], + [ "manual_smg", 4 ], + [ "manual_rifle", 4 ] + ], + "using": [ [ "soldering_standard", 15 ] ], + "qualities": [ { "id": "HAMMER_FINE", "level": 1 }, { "id": "SAW_M_FINE", "level": 1 } ], + "tools": [ [ [ "large_repairkit", 10 ], [ "small_repairkit", 30 ] ] ], + "components": [ [ [ "scrap", 1 ] ], [ [ "plastic_chunk", 3 ] ] ] + }, { "type": "recipe", "result": "tele_sight", diff --git a/data/json/recipes/weapon/piercing.json b/data/json/recipes/weapon/piercing.json index 86522ae1cdd6a..abf165f1b68f0 100644 --- a/data/json/recipes/weapon/piercing.json +++ b/data/json/recipes/weapon/piercing.json @@ -30,5 +30,52 @@ "using": [ [ "welding_standard", 2 ], [ "steel_tiny", 1 ] ], "qualities": [ { "id": "HAMMER", "level": 3 }, { "id": "SAW_M", "level": 1 } ], "components": [ [ [ "pipe", 1 ] ] ] + }, + { + "result": "grip_hook", + "type": "recipe", + "category": "CC_WEAPON", + "subcategory": "CSC_WEAPON_PIERCING", + "skill_used": "fabrication", + "difficulty": 2, + "time": 60000, + "autolearn": true, + "using": [ [ "welding_standard", 2 ], [ "steel_tiny", 1 ] ], + "qualities": [ { "id": "HAMMER", "level": 3 }, { "id": "SAW_M", "level": 1 } ], + "components": [ [ [ "spike", 1 ] ] ] + }, + { + "result": "ji", + "type": "recipe", + "category": "CC_WEAPON", + "subcategory": "CSC_WEAPON_PIERCING", + "skill_used": "fabrication", + "difficulty": 6, + "time": 50000, + "book_learn": [ [ "textbook_armschina", 5 ] ], + "using": [ [ "forging_standard", 2 ], [ "bronzesmithing_tools", 1 ] ], + "qualities": [ { "id": "CUT", "level": 1 } ], + "components": [ + [ [ "scrap_bronze", 4 ] ], + [ [ "stick_long", 1 ] ], + [ [ "rag", 2 ], [ "felt_patch", 2 ], [ "leather", 2 ], [ "fur", 2 ] ] + ] + }, + { + "result": "spear_dory", + "type": "recipe", + "category": "CC_WEAPON", + "subcategory": "CSC_WEAPON_PIERCING", + "skill_used": "fabrication", + "difficulty": 4, + "time": 30000, + "book_learn": [ [ "textbook_weapwest", 4 ] ], + "using": [ [ "forging_standard", 1 ], [ "bronzesmithing_tools", 1 ] ], + "qualities": [ { "id": "CUT", "level": 1 } ], + "components": [ + [ [ "scrap_bronze", 2 ] ], + [ [ "stick_long", 1 ] ], + [ [ "rag", 2 ], [ "felt_patch", 2 ], [ "leather", 2 ], [ "fur", 2 ] ] + ] } ] diff --git a/data/json/regional_map_settings.json b/data/json/regional_map_settings.json index 521773506b0cd..b55999971004a 100644 --- a/data/json/regional_map_settings.json +++ b/data/json/regional_map_settings.json @@ -513,7 +513,8 @@ "mx_fumarole": 8, "mx_portal_in": 2, "mx_anomaly": 3, - "mx_roadworks": 100 + "mx_roadworks": 100, + "mx_mayhem": 50 } }, "build": { @@ -644,7 +645,11 @@ "gym_fitness": 200, "gym_fitness_1": 200, "s_liquor": 500, - "s_gun": 500, + "s_gun": 200, + "s_gun_1": 200, + "s_gun_2": 200, + "s_gun_3": 200, + "s_gun_4": 200, "s_clothes": 200, "s_clothes_1": 200, "s_clothes_2": 200, @@ -653,10 +658,13 @@ "s_clothes_5": 200, "s_clothes_6": 200, "s_library": 200, + "s_library_1": 200, + "s_library_2": 200, "s_bookstore": 200, "s_bookstore_1": 200, "s_bookstore_2": 200, "s_restaurant": 400, + "s_restaurant_foodplace": 400, "s_restaurant_1": 400, "s_restaurant_2": 400, "s_restaurant_3": 400, @@ -670,6 +678,8 @@ "s_electronics": 500, "pawn": 300, "mil_surplus": 200, + "mil_surplus_1": 200, + "mil_surplus_2": 200, "s_garage": 300, "s_garage_1": 300, "s_garage_2": 300, @@ -706,6 +716,7 @@ "museum": 100, "s_music": 200, "s_laundromat": 100, + "s_laundromat_1": 100, "veterinarian": 200, "animalpound": 200, "animalshelter": 100, @@ -716,6 +727,7 @@ "dispensary": 100, "dispensary_1": 100, "dispensary_2": 100, + "headshop": 100, "small_office": 200, "art_gallery": 200, "small_storage_units": 300, @@ -735,6 +747,7 @@ "gambling_hall": 100, "gambling_hall_1": 100, "music_venue": 100, + "music_venue_1": 100, "dump": 100, "recyclecenter": 100, "landfill": 100, @@ -746,6 +759,7 @@ "abandonedwarehouse_4": 100, "emptycommerciallot": 100, "lancenter": 100, + "lancenter_1": 100, "dollarstore": 200, "dollarstore_1": 200, "s_vfw": 100, diff --git a/data/json/requirements/ammo.json b/data/json/requirements/ammo.json index 86de075a982c6..3bf204ee72674 100644 --- a/data/json/requirements/ammo.json +++ b/data/json/requirements/ammo.json @@ -33,5 +33,35 @@ "type": "requirement", "//": "Components required for .357 Magnum ammo", "components": [ [ [ "357mag_casing", 1 ] ], [ [ "lgpistol_primer", 1 ] ] ] + }, + { + "id": "ammo_10mm", + "type": "requirement", + "//": "Components required for 10mm Auto ammo", + "components": [ [ [ "10mm_casing", 1 ] ], [ [ "smpistol_primer", 1 ] ] ] + }, + { + "id": "ammo_45colt", + "type": "requirement", + "//": "Components required for .45 Colt ammo", + "components": [ [ [ "45colt_casing", 1 ] ], [ [ "lgpistol_primer", 1 ] ] ] + }, + { + "id": "ammo_38super", + "type": "requirement", + "//": "Components required for .38 Super ammo", + "components": [ [ [ "38super_casing", 1 ] ], [ [ "smpistol_primer", 1 ] ] ] + }, + { + "id": "ammo_410shot", + "type": "requirement", + "//": "Components required for .410 ammo", + "components": [ [ [ "410shot_hull", 1 ] ], [ [ "shotgun_primer", 1 ] ] ] + }, + { + "id": "ammo_270win", + "type": "requirement", + "//": "Components required for .270 Winchester ammo", + "components": [ [ [ "270win_casing", 1 ] ], [ [ "lgrifle_primer", 1 ] ] ] } ] diff --git a/data/json/requirements/toolsets.json b/data/json/requirements/toolsets.json index 3013619b57147..bc72b5c35046e 100644 --- a/data/json/requirements/toolsets.json +++ b/data/json/requirements/toolsets.json @@ -9,7 +9,7 @@ "id": "earthenware_firing", "type": "requirement", "//": "Firing various clay shapes to make earthenware", - "tools": [ [ [ "brick_kiln", -1 ], [ "kiln", -1 ] ], [ [ "fire", -1 ], [ "brick_kiln", 1 ], [ "kiln", 1 ] ] ] + "tools": [ [ [ "fire", -1 ], [ "brick_kiln", 1 ], [ "kiln", 1 ] ] ] }, { "id": "forging_standard", @@ -63,5 +63,12 @@ [ "survivor_belt", -1 ] ] ] + }, + { + "id": "bronzesmithing_tools", + "type": "requirement", + "//": "Tools for casting and work hardening items made from bronze", + "qualities": [ { "id": "HAMMER", "level": 2 }, { "id": "ANVIL", "level": 2 } ], + "tools": [ [ [ "crucible", -1 ], [ "crucible_clay", -1 ] ] ] } ] diff --git a/data/json/scenarios/scenarios.json b/data/json/scenarios.json similarity index 96% rename from data/json/scenarios/scenarios.json rename to data/json/scenarios.json index e55878723887a..2af3e272f6137 100644 --- a/data/json/scenarios/scenarios.json +++ b/data/json/scenarios.json @@ -203,7 +203,7 @@ "name": "Sheltered", "points": -3, "description": "When the apocalypse broke out, you were funneled into a nearby shelter. Here you have lived, never leaving, lest the unknowns of the outside world hurt you. Supplies are running low, and for the first time since the cataclysm, you will be forced to face the outside world.", - "allowed_locs": [ "lmoe", "shelter" ], + "allowed_locs": [ "lmoe_empty", "shelter" ], "start_name": "Enclosed Shelter", "flags": [ "WIN_START", "LONE_START" ], "professions": [ "sheltered_militia", "sheltered_survivor", "bionic_prepper", "unemployed" ] @@ -338,6 +338,17 @@ "start_name": "Police Station", "flags": [ "SUR_START", "CITY_START" ] }, + { + "type": "scenario", + "ident": "foodplace", + "name": "The Mascot Rises", + "points": 0, + "description": "You just finished your shift and got back in the break room when you heard the alarms and the security door shutting down behind you. There's a lot of customers out there and you're not sure Foodplace delicious food is going to be enough for them.", + "allowed_locs": [ "fp_break_room" ], + "professions": [ "true_foodperson", "unemployed" ], + "start_name": "Foodplace Break Room", + "flags": [ "CITY_START" ] + }, { "type": "scenario", "ident": "schools_out", @@ -398,7 +409,7 @@ "start_name": "Crash site", "professions": [ "soldier", "national_guard", "specops", "bio_soldier", "bio_sniper" ], "allowed_locs": [ "field", "forest" ], - "map_special": "mx_helicopter", + "map_extra": "mx_helicopter", "flags": [ "HELI_CRASH", "LONE_START" ] }, { diff --git a/data/json/health_msgs.json b/data/json/snippets/health_msgs.json similarity index 100% rename from data/json/health_msgs.json rename to data/json/snippets/health_msgs.json diff --git a/data/json/music.json b/data/json/snippets/music.json similarity index 100% rename from data/json/music.json rename to data/json/snippets/music.json diff --git a/data/json/snippets.json b/data/json/snippets/snippets.json similarity index 99% rename from data/json/snippets.json rename to data/json/snippets/snippets.json index 17eafc6fca53c..ac3d6ab81b034 100644 --- a/data/json/snippets.json +++ b/data/json/snippets/snippets.json @@ -2355,5 +2355,10 @@ "text": [ "MINE OPERATIONS SUSPENDED; CONTROL TRANSFERRED TO AMIGARA PROJECT UNDER IMPERATIVE 2:07B.\nFAULTLINE SOUNDING HAS PLACED DEPTH AT 30.09 KM.\nDAMAGE TO FAULTLINE DISCOVERED; NEPOWER MINE CREW PLACED UNDER ARREST FOR VIOLATION OF REGULATION 87.08 AND TRANSFERRED TO LAB 89-C FOR USE AS SUBJECTS.\nQUALITY OF FAULTLINE NOT COMPROMISED.\nINITIATING STANDARD TREMOR TEST..." ] + }, + { + "type": "snippet", + "category": "headshop_graffiti", + "text": [ "(~);}", " + forever", "Be Kind", "Save the whales!" ] } ] diff --git a/data/json/species.json b/data/json/species.json index a4fe789e5e077..7f083143a9cf0 100644 --- a/data/json/species.json +++ b/data/json/species.json @@ -36,7 +36,8 @@ }, { "type": "SPECIES", - "id": "BLOB" + "id": "BLOB", + "footsteps": "plop." }, { "type": "SPECIES", @@ -68,15 +69,18 @@ { "type": "SPECIES", "id": "WORM", + "footsteps": "rustle.", "fear_triggers": [ "HURT" ] }, { "type": "SPECIES", - "id": "ZOMBIE" + "id": "ZOMBIE", + "footsteps": "shuffling." }, { "type": "SPECIES", - "id": "ROBOT" + "id": "ROBOT", + "footsteps": "mechanical whirring." }, { "type": "SPECIES", diff --git a/data/json/speech.json b/data/json/speech.json index fd0f502741080..3061148d02c3e 100644 --- a/data/json/speech.json +++ b/data/json/speech.json @@ -1846,5 +1846,239 @@ "speaker": "mon_eyebot", "sound": "\"Police inbound. Stay where you are!\"", "volume": 15 + }, + { + "type": "speech", + "speaker": "foodperson_mask", + "sound": "\"I AM FOODPERSON. AND I BRING SUSTENANCE!\"", + "volume": 17 + }, + { + "type": "speech", + "speaker": "foodperson_mask", + "sound": "\"Come to FoodPlace today and buy food!\"", + "volume": 15 + }, + { + "type": "speech", + "speaker": "foodperson_mask", + "sound": "\"FoodPlace: The best restaurant in an area!\"", + "volume": 15 + }, + { + "type": "speech", + "speaker": "foodperson_mask", + "sound": "\"Our food contains up to 95% real food.\"", + "volume": 15 + }, + { + "type": "speech", + "speaker": "foodperson_mask", + "sound": "\"FoodPlace: It's the Calories.\"", + "volume": 15 + }, + { + "type": "speech", + "speaker": "foodperson_mask", + "sound": "\"You need food, don't you? Then come with me to FOODPLACE!!\"", + "volume": 15 + }, + { + "type": "speech", + "speaker": "foodperson_mask", + "sound": "\"FoodPlace: Edible food is OUR guarantee!\"", + "volume": 15 + }, + { + "type": "speech", + "speaker": "talking_doll", + "sound": "Wanna play with me?", + "volume": 10 + }, + { + "type": "speech", + "speaker": "talking_doll", + "sound": "Sing with me!", + "volume": 10 + }, + { + "type": "speech", + "speaker": "talking_doll", + "sound": "I love you!", + "volume": 10 + }, + { + "type": "speech", + "speaker": "talking_doll", + "sound": "Please take me with you!", + "volume": 10 + }, + { + "type": "speech", + "speaker": "talking_doll", + "sound": "May I have a cookie?", + "volume": 10 + }, + { + "type": "speech", + "speaker": "talking_doll", + "sound": "Let's play together!", + "volume": 10 + }, + { + "type": "speech", + "speaker": "talking_doll", + "sound": "Time to play!", + "volume": 10 + }, + { + "type": "speech", + "speaker": "talking_doll", + "sound": "Om nom nom! Delicious!", + "volume": 10 + }, + { + "type": "speech", + "speaker": "talking_doll", + "sound": "Are you my mommy?", + "volume": 10 + }, + { + "type": "speech", + "speaker": "talking_doll", + "sound": "Oh, how fun!", + "volume": 10 + }, + { + "type": "speech", + "speaker": "talking_doll", + "sound": "You're my best friend!", + "volume": 10 + }, + { + "type": "speech", + "speaker": "talking_doll", + "sound": "Heehee!", + "volume": 10 + }, + { + "type": "speech", + "speaker": "talking_doll", + "sound": "Let's have fun!", + "volume": 10 + }, + { + "type": "speech", + "speaker": "talking_doll", + "sound": "Let's have a tea party!", + "volume": 10 + }, + { + "type": "speech", + "speaker": "talking_doll", + "sound": "You're the best!", + "volume": 10 + }, + { + "type": "speech", + "speaker": "creepy_doll", + "sound": "You shouldn't have done that.", + "volume": 10 + }, + { + "type": "speech", + "speaker": "creepy_doll", + "sound": "Let's play... Russian roulette.", + "volume": 10 + }, + { + "type": "speech", + "speaker": "creepy_doll", + "sound": "I hate you.", + "volume": 10 + }, + { + "type": "speech", + "speaker": "creepy_doll", + "sound": "Go kill yourself!", + "volume": 10 + }, + { + "type": "speech", + "speaker": "creepy_doll", + "sound": "Big Brother is watching you...", + "volume": 10 + }, + { + "type": "speech", + "speaker": "creepy_doll", + "sound": "Die for me!", + "volume": 10 + }, + { + "type": "speech", + "speaker": "creepy_doll", + "sound": "Why won't you die?", + "volume": 10 + }, + { + "type": "speech", + "speaker": "creepy_doll", + "sound": "Blood... Delicious.", + "volume": 10 + }, + { + "type": "speech", + "speaker": "creepy_doll", + "sound": "See you... IN HELL!", + "volume": 10 + }, + { + "type": "speech", + "speaker": "creepy_doll", + "sound": "AAAIEEEEEEE!", + "volume": 10 + }, + { + "type": "speech", + "speaker": "creepy_doll", + "sound": "FUCK YOU!", + "volume": 10 + }, + { + "type": "speech", + "speaker": "creepy_doll", + "sound": "What did you do with my Mommy?", + "volume": 10 + }, + { + "type": "speech", + "speaker": "creepy_doll", + "sound": "Stay with me... forever!", + "volume": 10 + }, + { + "type": "speech", + "speaker": "creepy_doll", + "sound": "Hey kids. Want some candy?", + "volume": 10 + }, + { + "type": "speech", + "speaker": "creepy_doll", + "sound": "Down here, they ALL float!", + "volume": 10 + }, + { + "type": "speech", + "speaker": "creepy_doll", + "sound": "Do you really need that much honey?", + "volume": 10 + }, + { + "type": "speech", + "speaker": "creepy_doll", + "sound": "My previous owner squealed like a pig when I gutted her!", + "volume": 10 } ] diff --git a/data/json/start_locations.json b/data/json/start_locations.json index 2d068244d357a..17af3be10ecea 100644 --- a/data/json/start_locations.json +++ b/data/json/start_locations.json @@ -169,6 +169,12 @@ "name": "LMOE", "target": "lmoe" }, + { + "type": "start_location", + "ident": "lmoe_empty", + "name": "LMOE shelter", + "target": "lmoe_under_empty" + }, { "type": "start_location", "ident": "forest", @@ -230,6 +236,12 @@ "name": "Police Station", "target": "police" }, + { + "type": "start_location", + "ident": "fp_break_room", + "name": "Foodplace Break Room", + "target": "s_restaurant_foodplace_roof" + }, { "type": "start_location", "ident": "school", diff --git a/data/json/techniques.json b/data/json/techniques.json index f527a7cd987d0..841e7f0491c40 100644 --- a/data/json/techniques.json +++ b/data/json/techniques.json @@ -1134,5 +1134,68 @@ "unarmed_allowed": true, "disarms": true, "messages": [ "You disarm %s", " disarms %s" ] + }, + { + "type": "technique", + "id": "tec_swordsmanship_grab", + "name": "grab and pommel strike", + "min_melee": 3, + "crit_tec": true, + "unarmed_allowed": true, + "melee_allowed": true, + "down_dur": 1, + "messages": [ "You grab and pommel strike %s", " grab and pommel strikes %s" ] + }, + { + "type": "technique", + "id": "tec_swordsmanship_break", + "name": "grab break", + "min_melee": 3, + "unarmed_allowed": true, + "melee_allowed": true, + "defensive": true, + "grab_break": true + }, + { + "type": "technique", + "id": "tec_swordsmanship_counter", + "name": "displace and counter", + "min_melee": 4, + "req_buffs": [ "swordsmanship_counter" ], + "messages": [ "You displace and counter %s", " displaces and counters %s" ], + "mult_bonuses": [ [ "damage", "cut", 1.1 ], [ "movecost", 0.75 ] ], + "stun_dur": 1 + }, + { + "type": "technique", + "id": "tec_swordsmanship_unterhau", + "name": "sweeping strike", + "min_melee": 5, + "crit_tec": true, + "down_dur": 2, + "messages": [ "You trip %s with a sweeping strike", " trips %s with a sweeping strike" ] + }, + { + "type": "technique", + "id": "tec_swordsmanship_zornhau", + "name": "vicious strike", + "min_melee": 5, + "crit_tec": true, + "mult_bonuses": [ [ "damage", "bash", 1.5 ], [ "damage", "cut", 1.5 ], [ "damage", "stab", 1.5 ] ], + "stun_dur": 1, + "messages": [ "You hack at %s with a vicious strike", " hack at %s with a vicious strike" ] + }, + { + "type": "technique", + "id": "tec_swordsmanship_mordhau", + "name": "death blow", + "min_melee": 6, + "crit_tec": true, + "mult_bonuses": [ [ "damage", "bash", 3 ], [ "damage", "cut", 0 ], [ "damage", "stab", 0 ], [ "movecost", 2 ] ], + "stun_dur": 2, + "messages": [ + "You flip your weapon around and deliver a mordhau to %s", + " holds his weapon funny and slams it down on %s" + ] } ] diff --git a/data/json/terrain.json b/data/json/terrain.json index ee7637272ea8f..2f5abb576a4ff 100644 --- a/data/json/terrain.json +++ b/data/json/terrain.json @@ -667,7 +667,18 @@ "move_cost": 2, "roof": "t_flat_roof", "flags": [ "TRANSPARENT", "INDOORS", "FLAT", "ROAD" ], - "bash": { "sound": "thump", "ter_set": "t_null", "str_min": 100, "str_max": 500, "str_min_supported": 200 } + "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 ] } + ] + } }, { "type": "terrain", @@ -1542,7 +1553,12 @@ "open": "t_door_o", "deconstruct": { "ter_set": "t_door_frame", - "items": [ { "item": "2x4", "count": 4 }, { "item": "wood_panel", "count": 1 }, { "item": "nail", "charges": [ 6, 12 ] } ] + "items": [ + { "item": "2x4", "count": 4 }, + { "item": "wood_panel", "count": 1 }, + { "item": "nail", "charges": [ 6, 12 ] }, + { "item": "hinge", "count": 2 } + ] }, "bash": { "str_min": 8, @@ -1574,7 +1590,12 @@ "open": "t_door_lab_o", "deconstruct": { "ter_set": "t_door_lab_frame", - "items": [ { "item": "2x4", "count": 4 }, { "item": "wood_panel", "count": 1 }, { "item": "nail", "charges": [ 6, 12 ] } ] + "items": [ + { "item": "2x4", "count": 4 }, + { "item": "wood_panel", "count": 1 }, + { "item": "nail", "charges": [ 6, 12 ] }, + { "item": "hinge", "count": 2 } + ] }, "bash": { "str_min": 8, @@ -1606,7 +1627,12 @@ "open": "t_door_white_o", "deconstruct": { "ter_set": "t_door_white_frame", - "items": [ { "item": "2x4", "count": 4 }, { "item": "wood_panel", "count": 1 }, { "item": "nail", "charges": [ 6, 12 ] } ] + "items": [ + { "item": "2x4", "count": 4 }, + { "item": "wood_panel", "count": 1 }, + { "item": "nail", "charges": [ 6, 12 ] }, + { "item": "hinge", "count": 2 } + ] }, "bash": { "str_min": 8, @@ -1638,7 +1664,12 @@ "open": "t_door_gray_o", "deconstruct": { "ter_set": "t_door_gray_frame", - "items": [ { "item": "2x4", "count": 4 }, { "item": "wood_panel", "count": 1 }, { "item": "nail", "charges": [ 6, 12 ] } ] + "items": [ + { "item": "2x4", "count": 4 }, + { "item": "wood_panel", "count": 1 }, + { "item": "nail", "charges": [ 6, 12 ] }, + { "item": "hinge", "count": 2 } + ] }, "bash": { "str_min": 8, @@ -1670,7 +1701,12 @@ "open": "t_door_red_o", "deconstruct": { "ter_set": "t_door_red_frame", - "items": [ { "item": "2x4", "count": 4 }, { "item": "wood_panel", "count": 1 }, { "item": "nail", "charges": [ 6, 12 ] } ] + "items": [ + { "item": "2x4", "count": 4 }, + { "item": "wood_panel", "count": 1 }, + { "item": "nail", "charges": [ 6, 12 ] }, + { "item": "hinge", "count": 2 } + ] }, "bash": { "str_min": 8, @@ -1702,7 +1738,12 @@ "open": "t_door_green_o", "deconstruct": { "ter_set": "t_door_green_frame", - "items": [ { "item": "2x4", "count": 4 }, { "item": "wood_panel", "count": 1 }, { "item": "nail", "charges": [ 6, 12 ] } ] + "items": [ + { "item": "2x4", "count": 4 }, + { "item": "wood_panel", "count": 1 }, + { "item": "nail", "charges": [ 6, 12 ] }, + { "item": "hinge", "count": 2 } + ] }, "bash": { "str_min": 8, @@ -1732,7 +1773,12 @@ "flags": [ "FLAMMABLE_ASH", "TRANSPARENT", "FLAT", "BARRICADABLE_DOOR", "CONNECT_TO_WALL", "ROAD" ], "deconstruct": { "ter_set": "t_door_white_frame", - "items": [ { "item": "2x4", "count": 4 }, { "item": "wood_panel", "count": 1 }, { "item": "nail", "charges": [ 6, 12 ] } ] + "items": [ + { "item": "2x4", "count": 4 }, + { "item": "wood_panel", "count": 1 }, + { "item": "nail", "charges": [ 6, 12 ] }, + { "item": "hinge", "count": 2 } + ] }, "close": "t_door_white_c", "bash": { @@ -1746,7 +1792,8 @@ "items": [ { "item": "2x4", "count": [ 1, 3 ] }, { "item": "nail", "charges": [ 1, 6 ] }, - { "item": "splinter", "count": [ 2, 6 ] } + { "item": "splinter", "count": [ 2, 6 ] }, + { "item": "hinge", "count": [ 1, 2 ] } ] } }, @@ -1762,7 +1809,12 @@ "flags": [ "FLAMMABLE_ASH", "TRANSPARENT", "FLAT", "BARRICADABLE_DOOR", "CONNECT_TO_WALL", "ROAD" ], "deconstruct": { "ter_set": "t_door_gray_frame", - "items": [ { "item": "2x4", "count": 4 }, { "item": "wood_panel", "count": 1 }, { "item": "nail", "charges": [ 6, 12 ] } ] + "items": [ + { "item": "2x4", "count": 4 }, + { "item": "wood_panel", "count": 1 }, + { "item": "nail", "charges": [ 6, 12 ] }, + { "item": "hinge", "count": 2 } + ] }, "close": "t_door_gray_c", "bash": { @@ -1776,7 +1828,8 @@ "items": [ { "item": "2x4", "count": [ 1, 3 ] }, { "item": "nail", "charges": [ 1, 6 ] }, - { "item": "splinter", "count": [ 2, 6 ] } + { "item": "splinter", "count": [ 2, 6 ] }, + { "item": "hinge", "count": [ 1, 2 ] } ] } }, @@ -1792,7 +1845,12 @@ "flags": [ "FLAMMABLE_ASH", "TRANSPARENT", "FLAT", "BARRICADABLE_DOOR", "CONNECT_TO_WALL", "ROAD" ], "deconstruct": { "ter_set": "t_door_red_frame", - "items": [ { "item": "2x4", "count": 4 }, { "item": "wood_panel", "count": 1 }, { "item": "nail", "charges": [ 6, 12 ] } ] + "items": [ + { "item": "2x4", "count": 4 }, + { "item": "wood_panel", "count": 1 }, + { "item": "nail", "charges": [ 6, 12 ] }, + { "item": "hinge", "count": 2 } + ] }, "close": "t_door_red_c", "bash": { @@ -1806,7 +1864,8 @@ "items": [ { "item": "2x4", "count": [ 1, 3 ] }, { "item": "nail", "charges": [ 1, 6 ] }, - { "item": "splinter", "count": [ 2, 6 ] } + { "item": "splinter", "count": [ 2, 6 ] }, + { "item": "hinge", "count": [ 1, 2 ] } ] } }, @@ -1822,7 +1881,12 @@ "flags": [ "FLAMMABLE_ASH", "TRANSPARENT", "FLAT", "BARRICADABLE_DOOR", "CONNECT_TO_WALL", "ROAD" ], "deconstruct": { "ter_set": "t_door_green_frame", - "items": [ { "item": "2x4", "count": 4 }, { "item": "wood_panel", "count": 1 }, { "item": "nail", "charges": [ 6, 12 ] } ] + "items": [ + { "item": "2x4", "count": 4 }, + { "item": "wood_panel", "count": 1 }, + { "item": "nail", "charges": [ 6, 12 ] }, + { "item": "hinge", "count": 2 } + ] }, "close": "t_door_green_c", "bash": { @@ -1836,7 +1900,8 @@ "items": [ { "item": "2x4", "count": [ 1, 3 ] }, { "item": "nail", "charges": [ 1, 6 ] }, - { "item": "splinter", "count": [ 2, 6 ] } + { "item": "splinter", "count": [ 2, 6 ] }, + { "item": "hinge", "count": [ 1, 2 ] } ] } }, @@ -1870,7 +1935,8 @@ "items": [ { "item": "2x4", "count": [ 1, 2 ] }, { "item": "nail", "charges": [ 1, 4 ] }, - { "item": "splinter", "count": [ 1, 4 ] } + { "item": "splinter", "count": [ 1, 4 ] }, + { "item": "hinge", "count": [ 1, 2 ] } ] } }, @@ -1904,7 +1970,8 @@ "items": [ { "item": "2x4", "count": [ 1, 2 ] }, { "item": "nail", "charges": [ 1, 4 ] }, - { "item": "splinter", "count": [ 1, 4 ] } + { "item": "splinter", "count": [ 1, 4 ] }, + { "item": "hinge", "count": [ 1, 2 ] } ] } }, @@ -1938,7 +2005,8 @@ "items": [ { "item": "2x4", "count": [ 1, 2 ] }, { "item": "nail", "charges": [ 1, 4 ] }, - { "item": "splinter", "count": [ 1, 4 ] } + { "item": "splinter", "count": [ 1, 4 ] }, + { "item": "hinge", "count": [ 1, 2 ] } ] } }, @@ -1972,7 +2040,8 @@ "items": [ { "item": "2x4", "count": [ 1, 2 ] }, { "item": "nail", "charges": [ 1, 4 ] }, - { "item": "splinter", "count": [ 1, 4 ] } + { "item": "splinter", "count": [ 1, 4 ] }, + { "item": "hinge", "count": [ 1, 2 ] } ] } }, @@ -2271,7 +2340,12 @@ "open": "t_door_o_peep", "deconstruct": { "ter_set": "t_door_frame", - "items": [ { "item": "peephole", "count": 1 }, { "item": "2x4", "count": 4 }, { "item": "nail", "charges": [ 6, 12 ] } ] + "items": [ + { "item": "peephole", "count": 1 }, + { "item": "2x4", "count": 4 }, + { "item": "nail", "charges": [ 6, 12 ] }, + { "item": "hinge", "count": 2 } + ] }, "bash": { "str_min": 8, @@ -2319,7 +2393,8 @@ "items": [ { "item": "2x4", "count": [ 1, 2 ] }, { "item": "nail", "charges": [ 1, 4 ] }, - { "item": "splinter", "count": [ 1, 4 ] } + { "item": "splinter", "count": [ 1, 4 ] }, + { "item": "hinge", "count": [ 1, 2 ] } ] } }, @@ -2353,7 +2428,8 @@ "items": [ { "item": "2x4", "count": [ 1, 2 ] }, { "item": "nail", "charges": [ 1, 4 ] }, - { "item": "splinter", "count": [ 1, 4 ] } + { "item": "splinter", "count": [ 1, 4 ] }, + { "item": "hinge", "count": [ 1, 2 ] } ] } }, @@ -2389,7 +2465,8 @@ { "item": "2x4", "prob": 50 }, { "item": "2x4", "count": [ 1, 2 ] }, { "item": "nail", "charges": [ 1, 4 ] }, - { "item": "splinter", "count": [ 1, 4 ] } + { "item": "splinter", "count": [ 1, 4 ] }, + { "item": "hinge", "count": [ 1, 2 ] } ] } }, @@ -2405,7 +2482,12 @@ "flags": [ "FLAMMABLE_ASH", "TRANSPARENT", "FLAT", "BARRICADABLE_DOOR", "CONNECT_TO_WALL", "ROAD" ], "deconstruct": { "ter_set": "t_door_frame", - "items": [ { "item": "2x4", "count": 4 }, { "item": "wood_panel", "count": 1 }, { "item": "nail", "charges": [ 6, 12 ] } ] + "items": [ + { "item": "2x4", "count": 4 }, + { "item": "wood_panel", "count": 1 }, + { "item": "nail", "charges": [ 6, 12 ] }, + { "item": "hinge", "count": 2 } + ] }, "close": "t_door_c", "bash": { @@ -2419,7 +2501,8 @@ "items": [ { "item": "2x4", "count": [ 1, 3 ] }, { "item": "nail", "charges": [ 1, 6 ] }, - { "item": "splinter", "count": [ 2, 6 ] } + { "item": "splinter", "count": [ 2, 6 ] }, + { "item": "hinge", "count": [ 1, 2 ] } ] } }, @@ -2435,7 +2518,12 @@ "flags": [ "FLAMMABLE_ASH", "TRANSPARENT", "FLAT", "BARRICADABLE_DOOR", "CONNECT_TO_WALL", "ROAD" ], "deconstruct": { "ter_set": "t_door_lab_frame", - "items": [ { "item": "2x4", "count": 4 }, { "item": "wood_panel", "count": 1 }, { "item": "nail", "charges": [ 6, 12 ] } ] + "items": [ + { "item": "2x4", "count": 4 }, + { "item": "wood_panel", "count": 1 }, + { "item": "nail", "charges": [ 6, 12 ] }, + { "item": "hinge", "count": 2 } + ] }, "close": "t_door_lab_c", "bash": { @@ -2469,7 +2557,8 @@ { "item": "peephole", "count": 1 }, { "item": "2x4", "count": 4 }, { "item": "wood_panel", "count": 1 }, - { "item": "nail", "charges": [ 6, 12 ] } + { "item": "nail", "charges": [ 6, 12 ] }, + { "item": "hinge", "count": [ 1, 2 ] } ] }, "close": "t_door_c_peep", @@ -2485,7 +2574,8 @@ { "item": "peephole", "prob": 50 }, { "item": "2x4", "count": [ 1, 3 ] }, { "item": "nail", "charges": [ 1, 6 ] }, - { "item": "splinter", "count": [ 2, 6 ] } + { "item": "splinter", "count": [ 2, 6 ] }, + { "item": "hinge", "count": [ 1, 2 ] } ] } }, @@ -2493,7 +2583,7 @@ "type": "terrain", "id": "t_rdoor_c", "name": "closed reinforced wood door", - "description": "Just like other wooden doors, except this one has layers of nailed in two by fours for reinforcement. It might be barricaded, but still susceptible to fire.", + "description": "Just like other wooden doors, except this one has layers of nailed in two by fours and additional hinge for reinforcement. It might be barricaded, but still susceptible to fire.", "symbol": "+", "color": "red", "move_cost": 0, @@ -2503,7 +2593,12 @@ "open": "t_rdoor_o", "deconstruct": { "ter_set": "t_door_c", - "items": [ { "item": "2x4", "count": 24 }, { "item": "wood_panel", "count": 2 }, { "item": "nail", "charges": [ 36, 48 ] } ] + "items": [ + { "item": "2x4", "count": 24 }, + { "item": "wood_panel", "count": 2 }, + { "item": "nail", "charges": [ 36, 48 ] }, + { "item": "hinge", "count": 1 } + ] }, "bash": { "str_min": 18, @@ -2550,7 +2645,8 @@ "items": [ { "item": "2x4", "count": [ 1, 4 ] }, { "item": "nail", "charges": [ 4, 18 ] }, - { "item": "splinter", "count": [ 2, 4 ] } + { "item": "splinter", "count": [ 2, 4 ] }, + { "item": "hinge", "count": [ 0, 1 ] } ] } }, @@ -2566,7 +2662,12 @@ "flags": [ "FLAMMABLE_ASH", "TRANSPARENT", "FLAT", "BARRICADABLE_DOOR_REINFORCED", "CONNECT_TO_WALL", "ROAD" ], "deconstruct": { "ter_set": "t_door_c", - "items": [ { "item": "2x4", "count": 24 }, { "item": "wood_panel", "count": 1 }, { "item": "nail", "charges": [ 36, 48 ] } ] + "items": [ + { "item": "2x4", "count": 24 }, + { "item": "wood_panel", "count": 1 }, + { "item": "nail", "charges": [ 36, 48 ] }, + { "item": "hinge", "count": 1 } + ] }, "close": "t_rdoor_c", "bash": { @@ -2580,7 +2681,8 @@ "items": [ { "item": "2x4", "count": [ 2, 8 ] }, { "item": "nail", "charges": [ 8, 30 ] }, - { "item": "splinter", "count": [ 4, 8 ] } + { "item": "splinter", "count": [ 4, 8 ] }, + { "item": "hinge", "count": [ 0, 1 ] } ] } }, @@ -2976,7 +3078,12 @@ "open": "t_fencegate_o", "deconstruct": { "ter_set": "t_dirt", - "items": [ { "item": "2x4", "count": 5 }, { "item": "pointy_stick", "count": 2 }, { "item": "nail", "charges": 12 } ] + "items": [ + { "item": "2x4", "count": 5 }, + { "item": "pointy_stick", "count": 2 }, + { "item": "nail", "charges": 12 }, + { "item": "hinge", "count": [ 1, 2 ] } + ] }, "bash": { "str_min": 4, @@ -2989,7 +3096,8 @@ "items": [ { "item": "2x4", "count": [ 1, 4 ] }, { "item": "nail", "charges": [ 2, 8 ] }, - { "item": "splinter", "count": [ 1, 2 ] } + { "item": "splinter", "count": [ 1, 2 ] }, + { "item": "hinge", "count": [ 1, 2 ] } ] } }, @@ -3006,7 +3114,12 @@ "close": "t_fencegate_c", "deconstruct": { "ter_set": "t_dirt", - "items": [ { "item": "2x4", "count": 5 }, { "item": "pointy_stick", "count": 2 }, { "item": "nail", "charges": 12 } ] + "items": [ + { "item": "2x4", "count": 5 }, + { "item": "pointy_stick", "count": 2 }, + { "item": "nail", "charges": 12 }, + { "item": "hinge", "count": [ 1, 2 ] } + ] }, "bash": { "str_min": 4, @@ -3014,7 +3127,12 @@ "sound": "crash!", "sound_fail": "wham!", "ter_set": "t_null", - "items": [ { "item": "2x4", "count": [ 1, 4 ] }, { "item": "nail", "charges": [ 2, 8 ] }, { "item": "splinter", "count": 1 } ] + "items": [ + { "item": "2x4", "count": [ 1, 4 ] }, + { "item": "nail", "charges": [ 2, 8 ] }, + { "item": "splinter", "count": 1 }, + { "item": "hinge", "count": [ 1, 2 ] } + ] } }, { @@ -3081,7 +3199,12 @@ "open": "t_chickenwire_gate_o", "deconstruct": { "ter_set": "t_dirt", - "items": [ { "item": "2x4", "count": 5 }, { "item": "wire", "count": 10 }, { "item": "nail", "charges": 20 } ] + "items": [ + { "item": "2x4", "count": 5 }, + { "item": "wire", "count": 10 }, + { "item": "nail", "charges": 20 }, + { "item": "hinge", "count": [ 1, 2 ] } + ] }, "bash": { "str_min": 5, @@ -3091,7 +3214,7 @@ "sound": "rattle!", "sound_fail": "thump!", "ter_set": "t_null", - "items": [ { "item": "wire", "count": [ 4, 6 ] }, { "item": "2x4", "count": [ 2, 4 ] } ] + "items": [ { "item": "wire", "count": [ 4, 6 ] }, { "item": "2x4", "count": [ 2, 4 ] }, { "item": "hinge", "count": [ 1, 2 ] } ] } }, { @@ -3108,7 +3231,12 @@ "close": "t_chickenwire_gate_c", "deconstruct": { "ter_set": "t_dirt", - "items": [ { "item": "2x4", "count": 5 }, { "item": "wire", "count": 10 }, { "item": "nail", "charges": 20 } ] + "items": [ + { "item": "2x4", "count": 5 }, + { "item": "wire", "count": 10 }, + { "item": "nail", "charges": 20 }, + { "item": "hinge", "count": [ 1, 2 ] } + ] }, "bash": { "str_min": 5, @@ -3116,7 +3244,7 @@ "sound": "rattle!", "sound_fail": "thump!", "ter_set": "t_null", - "items": [ { "item": "wire", "count": [ 4, 6 ] }, { "item": "2x4", "count": [ 2, 4 ] } ] + "items": [ { "item": "wire", "count": [ 4, 6 ] }, { "item": "2x4", "count": [ 2, 4 ] }, { "item": "hinge", "count": [ 1, 2 ] } ] } }, { @@ -3165,7 +3293,12 @@ "sound": "crash!", "sound_fail": "wham!", "ter_set": "t_door_frame", - "items": [ { "item": "2x4", "count": [ 1, 8 ] }, { "item": "nail", "charges": [ 2, 20 ] }, { "item": "splinter", "count": 1 } ] + "items": [ + { "item": "2x4", "count": [ 1, 8 ] }, + { "item": "nail", "charges": [ 2, 20 ] }, + { "item": "splinter", "count": 1 }, + { "item": "hinge", "count": [ 1, 2 ] } + ] } }, { @@ -3241,7 +3374,12 @@ "sound": "crash!", "sound_fail": "wham!", "ter_set": "t_door_b", - "items": [ { "item": "2x4", "count": [ 2, 16 ] }, { "item": "nail", "charges": [ 6, 54 ] }, { "item": "splinter", "count": 1 } ] + "items": [ + { "item": "2x4", "count": [ 2, 16 ] }, + { "item": "nail", "charges": [ 6, 54 ] }, + { "item": "splinter", "count": 1 }, + { "item": "hinge", "count": [ 0, 1 ] } + ] } }, { @@ -3268,7 +3406,8 @@ { "item": "peephole", "prob": 75 }, { "item": "2x4", "count": [ 1, 8 ] }, { "item": "nail", "charges": [ 2, 20 ] }, - { "item": "splinter", "count": 1 } + { "item": "splinter", "count": 1 }, + { "item": "hinge", "count": [ 1, 2 ] } ] } }, @@ -3284,6 +3423,52 @@ "roof": "t_flat_roof", "flags": [ "NOITEM", "DOOR", "CONNECT_TO_WALL", "MINEABLE", "BLOCK_WIND" ], "open": "t_door_metal_o", + "bash": { + "str_min": 80, + "str_max": 250, + "sound": "metal screeching!", + "sound_fail": "clang!", + "ter_set": "t_mdoor_frame", + "items": [ + { "item": "scrap", "count": [ 12, 24 ] }, + { "item": "steel_plate", "prob": 75 }, + { "item": "hinge", "count": [ 1, 3 ] } + ] + } + }, + { + "type": "terrain", + "id": "t_secretdoor_metal_c", + "name": "metal wall", + "description": "An industrially fabricated thick sheet carefully positioned and joined seamlessly with perimeter sealant, this wall is capable of resisting extreme elements as well as hostile forces. Blast load rated and extremely fire-retardant, breaching will require specialized tools or industrial vehicles.", + "symbol": "LINE_OXOX", + "looks_like": "t_wall_metal", + "color": "cyan", + "move_cost": 0, + "roof": "t_metal_floor", + "flags": [ "NOITEM", "DOOR", "CONNECT_TO_WALL", "AUTO_WALL_SYMBOL", "MINEABLE" ], + "open": "t_secretdoor_metal_o", + "bash": { + "str_min": 80, + "str_max": 250, + "sound": "metal screeching!", + "sound_fail": "clang!", + "ter_set": "t_mdoor_frame", + "items": [ { "item": "scrap", "count": [ 12, 24 ] }, { "item": "steel_plate", "prob": 75 } ] + } + }, + { + "type": "terrain", + "id": "t_secretdoor_metal_o", + "name": "open secret door", + "looks_like": "t_mdoor_frame", + "description": "This apparently normal segment of metal wall has opened to reveal a secret passage.", + "symbol": "'", + "color": "cyan", + "move_cost": 2, + "roof": "t_metal_floor", + "flags": [ "TRANSPARENT", "FLAT", "CONNECT_TO_WALL", "ROAD", "MINEABLE" ], + "close": "t_secretdoor_metal_c", "bash": { "str_min": 80, "str_max": 250, @@ -3311,7 +3496,11 @@ "sound": "metal screeching!", "sound_fail": "clang!", "ter_set": "t_mdoor_lab_frame", - "items": [ { "item": "scrap", "count": [ 12, 24 ] }, { "item": "steel_plate", "prob": 75 } ] + "items": [ + { "item": "scrap", "count": [ 12, 24 ] }, + { "item": "steel_plate", "prob": 75 }, + { "item": "hinge", "count": [ 1, 3 ] } + ] } }, { @@ -3331,7 +3520,11 @@ "sound": "metal screeching!", "sound_fail": "clang!", "ter_set": "t_mdoor_frame", - "items": [ { "item": "scrap", "count": [ 12, 24 ] }, { "item": "steel_plate", "prob": 75 } ] + "items": [ + { "item": "scrap", "count": [ 12, 24 ] }, + { "item": "steel_plate", "prob": 75 }, + { "item": "hinge", "count": [ 1, 3 ] } + ] } }, { @@ -3351,7 +3544,11 @@ "sound": "metal screeching!", "sound_fail": "clang!", "ter_set": "t_mdoor_lab_frame", - "items": [ { "item": "scrap", "count": [ 12, 24 ] }, { "item": "steel_plate", "prob": 75 } ] + "items": [ + { "item": "scrap", "count": [ 12, 24 ] }, + { "item": "steel_plate", "prob": 75 }, + { "item": "hinge", "count": [ 1, 3 ] } + ] } }, { @@ -3373,7 +3570,12 @@ "sound": "metal screeching!", "sound_fail": "clang!", "ter_set": "t_mdoor_frame", - "items": [ { "item": "peephole", "prob": 75 }, { "item": "scrap", "count": [ 12, 24 ] }, { "item": "steel_plate", "prob": 75 } ] + "items": [ + { "item": "peephole", "prob": 75 }, + { "item": "scrap", "count": [ 12, 24 ] }, + { "item": "steel_plate", "prob": 75 }, + { "item": "hinge", "count": [ 1, 3 ] } + ] } }, { @@ -3393,7 +3595,12 @@ "sound": "metal screeching!", "sound_fail": "clang!", "ter_set": "t_mdoor_frame", - "items": [ { "item": "peephole", "prob": 75 }, { "item": "scrap", "count": [ 12, 24 ] }, { "item": "steel_plate", "prob": 75 } ] + "items": [ + { "item": "peephole", "prob": 75 }, + { "item": "scrap", "count": [ 12, 24 ] }, + { "item": "steel_plate", "prob": 75 }, + { "item": "hinge", "count": [ 1, 3 ] } + ] } }, { @@ -3414,7 +3621,11 @@ "sound": "metal screeching!", "sound_fail": "clang!", "ter_set": "t_mdoor_frame", - "items": [ { "item": "scrap", "count": [ 12, 24 ] }, { "item": "steel_plate", "prob": 75 } ] + "items": [ + { "item": "scrap", "count": [ 12, 24 ] }, + { "item": "steel_plate", "prob": 75 }, + { "item": "hinge", "count": [ 1, 3 ] } + ] } }, { @@ -3436,7 +3647,11 @@ "sound": "metal screeching!", "sound_fail": "clang!", "ter_set": "t_mdoor_frame", - "items": [ { "item": "scrap", "count": [ 12, 24 ] }, { "item": "steel_plate", "prob": 75 } ] + "items": [ + { "item": "scrap", "count": [ 12, 24 ] }, + { "item": "steel_plate", "prob": 75 }, + { "item": "hinge", "count": [ 1, 3 ] } + ] } }, { @@ -3460,7 +3675,11 @@ "sound": "metal screeching!", "sound_fail": "clang!", "ter_set": "t_floor", - "items": [ { "item": "steel_chunk", "count": [ 1, 4 ] }, { "item": "scrap", "count": [ 3, 12 ] } ] + "items": [ + { "item": "steel_chunk", "count": [ 1, 4 ] }, + { "item": "scrap", "count": [ 3, 12 ] }, + { "item": "hinge", "count": [ 1, 2 ] } + ] } }, { @@ -3482,7 +3701,11 @@ "sound": "metal screeching!", "sound_fail": "clang!", "ter_set": "t_mdoor_frame", - "items": [ { "item": "steel_chunk", "count": [ 1, 4 ] }, { "item": "scrap", "count": [ 3, 12 ] } ] + "items": [ + { "item": "steel_chunk", "count": [ 1, 4 ] }, + { "item": "scrap", "count": [ 3, 12 ] }, + { "item": "hinge", "count": [ 1, 2 ] } + ] } }, { @@ -3504,7 +3727,11 @@ "sound": "metal screeching!", "sound_fail": "clang!", "ter_set": "t_mdoor_frame", - "items": [ { "item": "steel_chunk", "count": [ 1, 4 ] }, { "item": "scrap", "count": [ 3, 12 ] } ] + "items": [ + { "item": "steel_chunk", "count": [ 1, 4 ] }, + { "item": "scrap", "count": [ 3, 12 ] }, + { "item": "hinge", "count": [ 1, 2 ] } + ] } }, { @@ -6770,7 +6997,7 @@ "type": "terrain", "id": "t_fungus_floor_in", "name": "fungal floor", - "description": "Greyish mold coats both the floor and the roof here, silent and still. Stray spores waft through the air.", + "description": "Grayish mold coats both the floor and the roof here, silent and still. Stray spores waft through the air.", "//": "roofed", "symbol": ".", "color": "light_gray", @@ -6782,7 +7009,7 @@ "type": "terrain", "id": "t_fungus_floor_sup", "name": "fungal floor", - "description": "Greyish mold coats the floor here, silent and still.", + "description": "Grayish mold coats the floor here, silent and still.", "//": "supports", "symbol": ".", "color": "light_gray", @@ -6794,7 +7021,7 @@ "type": "terrain", "id": "t_fungus_floor_out", "name": "fungal floor", - "description": "Greyish mold coats the ground here, silent and still.", + "description": "Grayish mold coats the ground here, silent and still.", "//": "outside", "symbol": ".", "color": "light_gray", @@ -6842,7 +7069,7 @@ "type": "terrain", "id": "t_shrub_fungal", "name": "fungal shrub", - "description": "This shrub has been completely absorbed by the mushrooms. Its branches droop and have lost much of their structure, and its leaves have vanished, replaced by fleshy grey sacks that visibly expand and contract.", + "description": "This shrub has been completely absorbed by the mushrooms. Its branches droop and have lost much of their structure, and its leaves have vanished, replaced by fleshy gray sacks that visibly expand and contract.", "symbol": "#", "color": "dark_gray", "move_cost": 8, @@ -7905,6 +8132,111 @@ "items": [ { "item": "glass_shard", "count": [ 5, 10 ] }, { "item": "scrap", "count": [ 0, 2 ] } ] } }, + { + "type": "terrain", + "id": "t_wood_stairs_down", + "name": "wooden stairs", + "description": "A wooden staircase leading down.", + "symbol": ">", + "color": "light_red", + "move_cost": 2, + "flags": [ "TRANSPARENT", "FLAMMABLE_ASH", "GOES_DOWN", "PLACE_ITEM" ], + "bash": { + "str_min": 10, + "str_max": 70, + "sound": "crunch!", + "sound_fail": "whump!", + "ter_set": "t_open_air", + "items": [ + { "item": "2x4", "count": [ 0, 2 ] }, + { "item": "nail", "charges": [ 0, 5 ] }, + { "item": "splinter", "count": [ 2, 8 ] } + ] + }, + "deconstruct": { "ter_set": "t_open_air", "items": [ { "item": "nail", "charges": [ 4, 8 ] }, { "item": "2x4", "count": [ 0, 4 ] } ] } + }, + { + "type": "terrain", + "id": "t_wood_stairs_up_half", + "name": "half-built wooden stairs", + "description": "Half of a wooden staircase. Some work still needs to be done before this staircase is complete.", + "symbol": "<", + "color": "light_red", + "move_cost": 4, + "flags": [ "TRANSPARENT", "FLAMMABLE_ASH", "PLACE_ITEM" ], + "deconstruct": { + "deconstruct_above": true, + "ter_set": "t_floor", + "items": [ { "item": "nail", "charges": [ 12, 20 ] }, { "item": "2x4", "count": [ 2, 6 ] } ] + }, + "bash": { + "str_min": 10, + "str_max": 70, + "sound": "crunch!", + "sound_fail": "whump!", + "ter_set": "t_floor", + "items": [ + { "item": "2x4", "count": [ 0, 5 ] }, + { "item": "nail", "charges": [ 0, 5 ] }, + { "item": "splinter", "count": [ 5, 10 ] } + ] + } + }, + { + "type": "terrain", + "id": "t_wood_stairs_up_broken", + "name": "broken wooden stairs", + "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 staircase.", + "symbol": "<", + "color": "light_red", + "move_cost": 2, + "flags": [ "TRANSPARENT", "FLAMMABLE_ASH", "PLACE_ITEM" ], + "bash": { + "str_min": 8, + "str_max": 110, + "sound": "crunch!", + "sound_fail": "whump!", + "ter_set": "t_floor", + "items": [ + { "item": "2x4", "count": [ 0, 2 ] }, + { "item": "wood_panel", "count": [ 0, 1 ] }, + { "item": "nail", "charges": [ 0, 5 ] }, + { "item": "splinter", "count": [ 2, 8 ] } + ] + } + }, + { + "type": "terrain", + "id": "t_wood_stairs_up", + "name": "wooden stairs", + "description": "A wooden staircase leading up", + "symbol": "<", + "color": "light_red", + "move_cost": 2, + "flags": [ "TRANSPARENT", "FLAMMABLE_ASH", "GOES_UP", "PLACE_ITEM" ], + "deconstruct": { + "deconstruct_above": true, + "ter_set": "t_floor", + "items": [ + { "item": "nail", "charges": [ 12, 20 ] }, + { "item": "2x4", "count": [ 8, 12 ] }, + { "item": "wood_panel", "count": [ 1, 3 ] } + ] + }, + "bash": { + "str_min": 12, + "str_max": 150, + "sound": "crunch!", + "sound_fail": "whump!", + "ter_set": "t_wood_stairs_up_broken", + "items": [ + { "item": "2x4", "count": [ 0, 3 ] }, + { "item": "wood_panel", "count": [ 0, 2 ] }, + { "item": "nail", "charges": [ 1, 5 ] }, + { "item": "splinter", "count": [ 1, 4 ] } + ] + } + }, { "type": "terrain", "id": "t_stairs_down", @@ -8097,6 +8429,27 @@ "items": [ { "item": "plastic_chunk", "count": [ 0, 2 ] }, { "item": "scrap", "prob": 50 } ] } }, + { + "type": "terrain", + "id": "t_card_fp", + "looks_like": "t_card_science", + "name": "card reader", + "description": "This looks like the console controling the security door, there's a pretty big reading surface on it. You can see \"Fp\" soberly printed above the reader. You have no idea what could open it.", + "//": "FoodPlace", + "symbol": "6", + "color": "pink", + "move_cost": 0, + "flags": [ "NOITEM", "CONNECT_TO_WALL" ], + "examine_action": "cardreader_fp", + "bash": { + "str_min": 18, + "str_max": 180, + "sound": "crunch!", + "sound_fail": "whack!", + "ter_set": "t_card_reader_broken", + "items": [ { "item": "plastic_chunk", "count": [ 0, 2 ] }, { "item": "scrap", "prob": 50 } ] + } + }, { "type": "terrain", "id": "t_card_reader_broken", @@ -8401,6 +8754,52 @@ "flags": [ "TRANSPARENT", "PERMEABLE" ], "examine_action": "fswitch" }, + { + "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.", + "symbol": ".", + "color": "light_gray", + "looks_like": "t_carpet_red", + "move_cost": 2, + "flags": [ "TRANSPARENT", "FLAMMABLE_HARD", "SUPPORTS_ROOF", "COLLAPSES", "INDOORS", "FLAT", "RUG" ], + "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 ] } + ] + } + }, { "type": "terrain", "id": "t_carpet_red", @@ -8481,7 +8880,7 @@ "type": "terrain", "id": "t_linoleum_white", "name": "linoleum tile", - "description": "A section of flooring made out of a tough, rubbery material. Coloured a simple white.", + "description": "A section of flooring made out of a tough, rubbery material. Colored a simple white.", "symbol": ".", "color": "white", "move_cost": 2, @@ -8620,6 +9019,26 @@ "items": "wall_bash_results" } }, + { + "type": "terrain", + "id": "t_wall_p", + "aliases": [ "t_wall_h_p", "t_wall_v_p" ], + "name": "pink wall", + "description": "Wall painted pink.", + "symbol": "LINE_OXOX", + "color": "pink", + "move_cost": 0, + "coverage": 100, + "flags": [ "FLAMMABLE", "NOITEM", "SUPPORTS_ROOF", "WALL", "CHIP", "AUTO_WALL_SYMBOL", "MINEABLE", "BLOCK_WIND" ], + "bash": { + "str_min": 30, + "str_max": 210, + "sound": "crash!", + "sound_fail": "whump!", + "ter_set": "t_null", + "items": "wall_bash_results" + } + }, { "type": "terrain", "id": "t_wall_p", @@ -10798,7 +11217,12 @@ "open": "t_splitrail_fencegate_o", "deconstruct": { "ter_set": "t_dirt", - "items": [ { "item": "2x4", "count": 5 }, { "item": "pointy_stick", "count": 2 }, { "item": "nail", "charges": 12 } ] + "items": [ + { "item": "2x4", "count": 5 }, + { "item": "pointy_stick", "count": 2 }, + { "item": "nail", "charges": 12 }, + { "item": "hinge", "count": [ 1, 2 ] } + ] }, "bash": { "str_min": 4, @@ -10811,7 +11235,8 @@ "items": [ { "item": "2x4", "count": [ 1, 4 ] }, { "item": "nail", "charges": [ 2, 8 ] }, - { "item": "splinter", "count": [ 1, 2 ] } + { "item": "splinter", "count": [ 1, 2 ] }, + { "item": "hinge", "count": [ 1, 2 ] } ] } }, @@ -10829,7 +11254,12 @@ "close": "t_splitrail_fencegate_c", "deconstruct": { "ter_set": "t_dirt", - "items": [ { "item": "2x4", "count": 5 }, { "item": "pointy_stick", "count": 2 }, { "item": "nail", "charges": 12 } ] + "items": [ + { "item": "2x4", "count": 5 }, + { "item": "pointy_stick", "count": 2 }, + { "item": "nail", "charges": 12 }, + { "item": "hinge", "count": [ 1, 2 ] } + ] } }, { @@ -10845,14 +11275,17 @@ "examine_action": "chainfence", "flags": [ "NOITEM", "CLIMBABLE", "PERMEABLE", "AUTO_WALL_SYMBOL", "FLAMMABLE_ASH", "THIN_OBSTACLE" ], "connects_to": "WOODFENCE", - "deconstruct": { "ter_set": "t_fence_post", "items": [ { "item": "2x4", "count": 10 }, { "item": "nail", "charges": 20 } ] }, + "deconstruct": { + "ter_set": "t_fence_post", + "items": [ { "item": "2x4", "count": 10 }, { "item": "nail", "charges": 20 }, { "item": "hinge", "count": [ 1, 2 ] } ] + }, "bash": { "str_min": 5, "str_max": 12, "sound": "whump!", "sound_fail": "whack!", "ter_set": "t_fence_post", - "items": [ { "item": "2x4", "count": [ 4, 10 ] } ] + "items": [ { "item": "2x4", "count": [ 4, 10 ] }, { "item": "hinge", "count": [ 1, 2 ] } ] } }, { @@ -10870,7 +11303,12 @@ "open": "t_privacy_fencegate_o", "deconstruct": { "ter_set": "t_dirt", - "items": [ { "item": "2x4", "count": 8 }, { "item": "pointy_stick", "count": 2 }, { "item": "nail", "charges": 20 } ] + "items": [ + { "item": "2x4", "count": 8 }, + { "item": "pointy_stick", "count": 2 }, + { "item": "nail", "charges": 20 }, + { "item": "hinge", "count": [ 1, 2 ] } + ] }, "bash": { "str_min": 4, @@ -10883,7 +11321,8 @@ "items": [ { "item": "2x4", "count": [ 4, 8 ] }, { "item": "nail", "charges": [ 10, 20 ] }, - { "item": "splinter", "count": [ 4, 6 ] } + { "item": "splinter", "count": [ 4, 6 ] }, + { "item": "hinge", "count": [ 1, 2 ] } ] } }, @@ -10901,7 +11340,12 @@ "close": "t_privacy_fencegate_c", "deconstruct": { "ter_set": "t_dirt", - "items": [ { "item": "2x4", "count": 8 }, { "item": "pointy_stick", "count": 2 }, { "item": "nail", "charges": 20 } ] + "items": [ + { "item": "2x4", "count": 8 }, + { "item": "pointy_stick", "count": 2 }, + { "item": "nail", "charges": 20 }, + { "item": "hinge", "count": [ 1, 2 ] } + ] } }, { diff --git a/data/json/uncraft/ammo/10mm.json b/data/json/uncraft/ammo/10mm.json index 4443752c21be6..ccd8f575872f5 100644 --- a/data/json/uncraft/ammo/10mm.json +++ b/data/json/uncraft/ammo/10mm.json @@ -1,10 +1,10 @@ [ { - "result": "10mm", + "result": "10mm_fmj", "type": "uncraft", "time": 500, "qualities": [ { "id": "PULL", "level": 1 } ], - "components": [ [ [ "lead", 2 ] ], [ [ "40_casing", 1 ] ], [ [ "smpistol_primer", 1 ] ], [ [ "gunpowder", 5 ] ] ], + "components": [ [ [ "lead", 2 ] ], [ [ "10mm_casing", 1 ] ], [ [ "smpistol_primer", 1 ] ], [ [ "gunpowder", 5 ] ] ], "flags": [ "UNCRAFT_SINGLE_CHARGE" ] } ] diff --git a/data/json/uncraft/ammo/270.json b/data/json/uncraft/ammo/270win.json similarity index 77% rename from data/json/uncraft/ammo/270.json rename to data/json/uncraft/ammo/270win.json index 4e2aa22b316b9..bf8bec409731e 100644 --- a/data/json/uncraft/ammo/270.json +++ b/data/json/uncraft/ammo/270win.json @@ -1,6 +1,6 @@ [ { - "result": "270", + "result": "270win_jsp", "type": "uncraft", "skill_used": "gun", "difficulty": 5, @@ -8,10 +8,10 @@ "qualities": [ { "id": "PULL", "level": 1 } ], "components": [ [ [ "lead", 5 ] ], - [ [ "3006_casing", 1 ] ], + [ [ "270win_casing", 1 ] ], [ [ "lgrifle_primer", 1 ] ], [ [ "gunpowder", 10 ] ], - [ [ "copper", 5 ] ] + [ [ "copper", 3 ] ] ], "flags": [ "UNCRAFT_SINGLE_CHARGE" ] } diff --git a/data/json/uncraft/ammo/38super.json b/data/json/uncraft/ammo/38super.json new file mode 100644 index 0000000000000..d76b4f831346b --- /dev/null +++ b/data/json/uncraft/ammo/38super.json @@ -0,0 +1,12 @@ +[ + { + "result": "38super_fmj", + "type": "uncraft", + "skill_used": "gun", + "difficulty": 5, + "time": 500, + "qualities": [ { "id": "PULL", "level": 1 } ], + "components": [ [ [ "lead", 2 ] ], [ [ "38super_casing", 1 ] ], [ [ "smpistol_primer", 1 ] ], [ [ "gunpowder", 3 ] ] ], + "flags": [ "UNCRAFT_SINGLE_CHARGE" ] + } +] diff --git a/data/json/uncraft/ammo/410shot.json b/data/json/uncraft/ammo/410shot.json new file mode 100644 index 0000000000000..a3f888c4e0052 --- /dev/null +++ b/data/json/uncraft/ammo/410shot.json @@ -0,0 +1,12 @@ +[ + { + "result": "410shot_000", + "type": "uncraft", + "skill_used": "gun", + "difficulty": 5, + "time": 100, + "qualities": [ { "id": "PULL", "level": 1 } ], + "components": [ [ [ "410shot_hull", 1 ] ], [ [ "shotgun_primer", 1 ] ], [ [ "gunpowder", 5 ] ], [ [ "lead", 5 ] ] ], + "flags": [ "UNCRAFT_SINGLE_CHARGE" ] + } +] diff --git a/data/json/uncraft/ammo/45colt.json b/data/json/uncraft/ammo/45colt.json new file mode 100644 index 0000000000000..2f67622036f70 --- /dev/null +++ b/data/json/uncraft/ammo/45colt.json @@ -0,0 +1,10 @@ +[ + { + "result": "45colt_jhp", + "type": "uncraft", + "time": 500, + "qualities": [ { "id": "PULL", "level": 1 } ], + "components": [ [ [ "lead", 5 ] ], [ [ "45colt_casing", 1 ] ], [ [ "lgpistol_primer", 1 ] ], [ [ "gunpowder", 4 ] ] ], + "flags": [ "UNCRAFT_SINGLE_CHARGE" ] + } +] diff --git a/data/json/uncraft/ammo/shot.json b/data/json/uncraft/ammo/shot.json index ae2300370e549..eaee2d6d688a3 100644 --- a/data/json/uncraft/ammo/shot.json +++ b/data/json/uncraft/ammo/shot.json @@ -29,6 +29,16 @@ "components": [ [ [ "shot_hull", 1 ] ], [ [ "shotgun_primer", 1 ] ], [ [ "gunpowder", 3 ] ], [ [ "lead", 10 ] ] ], "flags": [ "UNCRAFT_SINGLE_CHARGE" ] }, + { + "result": "shot_dragon", + "type": "uncraft", + "skill_used": "gun", + "difficulty": 5, + "time": 100, + "qualities": [ { "id": "PULL", "level": 1 } ], + "components": [ [ [ "shot_hull", 1 ] ], [ [ "shotgun_primer", 1 ] ], [ [ "gunpowder", 3 ] ], [ [ "magnesium", 5 ] ] ], + "flags": [ "UNCRAFT_SINGLE_CHARGE" ] + }, { "result": "shot_flechette", "type": "uncraft", diff --git a/data/json/vehicle_groups.json b/data/json/vehicle_groups.json index 132514e908457..fb214134f2d23 100644 --- a/data/json/vehicle_groups.json +++ b/data/json/vehicle_groups.json @@ -43,6 +43,7 @@ [ "security_van", 500 ], [ "schoolbus", 100 ], [ "bus", 500 ], + [ "bus_tour", 50 ], [ "rv", 500 ], [ "limousine", 200 ], [ "lux_rv", 100 ], @@ -119,6 +120,7 @@ [ "aapc-gl", 50 ], [ "schoolbus", 50 ], [ "bus", 350 ], + [ "bus_tour", 25 ], [ "rv", 800 ], [ "limousine", 200 ], [ "lux_rv", 100 ], @@ -180,6 +182,7 @@ [ "rv", 200 ], [ "limousine", 100 ], [ "schoolbus", 200 ], + [ "bus_tour", 50 ], [ "fire_truck", 200 ], [ "policecar", 100 ], [ "policecar_k9", 1 ], @@ -483,7 +486,7 @@ { "type": "vehicle_group", "id": "buses", - "vehicles": [ [ "bus", 1000 ], [ "schoolbus", 100 ] ] + "vehicles": [ [ "bus", 1000 ], [ "schoolbus", 100 ], [ "bus_tour", 50 ] ] }, { "type": "vehicle_group", diff --git a/data/json/vehicle_parts.json b/data/json/vehicleparts/vehicle_parts.json similarity index 100% rename from data/json/vehicle_parts.json rename to data/json/vehicleparts/vehicle_parts.json diff --git a/data/json/vehicles/vans_busses.json b/data/json/vehicles/vans_busses.json index 6af26258b9c6d..45056a652e4f5 100644 --- a/data/json/vehicles/vans_busses.json +++ b/data/json/vehicles/vans_busses.json @@ -1766,6 +1766,243 @@ { "x": -10, "y": 2, "chance": 35, "item_groups": [ "bus_common" ] } ] }, + { + "id": "bus_tour", + "type": "vehicle", + "name": "Tour Bus", + "blueprint": [ + [ " o" ], + [ "''O-------'''O" ], + [ "'##&|BB|TT##'H" ], + [ "'#tl+..+.l..'>" ], + [ "'##&|BB|###.'H" ], + [ "''O-----'''+'O" ], + [ " o" ] + ], + "parts": [ + { "x": 0, "y": 1, "part": "frame_vertical_2" }, + { "x": 0, "y": 1, "part": "aisle_vertical" }, + { "x": 0, "y": 1, "part": "roof" }, + { "x": 0, "y": 2, "part": "frame_vertical_2" }, + { "x": 0, "y": 2, "part": "aisle_horizontal" }, + { "x": 0, "y": 2, "part": "roof" }, + { "x": 0, "y": 3, "part": "frame_vertical" }, + { "x": 0, "y": 3, "part": "door" }, + { "x": 0, "y": 0, "part": "frame_vertical_2" }, + { "x": 0, "y": 0, "part": "seat" }, + { "x": 0, "y": 0, "part": "controls" }, + { "x": 0, "y": 0, "part": "dashboard" }, + { "x": 0, "y": 0, "part": "vehicle_clock" }, + { "x": 0, "y": 0, "part": "vehicle_alarm" }, + { "x": 0, "y": 0, "part": "horn_car" }, + { "x": 0, "y": 0, "part": "seatbelt" }, + { "x": 0, "y": 0, "part": "stereo" }, + { "x": 0, "y": 0, "part": "roof" }, + { "x": 0, "y": -1, "part": "frame_vertical" }, + { "x": 0, "y": -1, "part": "windshield" }, + { "x": 1, "y": -1, "part": "frame_horizontal" }, + { "x": 1, "y": -1, "part": "windshield" }, + { "x": 1, "y": 0, "part": "frame_horizontal" }, + { "x": 1, "y": 0, "part": "windshield" }, + { "x": 1, "y": -2, "part": "wing_mirror" }, + { "x": 1, "y": 1, "part": "frame_horizontal" }, + { "x": 1, "y": 1, "part": "windshield" }, + { "x": 1, "y": 1, "part": "inboard_mirror" }, + { "x": 1, "y": 2, "part": "frame_horizontal" }, + { "x": 1, "y": 2, "part": "windshield" }, + { "x": 1, "y": 3, "part": "frame_horizontal" }, + { "x": 1, "y": 3, "part": "windshield" }, + { "x": 1, "y": 4, "part": "wing_mirror" }, + { "x": 2, "y": -1, "part": "frame_nw" }, + { "x": 2, "y": -1, "part": "halfboard_nw" }, + { "x": 2, "y": -1, "part": "wheel_wide_steerable" }, + { "x": 2, "y": 0, "part": "frame_horizontal_2" }, + { "x": 2, "y": 0, "part": "halfboard_horizontal_2" }, + { "x": 2, "y": 0, "part": "headlight" }, + { "x": 2, "y": 1, "part": "frame_cover" }, + { "x": 2, "y": 1, "part": "halfboard_cover" }, + { "x": 2, "y": 1, "part": "diesel_engine_v6" }, + { "x": 2, "y": 1, "part": "alternator_truck" }, + { "x": 2, "y": 1, "part": "battery_car" }, + { "x": 2, "y": 2, "part": "frame_horizontal_2" }, + { "x": 2, "y": 2, "part": "halfboard_horizontal_2" }, + { "x": 2, "y": 2, "part": "headlight" }, + { "x": 2, "y": 3, "part": "frame_ne" }, + { "x": 2, "y": 3, "part": "halfboard_ne" }, + { "x": 2, "y": 3, "part": "wheel_wide_steerable" }, + { "x": -1, "y": -1, "part": "frame_vertical" }, + { "x": -1, "y": -1, "part": "board_vertical" }, + { "x": -1, "y": 0, "part": "frame_horizontal_2" }, + { "x": -1, "y": 0, "part": "board_horizontal" }, + { "x": -1, "y": 0, "part": "roof" }, + { "x": -1, "y": 1, "part": "frame_vertical_2" }, + { "x": -1, "y": 1, "part": "aisle_vertical" }, + { "x": -1, "y": 1, "part": "roof" }, + { "x": -1, "y": 2, "part": "frame_horizontal_2" }, + { "x": -1, "y": 2, "part": "seat" }, + { "x": -1, "y": 2, "part": "roof" }, + { "x": -1, "y": 3, "part": "frame_vertical" }, + { "x": -1, "y": 3, "part": "windshield" }, + { "x": -1, "y": 3, "part": "tank", "fuel": "diesel" }, + { "x": -2, "y": -1, "part": "frame_vertical" }, + { "x": -2, "y": -1, "part": "board_vertical" }, + { "x": -2, "y": 0, "part": "frame_horizontal_2" }, + { "x": -2, "y": 0, "part": "trunk" }, + { "x": -2, "y": 0, "part": "roof" }, + { "x": -2, "y": 1, "part": "frame_vertical_2" }, + { "x": -2, "y": 1, "part": "aisle_vertical" }, + { "x": -2, "y": 1, "part": "aisle_lights" }, + { "x": -2, "y": 1, "part": "roof" }, + { "x": -2, "y": 2, "part": "frame_horizontal_2" }, + { "x": -2, "y": 2, "part": "seat" }, + { "x": -2, "y": 2, "part": "roof" }, + { "x": -2, "y": 3, "part": "frame_vertical" }, + { "x": -2, "y": 3, "part": "windshield" }, + { "x": -2, "y": 3, "part": "tank", "fuel": "diesel" }, + { "x": -3, "y": -1, "part": "frame_vertical" }, + { "x": -3, "y": -1, "part": "board_vertical" }, + { "x": -3, "y": 0, "part": "frame_horizontal_2" }, + { "x": -3, "y": 0, "part": "trunk" }, + { "x": -3, "y": 0, "part": "roof" }, + { "x": -3, "y": 1, "part": "frame_vertical_2" }, + { "x": -3, "y": 1, "part": "aisle_vertical" }, + { "x": -3, "y": 1, "part": "roof" }, + { "x": -3, "y": 2, "part": "frame_horizontal_2" }, + { "x": -3, "y": 2, "part": "seat" }, + { "x": -3, "y": 2, "part": "roof" }, + { "x": -3, "y": 3, "part": "frame_vertical" }, + { "x": -3, "y": 3, "part": "windshield" }, + { "x": -4, "y": -1, "part": "frame_vertical" }, + { "x": -4, "y": -1, "part": "board_vertical" }, + { "x": -4, "y": 0, "part": "frame_horizontal_2" }, + { "x": -4, "y": 0, "part": "stowboard_horizontal" }, + { "x": -4, "y": 0, "part": "roof" }, + { "x": -4, "y": 1, "part": "frame_vertical_2" }, + { "x": -4, "y": 1, "part": "aisle_curtain" }, + { "x": -4, "y": 1, "part": "roof" }, + { "x": -4, "y": 2, "part": "frame_horizontal_2" }, + { "x": -4, "y": 2, "part": "stowboard_horizontal" }, + { "x": -4, "y": 2, "part": "roof" }, + { "x": -4, "y": 3, "part": "frame_vertical" }, + { "x": -4, "y": 3, "part": "board_vertical" }, + { "x": -5, "y": -1, "part": "frame_vertical" }, + { "x": -5, "y": -1, "part": "board_vertical" }, + { "x": -5, "y": 0, "part": "frame_horizontal_2" }, + { "x": -5, "y": 0, "part": "bed" }, + { "x": -5, "y": 0, "part": "roof" }, + { "x": -5, "y": 1, "part": "frame_vertical_2" }, + { "x": -5, "y": 1, "part": "aisle_vertical" }, + { "x": -5, "y": 1, "part": "roof" }, + { "x": -5, "y": 2, "part": "frame_horizontal_2" }, + { "x": -5, "y": 2, "part": "bed" }, + { "x": -5, "y": 2, "part": "roof" }, + { "x": -5, "y": 3, "part": "frame_vertical" }, + { "x": -5, "y": 3, "part": "board_vertical" }, + { "x": -6, "y": -1, "part": "frame_horizontal" }, + { "x": -6, "y": -1, "part": "wheel_wide" }, + { "x": -6, "y": -1, "part": "board_vertical" }, + { "x": -6, "y": 0, "part": "frame_horizontal_2" }, + { "x": -6, "y": 0, "part": "bed" }, + { "x": -6, "y": 0, "part": "roof" }, + { "x": -6, "y": 1, "part": "frame_vertical_2" }, + { "x": -6, "y": 1, "part": "aisle_vertical" }, + { "x": -6, "y": 1, "part": "roof" }, + { "x": -6, "y": 2, "part": "frame_horizontal_2" }, + { "x": -6, "y": 2, "part": "bed" }, + { "x": -6, "y": 2, "part": "roof" }, + { "x": -6, "y": 3, "part": "frame_horizontal" }, + { "x": -6, "y": 3, "part": "wheel_wide" }, + { "x": -6, "y": 3, "part": "board_vertical" }, + { "x": -7, "y": -1, "part": "frame_vertical" }, + { "x": -7, "y": -1, "part": "board_vertical" }, + { "x": -7, "y": 0, "part": "frame_horizontal_2" }, + { "x": -7, "y": 0, "part": "board_horizontal" }, + { "x": -7, "y": 0, "part": "roof" }, + { "x": -7, "y": 1, "part": "frame_vertical_2" }, + { "x": -7, "y": 1, "part": "aisle_curtain" }, + { "x": -7, "y": 1, "part": "roof" }, + { "x": -7, "y": 2, "part": "frame_horizontal_2" }, + { "x": -7, "y": 2, "part": "board_horizontal" }, + { "x": -7, "y": 2, "part": "storage_battery" }, + { "x": -7, "y": 2, "part": "roof" }, + { "x": -7, "y": 3, "part": "frame_vertical" }, + { "x": -7, "y": 3, "part": "board_vertical" }, + { "x": -8, "y": -1, "part": "frame_vertical" }, + { "x": -8, "y": -1, "part": "windshield" }, + { "x": -8, "y": 0, "part": "frame_horizontal_2" }, + { "x": -8, "y": 0, "part": "kitchen_unit" }, + { "x": -8, "y": 0, "part": "roof" }, + { "x": -8, "y": 1, "part": "frame_vertical_2" }, + { "x": -8, "y": 1, "part": "trunk_floor" }, + { "x": -8, "y": 1, "part": "aisle_lights" }, + { "x": -8, "y": 1, "part": "roof" }, + { "x": -8, "y": 2, "part": "frame_horizontal_2" }, + { "x": -8, "y": 2, "part": "minifridge" }, + { "x": -8, "y": 2, "part": "roof" }, + { "x": -8, "y": 3, "part": "frame_vertical" }, + { "x": -8, "y": 3, "part": "windshield" }, + { "x": -9, "y": -1, "part": "frame_vertical" }, + { "x": -9, "y": -1, "part": "windshield" }, + { "x": -9, "y": 0, "part": "frame_horizontal_2" }, + { "x": -9, "y": 0, "part": "seat" }, + { "x": -9, "y": 0, "part": "roof" }, + { "x": -9, "y": 1, "part": "frame_vertical_2" }, + { "x": -9, "y": 1, "part": "veh_table" }, + { "x": -9, "y": 1, "part": "roof" }, + { "x": -9, "y": 2, "part": "frame_horizontal_2" }, + { "x": -9, "y": 2, "part": "seat" }, + { "x": -9, "y": 2, "part": "roof" }, + { "x": -9, "y": 3, "part": "frame_vertical" }, + { "x": -9, "y": 3, "part": "windshield" }, + { "x": -10, "y": -1, "part": "frame_vertical" }, + { "x": -10, "y": -1, "part": "tank", "fuel": "water_clean" }, + { "x": -10, "y": -1, "part": "windshield" }, + { "x": -10, "y": 0, "part": "frame_horizontal_2" }, + { "x": -10, "y": 0, "part": "seat" }, + { "x": -10, "y": 0, "part": "roof" }, + { "x": -10, "y": 1, "part": "frame_vertical_2" }, + { "x": -10, "y": 1, "part": "seat" }, + { "x": -10, "y": 1, "part": "roof" }, + { "x": -10, "y": 2, "part": "frame_horizontal_2" }, + { "x": -10, "y": 2, "part": "seat" }, + { "x": -10, "y": 2, "part": "roof" }, + { "x": -10, "y": 3, "part": "frame_vertical" }, + { "x": -10, "y": 3, "part": "windshield" }, + { "x": -11, "y": -1, "part": "frame_horizontal" }, + { "x": -11, "y": -1, "part": "board_sw" }, + { "x": -11, "y": 0, "part": "frame_horizontal" }, + { "x": -11, "y": 0, "part": "windshield" }, + { "x": -11, "y": 1, "part": "frame_vertical" }, + { "x": -11, "y": 1, "part": "windshield" }, + { "x": -11, "y": 2, "part": "frame_horizontal" }, + { "x": -11, "y": 2, "part": "windshield" }, + { "x": -11, "y": 3, "part": "frame_horizontal" }, + { "x": -11, "y": 3, "part": "beeper" }, + { "x": -11, "y": 3, "part": "board_se" } + ], + "items": [ + { "x": 0, "y": 0, "chance": 35, "item_groups": [ "bus_common" ] }, + { "x": -2, "y": 2, "chance": 35, "item_groups": [ "bus_common" ] }, + { "x": -2, "y": 0, "chance": 15, "item_groups": [ "car_kit" ] }, + { "x": -2, "y": 0, "chance": 15, "items": [ "jack", "wheel_wide" ] }, + { "x": -3, "y": 0, "chance": 25, "item_groups": [ "tools_home", "tools_electronics" ] }, + { "x": -3, "y": 0, "chance": 25, "items": [ "amplifier_head" ] }, + { "x": -3, "y": 2, "chance": 35, "item_groups": [ "bus_common" ] }, + { "x": -4, "y": 0, "chance": 50, "item_groups": [ "stash_drugs", "mussto_windinst", "mussto_stringinst" ] }, + { "x": -4, "y": 2, "chance": 50, "item_groups": [ "clothing_outdoor_set" ] }, + { "x": -5, "y": 0, "chance": 35, "item_groups": [ "bed" ] }, + { "x": -5, "y": 2, "chance": 35, "item_groups": [ "bed" ] }, + { "x": -6, "y": 0, "chance": 35, "item_groups": [ "bed" ] }, + { "x": -6, "y": 2, "chance": 35, "item_groups": [ "bed" ] }, + { "x": -8, "y": 2, "chance": 40, "item_groups": [ "fridgesnacks", "bar_alcohol" ] }, + { "x": -9, "y": 0, "chance": 35, "item_groups": [ "bus_common" ] }, + { "x": -9, "y": 1, "chance": 60, "items": [ "tshirt_tour" ] }, + { "x": -9, "y": 2, "chance": 35, "item_groups": [ "bus_common" ] }, + { "x": -10, "y": 0, "chance": 35, "item_groups": [ "bus_common" ] }, + { "x": -10, "y": 1, "chance": 35, "item_groups": [ "bus_common" ] }, + { "x": -10, "y": 2, "chance": 35, "item_groups": [ "bus_common" ] } + ] + }, { "id": "security_van", "type": "vehicle", diff --git a/data/mods/CRT_EXPANSION/martial/CRT_Bladework.json b/data/mods/CRT_EXPANSION/martial/CRT_Bladework.json index fcadacac2a4f0..7f805abf3a0a1 100644 --- a/data/mods/CRT_EXPANSION/martial/CRT_Bladework.json +++ b/data/mods/CRT_EXPANSION/martial/CRT_Bladework.json @@ -5,7 +5,8 @@ "type": "GENERIC", "name": "C.R.I.T Blade-work manual", "name_plural": "C.R.I.T Blade-work manuals", - "description": "An advanced military manual on C.R.I.T Blade-work." + "description": "An advanced military manual on C.R.I.T Blade-work.", + "book_data": { "martial_art": "style_crt_blade" } }, { "id": "book_martial", diff --git a/data/mods/CRT_EXPANSION/martial/CRT_EnforcementBuff.json b/data/mods/CRT_EXPANSION/martial/CRT_EnforcementBuff.json index f2f954019ac0c..22b1eee3c1653 100644 --- a/data/mods/CRT_EXPANSION/martial/CRT_EnforcementBuff.json +++ b/data/mods/CRT_EXPANSION/martial/CRT_EnforcementBuff.json @@ -5,7 +5,8 @@ "type": "GENERIC", "name": "C.R.I.T Enforcement manual", "name_plural": "C.R.I.T Enforcement manuals", - "description": "An advanced military manual on C.R.I.T Enforcer melee." + "description": "An advanced military manual on C.R.I.T Enforcer melee.", + "book_data": { "martial_art": "style_crt_enforcement" } }, { "id": "book_martial", diff --git a/data/mods/CRT_EXPANSION/martial/CRT_MeleeBuffs.json b/data/mods/CRT_EXPANSION/martial/CRT_MeleeBuffs.json index f9e0bddfcc1e0..c6613d8d7e2a5 100644 --- a/data/mods/CRT_EXPANSION/martial/CRT_MeleeBuffs.json +++ b/data/mods/CRT_EXPANSION/martial/CRT_MeleeBuffs.json @@ -5,7 +5,8 @@ "type": "GENERIC", "name": "C.R.I.T CQB manual", "name_plural": "C.R.I.T CQB manuals", - "description": "An advanced military manual on C.R.I.T general CQB." + "description": "An advanced military manual on C.R.I.T general CQB.", + "book_data": { "martial_art": "style_crt_cqb" } }, { "id": "book_martial", diff --git a/data/mods/Fuji_Structures/worldgen/gas/s_gas_b20.json b/data/mods/Fuji_Structures/worldgen/gas/s_gas_b20.json index 15bb4e3f4d220..ecb8f61dadbbe 100644 --- a/data/mods/Fuji_Structures/worldgen/gas/s_gas_b20.json +++ b/data/mods/Fuji_Structures/worldgen/gas/s_gas_b20.json @@ -124,7 +124,7 @@ { "monster": "GROUP_BUNKER", "x": [ 1, 22 ], "y": [ 1, 22 ], "density": 0.8 }, { "monster": "GROUP_SCI", "x": [ 1, 22 ], "y": [ 1, 22 ], "density": 0.5 } ], - "fields": { "l": { "field": "fd_nuke_gas", "density": 1, "age": 0 }, "L": { "field": "fd_nuke_gas", "density": 1, "age": 0 } } + "fields": { "l": { "field": "fd_nuke_gas", "intensity": 1, "age": 0 }, "L": { "field": "fd_nuke_gas", "intensity": 1, "age": 0 } } } } ] diff --git a/data/mods/MMA/martial.json b/data/mods/MMA/martial.json index b351d88c60aef..bde0a7db8c599 100644 --- a/data/mods/MMA/martial.json +++ b/data/mods/MMA/martial.json @@ -6,6 +6,7 @@ "type": "GENERIC", "name": "The Life and Work of Tiger Sauer", "name_plural": "The Life and Work of Tiger Sauer", - "description": "A biography of a combat cyborg agent detailing his philosophy and martial art." + "description": "A biography of a combat cyborg agent detailing his philosophy and martial art.", + "book_data": { "martial_art": "style_mma_panzer" } } ] diff --git a/data/mods/Magiclysm/Spells/animist.json b/data/mods/Magiclysm/Spells/animist.json index c179241c8abdc..fad9ce0cf3018 100644 --- a/data/mods/Magiclysm/Spells/animist.json +++ b/data/mods/Magiclysm/Spells/animist.json @@ -16,6 +16,7 @@ "spell_class": "ANIMIST", "difficulty": 8, "max_level": 15, + "flags": [ "VERBAL", "SOMATIC", "LOUD" ], "energy_source": "MANA" }, { @@ -36,6 +37,7 @@ "base_energy_cost": 5, "energy_increment": 1, "final_energy_cost": 40, + "flags": [ "SOMATIC", "VERBAL", "SILENT", "NO_LEGS" ], "difficulty": 3 }, { @@ -55,6 +57,112 @@ "base_casting_time": 50000, "base_energy_cost": 500, "energy_increment": 50, + "flags": [ "SOMATIC", "VERBAL" ], "final_energy_cost": 1000 + }, + { + "id": "summon_zombie", + "type": "SPELL", + "name": "Summon Zombie", + "description": "An ethereal-looking zombie rises from the depths of the earth to fight for you. You may be able to summon more with a higher level in this spell.", + "valid_targets": [ "ground" ], + "min_damage": 1, + "max_damage": 3, + "//": "level 20 will max out your number of summons", + "damage_increment": 0.1, + "max_level": 30, + "difficulty": 2, + "spell_class": "ANIMIST", + "effect": "summon", + "effect_str": "mon_zombie", + "energy_source": "HP", + "base_energy_cost": 6, + "//": "one minute", + "base_casting_time": 6000, + "min_range": 3, + "max_range": 3, + "min_aoe": 2, + "max_aoe": 2, + "flags": [ "SOMATIC", "VERBAL", "CONCENTRATE" ], + "min_duration": 30000, + "max_duration": 150000, + "duration_increment": 4000 + }, + { + "id": "summon_skeleton", + "type": "SPELL", + "name": "Summon Skeleton", + "description": "A ghostly skeleton rises from the depths of the earth to fight for you. You may be able to summon more with a higher level in this spell.", + "valid_targets": [ "ground" ], + "min_damage": 1, + "max_damage": 3, + "//": "level 20 will max out your number of summons", + "damage_increment": 0.1, + "max_level": 30, + "difficulty": 5, + "spell_class": "ANIMIST", + "effect": "summon", + "effect_str": "mon_skeleton", + "energy_source": "HP", + "base_energy_cost": 14, + "//": "one minute", + "base_casting_time": 6000, + "min_range": 3, + "max_range": 3, + "min_aoe": 2, + "max_aoe": 2, + "flags": [ "SOMATIC", "VERBAL", "CONCENTRATE" ], + "min_duration": 30000, + "max_duration": 150000, + "duration_increment": 4000 + }, + { + "id": "summon_decayed_pouncer", + "type": "SPELL", + "name": "Summon Decayed Pouncer", + "description": "A decrepit looking large cat rises from the depths of the earth to fight for you. You may be able to summon more with a higher level in this spell.", + "valid_targets": [ "ground" ], + "min_damage": 1, + "max_damage": 3, + "//": "level 20 will max out your number of summons", + "damage_increment": 0.1, + "max_level": 30, + "difficulty": 12, + "spell_class": "ANIMIST", + "effect": "summon", + "effect_str": "mon_zougar", + "energy_source": "HP", + "base_energy_cost": 30, + "//": "one minute", + "base_casting_time": 6000, + "min_range": 3, + "max_range": 3, + "min_aoe": 2, + "max_aoe": 2, + "flags": [ "SOMATIC", "VERBAL", "CONCENTRATE" ], + "min_duration": 30000, + "max_duration": 150000, + "duration_increment": 4000 + }, + { + "id": "create_rune_animist", + "type": "SPELL", + "name": "Animist Rune", + "description": "This ritual creates a small pebble attuned to Animists. You can use the rune as a catalyst for recipes.", + "valid_targets": [ "self" ], + "min_damage": 1, + "max_damage": 1, + "effect": "spawn_item", + "effect_str": "rune_animist", + "base_casting_time": 5000, + "base_energy_cost": 5, + "min_duration": 1, + "max_duration": 2, + "duration_increment": 1, + "difficulty": 0, + "max_level": 1, + "spell_class": "ANIMIST", + "energy_source": "MANA", + "flags": [ "PERMANENT", "NO_LEGS", "CONCENTRATE" ] } ] diff --git a/data/mods/Magiclysm/Spells/biomancer.json b/data/mods/Magiclysm/Spells/biomancer.json index 2378651e3e359..f224ed031db23 100644 --- a/data/mods/Magiclysm/Spells/biomancer.json +++ b/data/mods/Magiclysm/Spells/biomancer.json @@ -14,7 +14,8 @@ "range_increment": 0.75, "effect": "target_attack", "base_casting_time": 300, - "base_energy_cost": 300, + "base_energy_cost": 800, + "flags": [ "SOMATIC", "VERBAL" ], "spell_class": "BIOMANCER", "difficulty": 2, "energy_source": "MANA" @@ -29,6 +30,7 @@ "base_casting_time": 100, "base_energy_cost": 800, "energy_source": "MANA", + "flags": [ "SOMATIC", "NO_LEGS", "CONCENTRATE" ], "spell_class": "BIOMANCER", "difficulty": 4, "max_level": 1 @@ -50,6 +52,7 @@ "duration_increment": 3000, "difficulty": 6, "max_level": 20, + "flags": [ "SOMATIC", "LOUD" ], "spell_class": "BIOMANCER", "energy_source": "MANA" }, @@ -68,7 +71,8 @@ "difficulty": 6, "max_level": 20, "min_damage": 0, - "max_damage": -20, + "max_damage": -8, + "flags": [ "SOMATIC", "LOUD" ], "damage_increment": -1, "//": "duration is in moves", "min_duration": 6000, @@ -95,6 +99,7 @@ "damage_type": "acid", "min_range": 3, "max_range": 5, + "flags": [ "VERBAL", "NO_HANDS" ], "range_increment": 0.25, "min_aoe": 25, "max_aoe": 60, @@ -117,6 +122,7 @@ "duration_increment": 15000, "difficulty": 4, "max_level": 20, + "flags": [ "NO_HANDS", "NO_LEGS", "SOMATIC" ], "spell_class": "BIOMANCER", "energy_source": "MANA" }, @@ -137,7 +143,29 @@ "duration_increment": 3000, "difficulty": 14, "max_level": 20, + "flags": [ "LOUD", "SOMATIC" ], "spell_class": "BIOMANCER", "energy_source": "MANA" + }, + { + "id": "create_rune_biomancer", + "type": "SPELL", + "name": "Biomancer Rune", + "description": "This ritual creates a small pebble attuned to Biomancers. You can use the rune as a catalyst for recipes.", + "valid_targets": [ "self" ], + "min_damage": 1, + "max_damage": 1, + "effect": "spawn_item", + "effect_str": "rune_biomancer", + "base_casting_time": 5000, + "base_energy_cost": 5, + "min_duration": 1, + "max_duration": 2, + "duration_increment": 1, + "difficulty": 0, + "max_level": 1, + "spell_class": "BIOMANCER", + "energy_source": "MANA", + "flags": [ "PERMANENT", "NO_LEGS", "CONCENTRATE" ] } ] diff --git a/data/mods/Magiclysm/Spells/classless.json b/data/mods/Magiclysm/Spells/classless.json index 3c1538f7c6348..dedf132c9c27d 100644 --- a/data/mods/Magiclysm/Spells/classless.json +++ b/data/mods/Magiclysm/Spells/classless.json @@ -11,6 +11,7 @@ "base_energy_cost": 800, "energy_source": "STAMINA", "spell_class": "NONE", + "flags": [ "LOUD", "SOMATIC", "VERBAL" ], "difficulty": 10, "max_level": 20, "min_damage": 30, @@ -26,7 +27,7 @@ { "id": "create_atomic_light", "type": "SPELL", - "name": "Light", + "name": "Magical Light", "description": "Creates a magical light.", "valid_targets": [ "none" ], "min_range": 0, @@ -36,6 +37,7 @@ "effect": "spawn_item", "effect_str": "magic_light", "energy_source": "MANA", + "flags": [ "VERBAL", "NO_LEGS" ], "difficulty": 1, "max_level": 20, "base_casting_time": 1000, @@ -67,6 +69,7 @@ "max_duration": 3000, "duration_increment": 100, "spell_class": "NONE", + "flags": [ "SOMATIC", "NO_LEGS" ], "base_casting_time": 200, "base_energy_cost": 150, "energy_source": "MANA", @@ -96,6 +99,7 @@ "max_duration": 5000, "duration_increment": 200, "spell_class": "NONE", + "flags": [ "SOMATIC" ], "base_casting_time": 200, "base_energy_cost": 400, "energy_source": "MANA", @@ -114,10 +118,31 @@ "energy_source": "MANA", "difficulty": 1, "max_level": 20, + "flags": [ "CONCENTRATE", "VERBAL", "NO_LEGS" ], "base_casting_time": 350, "base_energy_cost": 375, "min_duration": 10000, "max_duration": 50000, "duration_increment": 3000 + }, + { + "id": "create_rune_alchemist", + "type": "SPELL", + "name": "Alchemist Rune", + "description": "This ritual creates a small pebble attuned to alchemy itself. This rune can substitute for the eight school runes in basic recipes.", + "valid_targets": [ "self" ], + "min_damage": 1, + "max_damage": 1, + "effect": "spawn_item", + "effect_str": "rune_alchemist", + "base_casting_time": 5000, + "base_energy_cost": 500, + "min_duration": 1, + "max_duration": 2, + "duration_increment": 1, + "difficulty": 7, + "max_level": 1, + "energy_source": "MANA", + "flags": [ "PERMANENT", "NO_LEGS", "CONCENTRATE" ] } ] diff --git a/data/mods/Magiclysm/Spells/debug.json b/data/mods/Magiclysm/Spells/debug.json index 0decd801aa140..add863460be92 100644 --- a/data/mods/Magiclysm/Spells/debug.json +++ b/data/mods/Magiclysm/Spells/debug.json @@ -35,6 +35,27 @@ "max_pierce": 1, "pierce_increment": 0.1 }, + { + "id": "spawn_debug_monster", + "type": "SPELL", + "name": "Spawn Debug Monsters", + "description": "Set level to number of monsters spawned.", + "valid_targets": [ "ground" ], + "effect": "summon", + "effect_str": "debug_mon", + "base_casting_time": 100, + "max_level": 30, + "min_aoe": 10, + "max_aoe": 10, + "min_damage": 1, + "max_damage": 30, + "damage_increment": 1, + "min_range": 20, + "max_range": 20, + "min_duration": 1000, + "max_duration": 1000, + "energy_source": "NONE" + }, { "id": "debug_stamina", "type": "SPELL", @@ -48,6 +69,19 @@ "base_energy_cost": 100, "energy_source": "STAMINA" }, + { + "id": "debug_fatigue", + "type": "SPELL", + "name": "Debug Fatigue Spell", + "description": "Uses a little fatigue", + "valid_targets": [ "self" ], + "effect": "none", + "min_range": 1, + "max_range": 1, + "base_casting_time": 100, + "base_energy_cost": 100, + "energy_source": "FATIGUE" + }, { "id": "debug_hp", "type": "SPELL", diff --git a/data/mods/Magiclysm/Spells/druid.json b/data/mods/Magiclysm/Spells/druid.json index 7413ab4c06150..225734966eef1 100644 --- a/data/mods/Magiclysm/Spells/druid.json +++ b/data/mods/Magiclysm/Spells/druid.json @@ -5,6 +5,7 @@ "name": "Vegetative Grasp", "description": "This spell causes roots and vines to burst forth from the ground and grab your foes, slowing them and doing a small amount of damage as they dig in.", "valid_targets": [ "hostile", "ground" ], + "flags": [ "LOUD", "SOMATIC", "VERBAL", "NO_LEGS" ], "effect": "target_attack", "effect_str": "entangled", "spell_class": "DRUID", @@ -39,6 +40,7 @@ "name": "Root Strike", "description": "This spell causes roots to spear out the ground and stab into your foes in an arc, impaling them.", "valid_targets": [ "hostile", "ground" ], + "flags": [ "LOUD", "SOMATIC", "VERBAL", "NO_LEGS" ], "effect": "cone_attack", "effect_str": "root_impale", "spell_class": "DRUID", @@ -73,6 +75,7 @@ "name": "Wooden Shaft", "description": "This spell creates a projectile of hardwood that shoots forth from the caster's hand at high speed to stab into an enemy.", "valid_targets": [ "hostile" ], + "flags": [ "LOUD", "SOMATIC", "VERBAL", "NO_LEGS" ], "effect": "projectile_attack", "spell_class": "DRUID", "base_casting_time": 100, @@ -97,6 +100,7 @@ "name": "Nature's Bow", "description": "This spell conjures a magical wooden recurve bow that fires endless arrows for as long as it lasts.", "valid_targets": [ "none" ], + "flags": [ "CONCENTRATE", "SOMATIC", "VERBAL", "NO_LEGS" ], "min_damage": 1, "max_damage": 1, "effect": "spawn_item", @@ -117,6 +121,7 @@ "name": "Nature's Trance", "description": "Your connection to living things allows you to go into a magical trance. This allows you to recover fatige quickly in exchange for mana.", "valid_targets": [ "self" ], + "flags": [ "CONCENTRATE", "SILENT", "NO_HANDS" ], "spell_class": "DRUID", "energy_source": "MANA", "effect": "recover_energy", @@ -130,5 +135,77 @@ "energy_cost_increment": 25, "final_energy_cost": 1125, "difficulty": 4 + }, + { + "id": "summon_cats", + "type": "SPELL", + "name": "Bag of Cats", + "description": "Are you the crazy cat lady?", + "valid_targets": [ "ground" ], + "flags": [ "LOUD", "SOMATIC" ], + "min_damage": 1, + "max_damage": 12, + "damage_increment": 1, + "min_range": 3, + "range_increment": 0.8, + "max_range": 7, + "min_aoe": 3, + "max_aoe": 3, + "spell_class": "DRUID", + "base_casting_time": 250, + "energy_source": "MANA", + "max_level": 25, + "min_duration": 6000, + "max_duration": 60000, + "duration_increment": 1000, + "difficulty": 1, + "base_energy_cost": 265, + "effect": "summon", + "effect_str": "mon_cat" + }, + { + "id": "summon_bear", + "type": "SPELL", + "name": "Cause Bear", + "description": "This spell appears to be very smudged. You're fairly sure the name should be Cause Fear, but you're also fairly sure it won't have the desired effect because the instructions are hardly legible. No time like the Cataclysm to find out, though!", + "valid_targets": [ "ground" ], + "min_damage": 1, + "max_damage": 1, + "min_range": 3, + "max_range": 5, + "spell_class": "DRUID", + "base_casting_time": 500, + "energy_source": "MANA", + "max_level": 25, + "difficulty": 10, + "min_duration": 6000, + "max_duration": 30000, + "base_energy_cost": 675, + "final_energy_cost": 475, + "energy_cost_increment": -5, + "flags": [ "HOSTILE_50", "CONCENTRATE", "SOMATIC", "VERBAL", "NO_LEGS" ], + "effect": "summon", + "effect_str": "mon_bear" + }, + { + "id": "create_rune_druid", + "type": "SPELL", + "name": "Druid Rune", + "description": "This ritual creates a small pebble attuned to Druids. You can use the rune as a catalyst for recipes.", + "valid_targets": [ "self" ], + "min_damage": 1, + "max_damage": 1, + "effect": "spawn_item", + "effect_str": "rune_druid", + "base_casting_time": 5000, + "base_energy_cost": 5, + "min_duration": 1, + "max_duration": 2, + "duration_increment": 1, + "difficulty": 0, + "max_level": 1, + "spell_class": "DRUID", + "energy_source": "MANA", + "flags": [ "PERMANENT", "NO_LEGS", "CONCENTRATE" ] } ] diff --git a/data/mods/Magiclysm/Spells/earthshaper.json b/data/mods/Magiclysm/Spells/earthshaper.json index 3af195e84af1f..d4359447f4def 100644 --- a/data/mods/Magiclysm/Spells/earthshaper.json +++ b/data/mods/Magiclysm/Spells/earthshaper.json @@ -5,6 +5,7 @@ "name": "Stonefist", "description": "Encases your arms and hands in a sheath of magical stone, you can punch and defend yourself with it in melee combat.", "valid_targets": [ "self" ], + "flags": [ "SOMATIC", "LOUD" ], "min_damage": 1, "max_damage": 1, "effect": "spawn_item", @@ -27,6 +28,7 @@ "effect": "cone_attack", "effect_str": "downed", "valid_targets": [ "hostile", "ground" ], + "flags": [ "SOMATIC", "LOUD" ], "max_level": 10, "min_damage": 2, "max_damage": 10, @@ -55,16 +57,131 @@ "effect": "recover_energy", "effect_str": "STAMINA", "valid_targets": [ "self" ], + "flags": [ "NO_HANDS", "CONCENTRATE", "SILENT" ], "min_damage": 150, "max_damage": 1000, "damage_increment": 75, "max_level": 12, "spell_class": "EARTHSHAPER", "base_casting_time": 500, + "final_casting_time": 300, + "casting_time_increment": -17, "energy_source": "MANA", "base_energy_cost": 150, "energy_increment": 75, "final_energy_cost": 1000, "difficulty": 5 + }, + { + "id": "eshaper_shardspray", + "type": "SPELL", + "name": "Shardspray", + "description": "This spell projects a wide spray of sharp metal shards, cutting into your foes and friends alike.", + "valid_targets": [ "hostile", "ground", "ally" ], + "flags": [ "SOMATIC", "LOUD" ], + "effect": "cone_attack", + "spell_class": "EARTHSHAPER", + "energy_source": "MANA", + "difficulty": 3, + "base_casting_time": 100, + "base_energy_cost": 100, + "max_level": 20, + "min_damage": 10, + "max_damage": 60, + "damage_increment": 2, + "damage_type": "cut", + "min_aoe": 25, + "max_aoe": 60, + "aoe_increment": 5, + "min_range": 1, + "max_range": 10, + "range_increment": 0.5 + }, + { + "id": "eshaper_piercing_bolt", + "type": "SPELL", + "name": "Piercing Bolt", + "description": "This spell projects a piercing rod of conjured iron at those that dare oppose you.", + "valid_targets": [ "hostile" ], + "flags": [ "SOMATIC", "LOUD" ], + "effect": "projectile_attack", + "spell_class": "EARTHSHAPER", + "energy_source": "MANA", + "base_casting_time": 100, + "base_energy_cost": 115, + "difficulty": 2, + "max_level": 20, + "min_damage": 20, + "max_damage": 50, + "damage_increment": 3, + "damage_type": "stab", + "min_range": 8, + "max_range": 26, + "range_increment": 1.5 + }, + { + "id": "eshaper_shardstorm", + "type": "SPELL", + "name": "Shardstorm", + "description": "Creates an omnidirectional spray of razor sharp metal shards all around you.", + "valid_targets": [ "hostile", "ally", "ground" ], + "flags": [ "SOMATIC", "LOUD" ], + "min_damage": 20, + "max_damage": 60, + "damage_increment": 1.5, + "damage_type": "cut", + "min_aoe": 1, + "max_aoe": 6, + "aoe_increment": 0.25, + "base_energy_cost": 200, + "spell_class": "EARTHSHAPER", + "difficulty": 4, + "max_level": 20, + "base_casting_time": 100, + "energy_source": "MANA", + "effect": "target_attack" + }, + { + "id": "eshaper_rockbolt", + "type": "SPELL", + "name": "Rockbolt", + "description": "Fires a conjured stone projectile at high velocity.", + "valid_targets": [ "hostile", "ally" ], + "flags": [ "SOMATIC", "LOUD" ], + "min_damage": 5, + "damage_increment": 1.5, + "damage_type": "bash", + "max_damage": 26, + "min_range": 5, + "range_increment": 0.5, + "max_range": 15, + "base_energy_cost": 50, + "spell_class": "EARTHSHAPER", + "difficulty": 1, + "max_level": 20, + "base_casting_time": 100, + "energy_source": "MANA", + "effect": "projectile_attack" + }, + { + "id": "create_rune_earthshaper", + "type": "SPELL", + "name": "Earthshaper Rune", + "description": "This ritual creates a small pebble attuned to Earthshapers. You can use the rune as a catalyst for recipes.", + "valid_targets": [ "self" ], + "min_damage": 1, + "max_damage": 1, + "effect": "spawn_item", + "effect_str": "rune_earthshaper", + "base_casting_time": 5000, + "base_energy_cost": 5, + "min_duration": 1, + "max_duration": 2, + "duration_increment": 1, + "difficulty": 0, + "max_level": 1, + "spell_class": "EARTHSHAPER", + "energy_source": "MANA", + "flags": [ "PERMANENT", "NO_LEGS", "CONCENTRATE" ] } ] diff --git a/data/mods/Magiclysm/Spells/kelvinist.json b/data/mods/Magiclysm/Spells/kelvinist.json index 7719c1c78c555..2d46ca6c55fd6 100644 --- a/data/mods/Magiclysm/Spells/kelvinist.json +++ b/data/mods/Magiclysm/Spells/kelvinist.json @@ -5,6 +5,7 @@ "name": "Point Flare", "description": "Causes an intense heat at the location, damaging the target.", "valid_targets": [ "hostile" ], + "flags": [ "CONCENTRATE", "SOMATIC", "LOUD" ], "effect": "target_attack", "damage_type": "fire", "min_damage": 16, @@ -20,12 +21,36 @@ "base_casting_time": 300, "energy_source": "MANA" }, + { + "id": "create_lighter", + "type": "SPELL", + "name": "Finger Firelighter", + "description": "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.", + "valid_targets": [ "none" ], + "flags": [ "NO_LEGS" ], + "effect": "spawn_item", + "effect_str": "finger_firelighter", + "min_damage": 1, + "max_damage": 1, + "min_duration": 6000, + "max_duration": 60000, + "duration_increment": 5400, + "max_level": 10, + "spell_class": "KELVINIST", + "energy_source": "MANA", + "base_casting_time": 250, + "final_casting_time": 50, + "casting_time_increment": -20, + "base_energy_cost": 65, + "difficulty": 0 + }, { "id": "ice_spike", "type": "SPELL", "name": "Ice Spike", "description": "Causes jagged icicles to form in the air above the target, falling and damaging it.", "valid_targets": [ "hostile" ], + "flags": [ "CONCENTRATE", "SOMATIC", "LOUD", "VERBAL" ], "effect": "target_attack", "damage_type": "cold", "min_damage": 30, @@ -48,6 +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" ], "max_level": 20, "min_damage": 24, "max_damage": 68, @@ -72,6 +98,7 @@ "description": "You blast a cone of frigid air toward the target.", "effect": "cone_attack", "valid_targets": [ "ally", "hostile", "ground" ], + "flags": [ "SOMATIC", "VERBAL" ], "max_level": 20, "min_damage": 24, "max_damage": 68, @@ -96,6 +123,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" ], "max_level": 20, "min_damage": 8, "max_damage": 65, @@ -120,6 +148,7 @@ "description": "A glowing chunk of ice bursts into being from your hand and explodes into a wave of intense cold on impact.", "effect": "projectile_attack", "valid_targets": [ "self", "ally", "hostile", "ground" ], + "flags": [ "SOMATIC", "VERBAL", "NO_LEGS" ], "max_level": 20, "min_damage": 24, "max_damage": 68, @@ -146,6 +175,7 @@ "effect_str": "cold", "affected_body_parts": [ "TORSO" ], "valid_targets": [ "ally", "hostile", "ground" ], + "flags": [ "SOMATIC", "VERBAL" ], "max_level": 20, "min_damage": 8, "max_damage": 65, @@ -169,6 +199,7 @@ "name": "Chilling Touch", "description": "Freezes the touched target with intense cold.", "valid_targets": [ "hostile" ], + "flags": [ "SOMATIC" ], "effect": "target_attack", "effect_str": "cold", "affected_body_parts": [ "TORSO" ], @@ -191,6 +222,7 @@ "name": "Glide on Ice", "description": "Encases your feet in a magical coating of ice, allowing you to glide along smooth surfaces faster.", "valid_targets": [ "none" ], + "flags": [ "VERBAL", "NO_HANDS", "NO_LEGS", "CONCENTRATE" ], "min_damage": 1, "max_damage": 1, "effect": "spawn_item", @@ -214,6 +246,7 @@ "effect_str": "cold", "affected_body_parts": [ "TORSO" ], "valid_targets": [ "self", "ally", "hostile", "ground" ], + "flags": [ "SOMATIC", "VERBAL", "NO_LEGS" ], "max_level": 20, "min_damage": 24, "max_damage": 68, @@ -237,6 +270,7 @@ "name": "Ice Shield", "description": "Creates a magical shield of ice on your arm, you can defend yourself with it in melee combat and use it to bash.", "valid_targets": [ "none" ], + "flags": [ "NO_LEGS", "CONCENTRATE", "VERBAL" ], "min_damage": 1, "max_damage": 1, "effect": "spawn_item", @@ -257,6 +291,7 @@ "name": "Frost Armor", "description": "Covers you in a thin layer of magical ice to protect you from harm.", "valid_targets": [ "self" ], + "flags": [ "NO_LEGS", "CONCENTRATE", "VERBAL", "SOMATIC" ], "effect": "target_attack", "effect_str": "armor_frost", "affected_body_parts": [ "HEAD", "TORSO", "LEG_L", "LEG_R", "ARM_R", "ARM_L" ], @@ -269,5 +304,26 @@ "min_duration": 10000, "max_duration": 50000, "duration_increment": 3000 + }, + { + "id": "create_rune_kelvinist", + "type": "SPELL", + "name": "Kelvinist Rune", + "description": "This ritual creates a small pebble attuned to Kelvinists. You can use the rune as a catalyst for recipes.", + "valid_targets": [ "self" ], + "min_damage": 1, + "max_damage": 1, + "effect": "spawn_item", + "effect_str": "rune_kelvinist", + "base_casting_time": 5000, + "base_energy_cost": 5, + "min_duration": 1, + "max_duration": 2, + "duration_increment": 1, + "difficulty": 0, + "max_level": 1, + "spell_class": "KELVINIST", + "energy_source": "MANA", + "flags": [ "PERMANENT", "NO_LEGS", "CONCENTRATE" ] } ] diff --git a/data/mods/Magiclysm/Spells/magus.json b/data/mods/Magiclysm/Spells/magus.json index e730706fb30a9..27e234c5f1aaf 100644 --- a/data/mods/Magiclysm/Spells/magus.json +++ b/data/mods/Magiclysm/Spells/magus.json @@ -5,6 +5,7 @@ "name": "Magic Missile", "description": "I cast Magic Missile at the darkness!", "valid_targets": [ "hostile" ], + "flags": [ "VERBAL", "SOMATIC", "NO_LEGS", "SILENT" ], "min_damage": 1, "damage_increment": 1.5, "damage_type": "none", @@ -27,6 +28,7 @@ "description": "Teleports you in a random direction a short distance.", "effect": "teleport_random", "valid_targets": [ "none" ], + "flags": [ "SOMATIC", "SILENT", "NO_LEGS" ], "min_range": 3, "max_range": 4, "range_increment": 0.1, @@ -47,6 +49,7 @@ "description": "Summons a well of gravity with the epicenter at the location. Deals bashing damage to all creatures in the affected area.", "effect": "target_attack", "valid_targets": [ "self", "ally", "hostile", "ground" ], + "flags": [ "SOMATIC", "VERBAL", "CONCENTRATE" ], "min_damage": 20, "max_damage": 45, "damage_increment": 1.2, @@ -63,5 +66,137 @@ "base_casting_time": 600, "energy_source": "MANA", "base_energy_cost": 350 + }, + { + "id": "magus_mana_blast", + "type": "SPELL", + "name": "Mana Blast", + "description": "A blast of concentrated magical power that obliterates a large area.", + "valid_targets": [ "hostile", "ground" ], + "flags": [ "VERBAL", "SOMATIC", "NO_LEGS" ], + "effect": "projectile_attack", + "spell_class": "MAGUS", + "energy_source": "MANA", + "base_casting_time": 150, + "base_energy_cost": 200, + "difficulty": 5, + "max_level": 20, + "min_damage": 20, + "max_damage": 80, + "damage_increment": 3, + "damage_type": "none", + "min_aoe": 1, + "max_aoe": 3, + "aoe_increment": 0.25, + "min_range": 5, + "max_range": 20, + "range_increment": 1 + }, + { + "id": "magus_mana_bolt", + "type": "SPELL", + "name": "Mana Bolt", + "description": "A bolt of magical power that only damages your foes.", + "valid_targets": [ "hostile" ], + "flags": [ "VERBAL", "SOMATIC", "NO_LEGS" ], + "effect": "projectile_attack", + "spell_class": "MAGUS", + "energy_source": "MANA", + "base_casting_time": 100, + "base_energy_cost": 150, + "difficulty": 5, + "max_level": 20, + "min_damage": 20, + "max_damage": 120, + "damage_increment": 5, + "damage_type": "none", + "min_range": 5, + "max_range": 30, + "range_increment": 1.5 + }, + { + "id": "magus_haste", + "type": "SPELL", + "name": "Haste", + "description": "This spell gives you an enormous boost of speed lasting a short period of time.", + "valid_targets": [ "self" ], + "flags": [ "LOUD", "VERBAL", "SOMATIC" ], + "effect": "target_attack", + "effect_str": "haste", + "spell_class": "MAGUS", + "energy_source": "MANA", + "difficulty": 4, + "base_casting_time": 200, + "base_energy_cost": 300, + "max_level": 20, + "min_duration": 600, + "max_duration": 12000, + "duration_increment": 600 + }, + { + "id": "magus_mana_beam", + "type": "SPELL", + "name": "Mana Beam", + "description": "A beam of focused magical power that damages any foes in its path.", + "valid_targets": [ "hostile", "ground" ], + "flags": [ "VERBAL", "SOMATIC", "NO_LEGS", "LOUD" ], + "effect": "line_attack", + "spell_class": "MAGUS", + "energy_source": "MANA", + "base_casting_time": 150, + "base_energy_cost": 200, + "difficulty": 4, + "max_level": 20, + "min_damage": 15, + "max_damage": 60, + "damage_increment": 3, + "damage_type": "none", + "min_aoe": 1, + "max_aoe": 1, + "min_range": 5, + "max_range": 20, + "range_increment": 1 + }, + { + "id": "magus_escape", + "type": "SPELL", + "name": "Escape", + "description": "Teleports you in a random direction a medium distance, to help escape your foes in dangerous situations.", + "effect": "teleport_random", + "valid_targets": [ "none" ], + "flags": [ "SOMATIC", "SILENT", "NO_LEGS", "VERBAL" ], + "min_aoe": 5, + "max_aoe": 10, + "aoe_increment": 0.25, + "min_range": 25, + "max_range": 35, + "range_increment": 0.5, + "max_level": 10, + "difficulty": 5, + "spell_class": "MAGUS", + "base_casting_time": 100, + "energy_source": "MANA", + "base_energy_cost": 250 + }, + { + "id": "create_rune_magus", + "type": "SPELL", + "name": "Magus Rune", + "description": "This ritual creates a small pebble attuned to Magi. You can use the rune as a catalyst for recipes.", + "valid_targets": [ "self" ], + "min_damage": 1, + "max_damage": 1, + "effect": "spawn_item", + "effect_str": "rune_magus", + "base_casting_time": 5000, + "base_energy_cost": 5, + "min_duration": 1, + "max_duration": 2, + "duration_increment": 1, + "difficulty": 0, + "max_level": 1, + "spell_class": "MAGUS", + "energy_source": "MANA", + "flags": [ "PERMANENT", "NO_LEGS", "CONCENTRATE" ] } ] diff --git a/data/mods/Magiclysm/Spells/stormshaper.json b/data/mods/Magiclysm/Spells/stormshaper.json index 16dc181c52105..c106fada814b3 100644 --- a/data/mods/Magiclysm/Spells/stormshaper.json +++ b/data/mods/Magiclysm/Spells/stormshaper.json @@ -3,9 +3,10 @@ "id": "jolt", "type": "SPELL", "name": "Jolt", - "description": "A short ranged fan of elecricity shoots from your fingers.", + "description": "A short-ranged fan of electricity shoots from your fingers.", "effect": "cone_attack", "valid_targets": [ "ally", "hostile", "ground" ], + "flags": [ "LOUD", "SOMATIC" ], "max_level": 20, "min_damage": 8, "max_damage": 65, @@ -32,6 +33,7 @@ "effect_str": "downed", "affected_body_parts": [ "LEG_L", "LEG_R" ], "valid_targets": [ "ally", "hostile", "ground" ], + "flags": [ "SOMATIC", "NO_LEGS" ], "max_level": 10, "min_damage": 24, "max_damage": 68, @@ -66,6 +68,7 @@ "effect_str": "enchant_windrun", "affected_body_parts": [ "TORSO" ], "valid_targets": [ "ally", "self" ], + "flags": [ "CONCENTRATE", "SILENT", "VERBAL", "NO_HANDS" ], "max_level": 10, "min_duration": 2000, "max_duration": 10000, @@ -80,6 +83,7 @@ "name": "Call Stormhammer", "description": "Creates a crackling magical warhammer full of lightning to smite your foes with, and of course, smash things to bits!", "valid_targets": [ "self" ], + "flags": [ "CONCENTRATE", "LOUD", "VERBAL", "NO_LEGS" ], "min_damage": 1, "max_damage": 1, "effect": "spawn_item", @@ -93,5 +97,26 @@ "min_duration": 10000, "max_duration": 50000, "duration_increment": 2000 + }, + { + "id": "create_rune_stormshaper", + "type": "SPELL", + "name": "Stormshaper Rune", + "description": "This ritual creates a small pebble attuned to Stormshapers. You can use the rune as a catalyst for recipes.", + "valid_targets": [ "self" ], + "min_damage": 1, + "max_damage": 1, + "effect": "spawn_item", + "effect_str": "rune_stormshaper", + "base_casting_time": 5000, + "base_energy_cost": 5, + "min_duration": 1, + "max_duration": 2, + "duration_increment": 1, + "difficulty": 0, + "max_level": 1, + "spell_class": "STORMSHAPER", + "energy_source": "MANA", + "flags": [ "PERMANENT", "NO_LEGS", "CONCENTRATE" ] } ] diff --git a/data/mods/Magiclysm/Spells/technomancer.json b/data/mods/Magiclysm/Spells/technomancer.json index d11acdc84718f..9e6f3fdc95abd 100644 --- a/data/mods/Magiclysm/Spells/technomancer.json +++ b/data/mods/Magiclysm/Spells/technomancer.json @@ -5,6 +5,7 @@ "name": "Bless", "description": "A spell of blessing that gives you energy and boosts your abilities.", "valid_targets": [ "self", "ally" ], + "flags": [ "VERBAL", "SOMATIC", "NO_LEGS" ], "effect": "target_attack", "effect_str": "bless", "affected_body_parts": [ "TORSO" ], @@ -15,7 +16,7 @@ "difficulty": 1, "max_level": 1, "min_damage": 0, - "max_damage": -20, + "max_damage": -2, "damage_increment": -1, "min_aoe": 0, "max_aoe": 5, @@ -35,6 +36,7 @@ "name": "Holy Blade", "description": "This blade of light will cut through any evil it makes contact with!", "valid_targets": [ "self" ], + "flags": [ "VERBAL", "NO_LEGS", "CONCENTRATE" ], "min_range": 0, "max_range": 0, "min_damage": 1, @@ -57,6 +59,7 @@ "name": "Spiritual Armor", "description": "Evil will not make it through your defenses if your faith is strong enough!", "valid_targets": [ "self" ], + "flags": [ "VERBAL", "NO_LEGS", "CONCENTRATE", "SOMATIC" ], "min_range": 0, "max_range": 0, "min_damage": 1, @@ -79,6 +82,7 @@ "name": "Lamp", "description": "Creates a magical lamp.", "valid_targets": [ "none" ], + "flags": [ "VERBAL", "NO_LEGS", "CONCENTRATE" ], "min_range": 0, "max_range": 0, "min_damage": 1, @@ -101,6 +105,7 @@ "name": "Manatricity", "description": "You have found a way to convert your spiritual energy into power you can use for your bionics.", "valid_targets": [ "self" ], + "flags": [ "NO_LEGS", "NO_HANDS", "SOMATIC", "VERBAL", "SILENT" ], "min_damage": 250, "damage_increment": 50, "max_damage": 15000, @@ -114,5 +119,26 @@ "energy_source": "MANA", "difficulty": 6, "base_casting_time": 1000 + }, + { + "id": "create_rune_technomancer", + "type": "SPELL", + "name": "Technomancer Rune", + "description": "This ritual creates a small pebble attuned to Technomancers. You can use the rune as a catalyst for recipes.", + "valid_targets": [ "self" ], + "min_damage": 1, + "max_damage": 1, + "effect": "spawn_item", + "effect_str": "rune_technomancer", + "base_casting_time": 5000, + "base_energy_cost": 5, + "min_duration": 1, + "max_duration": 2, + "duration_increment": 1, + "difficulty": 0, + "max_level": 1, + "spell_class": "TECHNOMANCER", + "energy_source": "MANA", + "flags": [ "PERMANENT", "NO_LEGS", "CONCENTRATE" ] } ] diff --git a/data/mods/Magiclysm/cooking_components.json b/data/mods/Magiclysm/cooking_components.json new file mode 100644 index 0000000000000..89af18fa1004a --- /dev/null +++ b/data/mods/Magiclysm/cooking_components.json @@ -0,0 +1,20 @@ +[ + { + "id": "eggs_bird", + "type": "requirement", + "components": [ + [ + [ "egg_bird", 1 ], + [ "egg_chicken", 1 ], + [ "egg_grouse", 1 ], + [ "egg_crow", 1 ], + [ "egg_duck", 1 ], + [ "egg_goose_canadian", 1 ], + [ "egg_turkey", 1 ], + [ "egg_pheasant", 1 ], + [ "egg_cockatrice", 1 ], + [ "egg_owlbear", 1 ] + ] + ] + } +] diff --git a/data/mods/Magiclysm/effects/effects.json b/data/mods/Magiclysm/effects/effects.json index f02b73c920032..aab0fe8317fce 100644 --- a/data/mods/Magiclysm/effects/effects.json +++ b/data/mods/Magiclysm/effects/effects.json @@ -86,8 +86,8 @@ "max_intensity": 4, "int_add_val": 1, "apply_message": "Roots rip out from the ground and impale your enemies!", - "remove_message": "The roots and vines wither up and die.", - "base_mods": { "speed_mod": [ -30 ], "h_mod_min": [ -2 ], "h_mod_max": [ -5 ], "h_mod_chance": [ 5 ] }, + "remove_message": "The roots wither up and die.", + "base_mods": { "speed_mod": [ -30 ] }, "scaling_mods": { "speed_mod": [ -10 ] } }, { @@ -97,7 +97,17 @@ "desc": [ "Burned with acid" ], "max_intensity": 4, "int_add_val": 1, - "base_mods": { "speed_mod": [ -10 ], "h_mod_min": [ -2 ], "h_mod_max": [ -5 ], "h_mod_chance": [ 5 ] }, + "base_mods": { "speed_mod": [ -20 ] }, "scaling_mods": { "speed_mod": [ -10 ] } + }, + { + "type": "effect_type", + "id": "haste", + "name": [ "Hasted" ], + "desc": [ "Your speed is boosted enormously." ], + "apply_message": "Your speed is boosted to superhuman levels!", + "remove_message": "You return to your normal speed.", + "rating": "good", + "base_mods": { "dex_mod": [ 4 ], "speed_mod": [ 300 ] } } ] diff --git a/data/mods/Magiclysm/harvest.json b/data/mods/Magiclysm/harvest.json new file mode 100644 index 0000000000000..d19c727a2ae90 --- /dev/null +++ b/data/mods/Magiclysm/harvest.json @@ -0,0 +1,44 @@ +[ + { + "id": "owlbear", + "//": "identical to mammal_large_fur except that half the fur has been replaced with feathers", + "type": "harvest", + "entries": [ + { "drop": "meat", "type": "flesh", "mass_ratio": 0.32 }, + { "drop": "meat_scrap", "type": "flesh", "mass_ratio": 0.01 }, + { "drop": "lung", "type": "flesh", "mass_ratio": 0.0035 }, + { "drop": "liver", "type": "offal", "mass_ratio": 0.01 }, + { "drop": "brain", "type": "flesh", "mass_ratio": 0.005 }, + { "drop": "sweetbread", "type": "flesh", "mass_ratio": 0.002 }, + { "drop": "kidney", "type": "offal", "mass_ratio": 0.002 }, + { "drop": "stomach_large", "scale_num": [ 1, 1 ], "max": 1, "type": "offal" }, + { "drop": "owlbear_stone", "scale_num": [ 1, 1 ], "max": 1, "type": "offal" }, + { "drop": "bone", "type": "bone", "mass_ratio": 0.15 }, + { "drop": "sinew", "type": "bone", "mass_ratio": 0.00035 }, + { "drop": "raw_fur", "type": "skin", "mass_ratio": 0.015 }, + { "drop": "fat", "type": "flesh", "mass_ratio": 0.07 }, + { "drop": "feather", "type": "skin", "mass_ratio": 0.005 } + ] + }, + { + "id": "owlbear_cub", + "//": "drops regular stomach", + "type": "harvest", + "entries": [ + { "drop": "meat", "type": "flesh", "mass_ratio": 0.3 }, + { "drop": "meat_scrap", "type": "flesh", "mass_ratio": 0.03 }, + { "drop": "lung", "type": "flesh", "mass_ratio": 0.0035 }, + { "drop": "liver", "type": "offal", "mass_ratio": 0.01 }, + { "drop": "brain", "type": "flesh", "mass_ratio": 0.005 }, + { "drop": "sweetbread", "type": "flesh", "mass_ratio": 0.002 }, + { "drop": "kidney", "type": "offal", "mass_ratio": 0.002 }, + { "drop": "stomach", "scale_num": [ 1, 1 ], "max": 1, "type": "offal" }, + { "drop": "owlbear_stone", "scale_num": [ 1, 1 ], "max": 1, "type": "offal" }, + { "drop": "bone", "type": "bone", "mass_ratio": 0.15 }, + { "drop": "sinew", "type": "bone", "mass_ratio": 0.00035 }, + { "drop": "raw_fur", "type": "skin", "mass_ratio": 0.015 }, + { "drop": "fat", "type": "flesh", "mass_ratio": 0.07 }, + { "drop": "feather", "type": "skin", "mass_ratio": 0.005 } + ] + } +] diff --git a/data/mods/Magiclysm/itemgroups.json b/data/mods/Magiclysm/itemgroups.json index 8a6ce56a01b9e..533faf74552cd 100644 --- a/data/mods/Magiclysm/itemgroups.json +++ b/data/mods/Magiclysm/itemgroups.json @@ -2,7 +2,7 @@ { "type": "item_group", "id": "religious_books", - "items": [ [ "priest_beginner", 1 ], [ "priest_advanced", 1 ], [ "druid_spellbook", 1 ] ] + "items": [ [ "priest_beginner", 1 ], [ "priest_advanced", 1 ], [ "druid_spellbook", 1 ], [ "summon_undead_spellbook", 1 ] ] }, { "type": "item_group", @@ -30,10 +30,14 @@ [ "priest_advanced", 5 ], [ "pyro", 6 ], [ "winter_grasp", 6 ], - [ "tome_of_storms", 3 ], + [ "tome_of_storms", 6 ], [ "biomancer_spellbook", 6 ], [ "druid_spellbook", 6 ], - [ "recovery_spellbook", 3 ] + [ "recovery_spellbook", 3 ], + [ "magus_spellbook", 6 ], + [ "eshaper_spellbook", 6 ], + [ "magus_spellbook_move", 3 ], + [ "summon_undead_spellbook", 2 ] ] }, { @@ -48,7 +52,11 @@ [ "tome_of_storms", 3 ], [ "biomancer_spellbook", 2 ], [ "druid_spellbook", 2 ], - [ "recovery_spellbook", 3 ] + [ "recovery_spellbook", 3 ], + [ "magus_spellbook", 3 ], + [ "eshaper_spellbook", 3 ], + [ "magus_spellbook_move", 2 ], + [ "summon_undead_spellbook", 1 ] ] }, { @@ -62,7 +70,11 @@ [ "priest_advanced", 6 ], [ "biomancer_spellbook", 1 ], [ "druid_spellbook", 1 ], - [ "recovery_spellbook", 3 ] + [ "recovery_spellbook", 3 ], + [ "magus_spellbook", 3 ], + [ "eshaper_spellbook", 3 ], + [ "magus_spellbook_move", 2 ], + [ "summon_undead_spellbook", 3 ] ] }, { @@ -107,5 +119,55 @@ "id": "groce_softdrink", "type": "item_group", "items": [ [ "mana_potion_lesser", 15 ] ] + }, + { + "id": "trash", + "type": "item_group", + "items": [ [ "summon_scroll_smudged", 5 ] ] + }, + { + "type": "item_group", + "id": "magic_shop_books", + "items": [ + [ "wizard_beginner", 3 ], + [ "wizard_advanced", 5 ], + [ "priest_beginner", 3 ], + [ "wizard_utility", 5 ], + [ "priest_advanced", 5 ], + [ "pyro", 6 ], + [ "winter_grasp", 6 ], + [ "tome_of_storms", 6 ], + [ "biomancer_spellbook", 6 ], + [ "druid_spellbook", 6 ], + [ "recovery_spellbook", 3 ], + [ "magus_spellbook", 6 ], + [ "eshaper_spellbook", 6 ], + [ "magus_spellbook_move", 3 ] + ] + }, + { + "type": "item_group", + "id": "magic_shop_wands", + "items": [ + { "item": "wand_magic_missile", "prob": 35, "charges-min": 12, "charges-max": 34 }, + { "item": "wand_fireball", "prob": 25, "charges-min": 3, "charges-max": 24 } + ] + }, + { + "id": "magic_shop_potions", + "type": "item_group", + "items": [ + [ "mana_potion_lesser", 15 ], + [ "crystallized_mana", 15 ], + [ "small_mana_crystal", 15 ], + [ "owlbear_stone", 5 ], + { "item": "stone_shell", "prob": 10, "count-min": 1, "count-max": 3 }, + [ "egg_owlbear_rock", 2 ] + ] + }, + { + "type": "item_group", + "id": "magic_shop_clothes", + "items": [ [ "cloak", 3 ], [ "cloak_wool", 5 ], [ "jedi_cloak", 3 ], [ "robe", 5 ], [ "tophat", 5 ], [ "leathersandals", 6 ] ] } ] diff --git a/data/mods/Magiclysm/items/alchemy_items.json b/data/mods/Magiclysm/items/alchemy_items.json new file mode 100644 index 0000000000000..4f0a407d1cffc --- /dev/null +++ b/data/mods/Magiclysm/items/alchemy_items.json @@ -0,0 +1,35 @@ +[ + { + "id": "owlbear_stone", + "type": "TOOL", + "name": "owlbear gastrolith", + "description": "This strangely shaped rock was once a part of an owlbear's complex digestive system, creating a link between owl throat and bear stomach. It is possible that it could serve a similar purpose in alchemy, helping to bind together two disparate halves.", + "weight": 2000, + "volume": 3, + "price": 0, + "bashing": 9, + "to_hit": -1, + "material": "stone", + "symbol": ";", + "color": "gray", + "qualities": [ [ "HAMMER", 2 ] ], + "use_action": "HAMMER", + "//": "In terms of alchemy the gastrolith could serve to combie different effects, such as safely mixing together potions, or it could be used as an element of change, such as for shapechanging potions." + }, + { + "id": "stone_shell", + "type": "GENERIC", + "symbol": "*", + "color": "gray", + "name": "stone shell", + "description": "The broken fragment of an owlbear egg. With luck it might still contain some of its former power, though if nothing else it's still a bit sharp.", + "material": "stone", + "weight": 250, + "volume": "150 ml", + "bashing": 5, + "cutting": 3, + "to_hit": -2, + "qualities": [ [ "BUTCHER", -50 ] ], + "//": "Potion recipes that require a full owlbear egg could also instead require larger amounts of stone shell. Since 1 egg gives 3 shells, you could perhaps have 1 egg be equivalent to 5 or more shells when making potions." + } +] diff --git a/data/mods/Magiclysm/items/class_runes.json b/data/mods/Magiclysm/items/class_runes.json new file mode 100644 index 0000000000000..6a0e5de802261 --- /dev/null +++ b/data/mods/Magiclysm/items/class_runes.json @@ -0,0 +1,119 @@ +[ + { + "id": "rune_biomancer", + "type": "TOOL", + "symbol": "=", + "color": "pink", + "name": "Biomancer rune", + "plural": "Biomancer runes", + "description": "This magical pebble has an insignia of rended flesh and bones on it. It is necessary for Biomancers to channel magic into their crafts.", + "volume": "5ml", + "weight": 1, + "material": "stone", + "flags": "TRADER_AVOID" + }, + { + "id": "rune_technomancer", + "type": "TOOL", + "symbol": "=", + "color": "blue", + "name": "Technomancer rune", + "plural": "Technomancer runes", + "description": "This magical pebble has an insignia of clockwork and gears on it. It is necessary for Technomancers to channel magic into their crafts.", + "volume": "5ml", + "weight": 1, + "material": "stone", + "flags": "TRADER_AVOID" + }, + { + "id": "rune_magus", + "type": "TOOL", + "symbol": "=", + "color": "purple", + "name": "Magus rune", + "plural": "Magi runes", + "description": "This magical pebble has an insignia of crystal and mana orbs on it. It is necessary for Magi to channel magic into their crafts.", + "volume": "5ml", + "weight": 1, + "material": "stone", + "flags": "TRADER_AVOID" + }, + { + "id": "rune_earthshaper", + "type": "TOOL", + "symbol": "=", + "color": "green", + "name": "Earthshaper rune", + "plural": "Earthshaper runes", + "description": "This magical pebble has an insignia of steel and rocks on it. It is necessary for Earthshapers to channel magic into their crafts.", + "volume": "5ml", + "weight": 1, + "material": "stone", + "flags": "TRADER_AVOID" + }, + { + "id": "rune_kelvinist", + "type": "TOOL", + "symbol": "=", + "color": "red", + "name": "Kelvinist rune", + "plural": "Kelvinist runes", + "description": "This magical pebble has an insignia of ice and flames on it. It is necessary for Kelvinists to channel magic into their crafts.", + "volume": "5ml", + "weight": 1, + "material": "stone", + "flags": "TRADER_AVOID" + }, + { + "id": "rune_stormshaper", + "type": "TOOL", + "symbol": "=", + "color": "yellow", + "name": "Stormshaper rune", + "plural": "Stormshaper runes", + "description": "This magical pebble has an insignia of lightning and storm clouds on it. It is necessary for Stormshapers to channel magic into their crafts.", + "volume": "5ml", + "weight": 1, + "material": "stone", + "flags": "TRADER_AVOID" + }, + { + "id": "rune_druid", + "type": "TOOL", + "symbol": "=", + "color": "brown", + "name": "Druid rune", + "plural": "Druid runes", + "description": "This magical pebble has an insignia of nature and trees on it. It is necessary for Druids to channel magic into their crafts.", + "volume": "5ml", + "weight": 1, + "material": "stone", + "flags": "TRADER_AVOID" + }, + { + "id": "rune_animist", + "type": "TOOL", + "symbol": "=", + "color": "orange", + "name": "Animist rune", + "plural": "Animist runes", + "description": "This magical pebble has an insignia of summoners on it. It is necessary for Animists to channel magic into their crafts.", + "volume": "5ml", + "weight": 1, + "material": "stone", + "flags": "TRADER_AVOID" + }, + { + "id": "rune_alchemist", + "type": "TOOL", + "symbol": "=", + "color": "black", + "name": "alchemist rune", + "plural": "alchemist runes", + "description": "This magical pebble has an insignia of alchemy and potions on it. While versatile in use, the lack of attunement to any school prevents creation of more advanced recipes.", + "volume": "5ml", + "weight": 1, + "material": "stone", + "flags": "TRADER_AVOID" + } +] diff --git a/data/mods/Magiclysm/items/comestibles.json b/data/mods/Magiclysm/items/comestibles.json new file mode 100644 index 0000000000000..b1a3a09cf5dcd --- /dev/null +++ b/data/mods/Magiclysm/items/comestibles.json @@ -0,0 +1,36 @@ +[ + { + "type": "COMESTIBLE", + "id": "egg_owlbear_rock", + "name": "owlbear egg", + "weight": 2395, + "color": "gray", + "spoils_in": "14 days", + "comestible_type": "FOOD", + "symbol": "0", + "quench": 128, + "healthy": 3, + "calories": 3200, + "description": "This egg laid by an owlbear seems almost indistinguishable from a large rock until you touch it and can feel the warm glow of potential life energy from within. It's hard to believe that an owlbear could grow so quickly from something so small. Perhaps you could carefully crack it open to get at the liquid golden goodness inside.", + "price": 300000, + "material": [ "egg", "stone" ], + "volume": 10, + "stack_size": 1, + "fun": -18, + "flags": [ "FREEZERBURN" ], + "vitamins": [ [ "vitA", 360 ], [ "calcium", 120 ], [ "iron", 160 ], [ "vitB", 840 ] ], + "rot_spawn_chance": 80, + "//": "Alchemically speaking, I see this egg as having the elements of Growth, Stone, and Egg. Growth would make things grow faster, the simplest example being a magical liquid fertilizer. Stone would be a defensive element, used in creating something like a potion of stoneskin. Egg would be interesting though. What if instead of being imbibed there were potions that instead functioned similarly to the sourdough items, or the blob vehicle parts, in that they take a gestation period and then you could activate them and have a new item pop out. Creatures sure but especially biomancers could have temporarily-lived tools, weapons, and armor." + }, + { + "type": "COMESTIBLE", + "id": "egg_owlbear", + "name": "owlbear egg yolk", + "copy-from": "egg_chicken", + "rot_spawn": "GROUP_EGG_OWLBEAR", + "phase": "liquid", + "healthy": 3, + "color": "yellow", + "description": "The liquid innards of an owlbear egg. Good eating." + } +] diff --git a/data/mods/Magiclysm/items/ethereal_items.json b/data/mods/Magiclysm/items/ethereal_items.json index 5470911ad180c..4d77eb7dd4422 100644 --- a/data/mods/Magiclysm/items/ethereal_items.json +++ b/data/mods/Magiclysm/items/ethereal_items.json @@ -23,6 +23,19 @@ "flags": [ "VARSIZE", "STURDY", "UNARMED_WEAPON", "DURABLE_MELEE", "NONCONDUCTIVE" ], "techniques": [ "WBLOCK_3" ] }, + { + "id": "finger_firelighter", + "type": "TOOL", + "name": "finger firelighter", + "description": "This is a small flame you can hold in your hand. With a thought, you can cause it to light something on fire.", + "weight": 1, + "volume": "1 ml", + "price": 0, + "symbol": ",", + "color": "yellow", + "use_action": [ { "type": "firestarter", "moves": 20 } ], + "flags": [ "TRADER_AVOID", "FIRESTARTER", "FIRE", "LIGHT_8", "FLAMING", "WATER_EXTINGUISH" ] + }, { "id": "armor_stonefist", "type": "ARMOR", @@ -226,6 +239,7 @@ "flags": [ "UNBREAKABLE_MELEE", "REACH_ATTACK", + "SPEAR", "REACH2", "NONCONDUCTIVE", "SHEATH_SPEAR", @@ -262,7 +276,6 @@ "NO_UNLOAD", "NO_AMMO" ], - "ammo": "NULL", "skill": "archery", "min_strength": 5, "weight": 540, diff --git a/data/mods/Magiclysm/items/mana_crystals.json b/data/mods/Magiclysm/items/mana_crystals.json index 36cfae1062134..5c6b4bab4633a 100644 --- a/data/mods/Magiclysm/items/mana_crystals.json +++ b/data/mods/Magiclysm/items/mana_crystals.json @@ -28,8 +28,8 @@ "type": "MAGAZINE", "category": "spare_parts", "name": "small mana crystal", - "name_plural": "ultra-light batteries", - "description": "This is a small mana crystal specifically designed to be attacked to wand tips.", + "name_plural": "small mana crystals", + "description": "This is a small mana crystal specifically designed to be attached to wand tips.", "weight": 5, "volume": 1, "price": 1500, diff --git a/data/mods/Magiclysm/items/spellbooks.json b/data/mods/Magiclysm/items/spellbooks.json index d9894d614998e..d5441229cbcf1 100644 --- a/data/mods/Magiclysm/items/spellbooks.json +++ b/data/mods/Magiclysm/items/spellbooks.json @@ -33,7 +33,7 @@ "price": 5000, "symbol": "?", "color": "light_red", - "use_action": { "type": "learn_spell", "spells": [ "magic_missile", "phase_door" ] } + "use_action": { "type": "learn_spell", "spells": [ "magic_missile", "phase_door", "create_atomic_light" ] } }, { "id": "wizard_utility", @@ -45,7 +45,7 @@ "price": 35000, "symbol": "?", "color": "red", - "use_action": { "type": "learn_spell", "spells": [ "phase_door", "burning_hands", "pain_split" ] } + "use_action": { "type": "learn_spell", "spells": [ "phase_door", "create_lighter", "pain_split", "protection_aura" ] } }, { "id": "pyro", @@ -81,7 +81,7 @@ "price": 5000, "symbol": "?", "color": "light_green", - "use_action": { "type": "learn_spell", "spells": [ "light_healing" ] } + "use_action": { "type": "learn_spell", "spells": [ "light_healing", "blinding_flash", "bless" ] } }, { "id": "priest_advanced", @@ -93,7 +93,7 @@ "price": 30000, "symbol": "?", "color": "green", - "use_action": { "type": "learn_spell", "spells": [ "smite" ] } + "use_action": { "type": "learn_spell", "spells": [ "smite", "holy_blade", "spirit_armor" ] } }, { "id": "winter_grasp", @@ -117,7 +117,7 @@ "price": 5000, "symbol": "?", "color": "light_grey", - "use_action": { "type": "learn_spell", "spells": [ "jolt", "windstrike" ] } + "use_action": { "type": "learn_spell", "spells": [ "jolt", "windstrike", "windrun", "storm_hammer" ] } }, { "id": "generic_spellbook", @@ -128,7 +128,7 @@ "volume": 2, "symbol": "?", "color": "magenta", - "use_action": { "type": "learn_spell", "spells": [ "seismic_stomp" ] } + "use_action": { "type": "learn_spell", "spells": [ "seismic_stomp", "create_atomic_lamp", "ethereal_grasp" ] } }, { "id": "biomancer_spellbook", @@ -168,5 +168,63 @@ "type": "learn_spell", "spells": [ "recover_mana", "recover_bionic_power", "recover_pain", "recover_fatigue", "recover_stamina" ] } + }, + { + "id": "magus_spellbook", + "type": "GENERIC", + "name": "The Tome of The Battle Mage", + "description": "Your standard wizardy looking spellbook, filled with Magus combat spells. You sure lucked out!", + "weight": 434, + "volume": 3, + "symbol": "?", + "color": "light_grey", + "use_action": { "type": "learn_spell", "spells": [ "magus_mana_beam", "magus_mana_bolt", "magus_mana_blast" ] } + }, + { + "id": "eshaper_spellbook", + "type": "GENERIC", + "name": "The Tome of the Hollow Earth", + "description": "This large dusty spellbook seems perpetually, well, dusty. It contains the power of the earth.", + "weight": 483, + "volume": 3.3, + "symbol": "?", + "color": "light_brown", + "use_action": { + "type": "learn_spell", + "spells": [ "eshaper_rockbolt", "eshaper_shardspray", "eshaper_piercing_bolt", "eshaper_shardstorm" ] + } + }, + { + "id": "magus_spellbook_move", + "type": "GENERIC", + "name": "The Tome of Magical Movement", + "description": "This small lightweight book seems to almost not entirely exist, let's say it 97% does. It contains Magus spells focused on movement.", + "weight": 231, + "volume": 2, + "symbol": "?", + "color": "light_grey", + "use_action": { "type": "learn_spell", "spells": [ "phase_door", "magus_escape", "magus_haste" ] } + }, + { + "id": "summon_scroll_smudged", + "type": "GENERIC", + "name": "Smudged Scroll", + "description": "This looks like someone was designing a new spell, but spilled a mug of coffee on it and crumpled it up in anger. You can tell that it will definitely cast something, but you can't be sure that it will work very well.", + "weight": 129, + "volume": "100 ml", + "symbol": "?", + "color": "light_grey", + "use_action": { "type": "learn_spell", "spells": [ "summon_bear" ] } + }, + { + "id": "summon_undead_spellbook", + "type": "GENERIC", + "name": "Necromantic Minions for Dummies", + "description": "This book details various ways of summoning an undead minion to fight for you. They all appear to disappear after a short time, crumbling to dust.", + "weight": 788, + "volume": 9, + "symbol": "?", + "color": "light_grey", + "use_action": { "type": "learn_spell", "spells": [ "summon_zombie", "summon_skeleton", "summon_decayed_pouncer" ] } } ] diff --git a/data/mods/Magiclysm/monster_factions.json b/data/mods/Magiclysm/monster_factions.json new file mode 100644 index 0000000000000..e4934f525fd93 --- /dev/null +++ b/data/mods/Magiclysm/monster_factions.json @@ -0,0 +1,6 @@ +[ + { + "type": "MONSTER_FACTION", + "name": "magical_beast" + } +] diff --git a/data/mods/Magiclysm/monstergroups.json b/data/mods/Magiclysm/monstergroups.json new file mode 100644 index 0000000000000..e498e678a141f --- /dev/null +++ b/data/mods/Magiclysm/monstergroups.json @@ -0,0 +1,22 @@ +[ + { + "type": "monstergroup", + "name": "GROUP_NULL", + "is_safe": true, + "default": "mon_null" + }, + { + "type": "monstergroup", + "name": "GROUP_FOREST", + "default": "mon_null", + "is_animal": true, + "monsters": [ { "monster": "mon_owlbear", "freq": 20, "cost_multiplier": 10 } ] + }, + { + "type": "monstergroup", + "name": "GROUP_CAVE", + "default": "mon_null", + "is_animal": true, + "monsters": [ { "monster": "mon_owlbear", "freq": 100, "cost_multiplier": 10, "pack_size": [ 2, 4 ] } ] + } +] diff --git a/data/mods/Magiclysm/monstergroups_egg.json b/data/mods/Magiclysm/monstergroups_egg.json new file mode 100644 index 0000000000000..c83689d2b0431 --- /dev/null +++ b/data/mods/Magiclysm/monstergroups_egg.json @@ -0,0 +1,7 @@ +[ + { + "name": "GROUP_EGG_OWLBEAR", + "type": "monstergroup", + "default": "mon_owlbear_cub" + } +] diff --git a/data/mods/Magiclysm/monsters/owlbear.json b/data/mods/Magiclysm/monsters/owlbear.json new file mode 100644 index 0000000000000..121067037903a --- /dev/null +++ b/data/mods/Magiclysm/monsters/owlbear.json @@ -0,0 +1,55 @@ +[ + { + "id": "mon_owlbear", + "type": "MONSTER", + "name": "owlbear", + "description": "The horrible owlbear is probably the result of genetic experimentation by some insane wizard. These creatures inhabit the tangled forest regions of every temperate clime, as well as subterranean labyrinths. They are ravenous eaters, aggressive hunters, and evil tempered at all times. They attack prey on sight and will fight to the death.", + "default_faction": "magical_beast", + "bodytype": "bear", + "species": [ "MAGICAL_BEAST" ], + "volume": "450000 ml", + "weight": 450000, + "hp": 260, + "speed": 120, + "material": [ "flesh" ], + "symbol": "W", + "color": "brown", + "aggression": 100, + "morale": 100, + "melee_skill": 6, + "melee_dice": 5, + "melee_dice_sides": 8, + "melee_cut": 8, + "dodge": 3, + "armor_bash": 5, + "armor_cut": 2, + "vision_night": 20, + "path_settings": { "max_dist": 25 }, + "harvest": "owlbear", + "reproduction": { "baby_egg": "egg_owlbear_rock", "baby_count": 1, "baby_timer": 20 }, + "baby_flags": [ "SPRING", "SUMMER", "AUTUMN", "WINTER" ], + "death_function": [ "NORMAL" ], + "special_attacks": [ { "type": "bite", "cooldown": 10 }, [ "GRAB", 7 ], [ "scratch", 7 ] ], + "flags": [ "SEES", "HEARS", "SMELLS", "KEENNOSE", "PATH_AVOID_DANGER_1", "WARM", "GRABS", "SWARMS" ] + }, + { + "id": "mon_owlbear_cub", + "type": "MONSTER", + "name": "owlbear cub", + "copy-from": "mon_owlbear", + "volume": "112500 ml", + "weight": 112500, + "hp": 75, + "speed": 90, + "symbol": "w", + "color": "yellow", + "morale": 40, + "melee_skill": 2, + "melee_dice": 2, + "melee_dice_sides": 4, + "melee_cut": 3, + "dodge": 2, + "harvest": "owlbear_cub", + "upgrades": { "age_grow": 20, "into": "mon_owlbear" } + } +] diff --git a/data/mods/Magiclysm/professions.json b/data/mods/Magiclysm/professions.json index 1764ed6b38169..5eccb84d1810e 100644 --- a/data/mods/Magiclysm/professions.json +++ b/data/mods/Magiclysm/professions.json @@ -34,5 +34,145 @@ "both": [ "druid_spellbook", "leathersandals", "robe", "rope_makeshift_30", "hide_bag", "hat_fur", "gloves_wraps_fur" ] }, "traits": [ "DRUID" ] + }, + { + "type": "profession", + "ident": "priest_magic2", + "name": "Priest", + "description": "When the apocalypse struck you did everything you could to protect your parish 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.", + "points": 0, + "skills": [ { "level": 3, "name": "speech" } ], + "items": { + "both": { + "items": [ "pants", "longshirt", "socks", "cassock", "dress_shoes", "holy_symbol", "holybook_bible1", "priest_beginner", "pyro" ], + "entries": [ { "group": "charged_cell_phone" } ] + }, + "male": [ "briefs" ], + "female": [ "bra", "panties" ] + } + }, + { + "type": "profession", + "ident": "shinto_priest_magic2", + "name": "Kannushi", + "description": "You were one of the maintainers of a Shinto shrine, performing rituals and sacred tasks. You preferred it when only the spirits of the dead inhabited your shrine, and not their rotting corpses.", + "points": 0, + "skills": [ { "level": 1, "name": "fabrication" }, { "level": 1, "name": "tailor" } ], + "items": { + "both": { + "items": [ "kariginu", "eboshi", "pants", "tabi_dress", "geta", "holy_symbol", "holybook_kojiki", "priest_beginner", "pyro" ], + "entries": [ { "group": "charged_cell_phone" } ] + }, + "male": [ "briefs" ], + "female": [ "bra", "panties" ] + } + }, + { + "type": "profession", + "ident": "imam_magic2", + "name": { "male": "Imam", "female": "Mourchida" }, + "description": "You spent much of your time prior to the apocalypse at the local mosque, studying the words of the Prophet and the Quran and guiding your community in prayer. Back then they came from far and wide to listen to you, now they come to eat your brains.", + "points": 0, + "//": "No knife, fire, or decent storage/armor. Skill points are countered.", + "skills": [ { "level": 2, "name": "speech" }, { "level": 1, "name": "barter" } ], + "items": { + "both": { + "items": [ "pants", "tshirt", "socks", "kufi", "thawb", "lowtops", "holybook_quran", "priest_beginner", "pyro" ], + "entries": [ { "group": "charged_cell_phone" } ] + }, + "male": [ "briefs" ], + "female": [ "bra", "panties" ] + } + }, + { + "type": "profession", + "ident": "rabbi_magic2", + "name": "Rabbi", + "description": "You were celebrating with your flock in the temple when the cataclysm struck. You sure could use a messiah right now!", + "points": 0, + "skills": [ { "level": 2, "name": "speech" }, { "level": 1, "name": "firstaid" } ], + "items": { + "both": { + "items": [ + "pants", + "leather_belt", + "dress_shirt", + "socks", + "kittel", + "kippah", + "dress_shoes", + "holy_symbol", + "holybook_talmud", + "holybook_tanakh", + "priest_beginner", + "pyro" + ], + "entries": [ { "group": "charged_cell_phone" } ] + }, + "male": [ "briefs" ], + "female": [ "bra", "panties" ] + } + }, + { + "type": "profession", + "ident": "guru_magic2", + "name": "Guru", + "description": "You spent many years traveling the world, becoming wise and learned. Normally, you can answer any question, but even you are not quite sure what to do about the ravenous undead.", + "points": 2, + "//": "1.5 pts skills, cutting implement, and plenty of storage, so lack of fire only goes so far.", + "skills": [ { "level": 2, "name": "speech" }, { "level": 1, "name": "survival" } ], + "items": { + "both": { + "items": [ + "jeans", + "tshirt", + "socks", + "robe", + "turban", + "waterskin", + "pockknife", + "mbag", + "leathersandals", + "holy_symbol", + "wristwatch", + "priest_beginner", + "pyro" + ], + "entries": [ { "group": "charged_cell_phone" } ] + }, + "male": [ "briefs" ], + "female": [ "panties" ] + } + }, + { + "type": "profession", + "ident": "preacher_magic2", + "name": "Preacher", + "description": "You devoted your life to spreading the good word; always on the road, traveling from town to town. Now everything has gone to hell, you can't host your daily podcast, and the undead listening to your sermons don't seem particularly moved.", + "points": 2, + "//": "Storage + 2 points in skills, - no knife or fire.", + "skills": [ { "level": 2, "name": "speech" }, { "level": 1, "name": "driving" }, { "level": 1, "name": "computer" } ], + "items": { + "both": { + "items": [ + "dress_shirt", + "pants", + "socks", + "dress_shoes", + "wristwatch", + "backpack", + "laptop", + "flyer", + "flyer", + "flyer", + "holy_symbol", + "priest_beginner", + "pyro" + ], + "entries": [ { "group": "charged_cell_phone" } ] + }, + "male": [ "briefs" ], + "female": [ "bra", "panties" ] + } } ] diff --git a/data/mods/Magiclysm/recipes.json b/data/mods/Magiclysm/recipes.json new file mode 100644 index 0000000000000..0f11846ef4997 --- /dev/null +++ b/data/mods/Magiclysm/recipes.json @@ -0,0 +1,15 @@ +[ + { + "type": "recipe", + "result": "egg_owlbear", + "category": "CC_FOOD", + "subcategory": "CSC_FOOD_OTHER", + "skill_used": "cooking", + "time": "2 m", + "autolearn": true, + "result_mult": 40, + "byproducts": [ [ "stone_shell", 3 ] ], + "qualities": [ { "id": "HAMMER", "level": 1 } ], + "components": [ [ [ "egg_owlbear_rock", 1 ] ] ] + } +] diff --git a/data/mods/Magiclysm/scenarios.json b/data/mods/Magiclysm/scenarios.json new file mode 100644 index 0000000000000..478a4c0e2f7b9 --- /dev/null +++ b/data/mods/Magiclysm/scenarios.json @@ -0,0 +1,13 @@ +[ + { + "type": "scenario", + "ident": "lost_faith", + "name": "Lost Faith", + "flags": [ "SUR_START", "LONE_START" ], + "points": 2, + "description": "You've been preaching your faith during a long time, but the recent events make you doubt about it. Wandering in your temple, you just found books that may restore your faith or shatter it completely.", + "start_name": "Church", + "allowed_locs": [ "church_3rdfloor_1", "church_1", "church_steeple_end", "church" ], + "professions": [ "priest_magic2", "shinto_priest_magic2", "imam_magic2", "rabbi_magic2", "guru_magic2", "preacher_magic2" ] + } +] diff --git a/data/mods/Magiclysm/species.json b/data/mods/Magiclysm/species.json new file mode 100644 index 0000000000000..d9be70ded3523 --- /dev/null +++ b/data/mods/Magiclysm/species.json @@ -0,0 +1,6 @@ +[ + { + "type": "SPECIES", + "id": "MAGICAL_BEAST" + } +] diff --git a/data/mods/Magiclysm/start_locations.json b/data/mods/Magiclysm/start_locations.json new file mode 100644 index 0000000000000..c232dae029308 --- /dev/null +++ b/data/mods/Magiclysm/start_locations.json @@ -0,0 +1,26 @@ +[ + { + "type": "start_location", + "ident": "church_3rdfloor_1", + "name": "Church", + "target": "church_3rdfloor_1" + }, + { + "type": "start_location", + "ident": "church_1", + "name": "Church", + "target": "church_1" + }, + { + "type": "start_location", + "ident": "church_steeple_end", + "name": "Church", + "target": "church_steeple_end" + }, + { + "type": "start_location", + "ident": "church", + "name": "Church", + "target": "church" + } +] diff --git a/data/mods/Magiclysm/traits/mutation.json b/data/mods/Magiclysm/traits/mutation.json index 2f62514535d2a..9a37764a76a24 100644 --- a/data/mods/Magiclysm/traits/mutation.json +++ b/data/mods/Magiclysm/traits/mutation.json @@ -222,5 +222,13 @@ "category": [ "INSECT", "MEDICAL", "CHIMERA" ], "prereqs": [ "BAD_MANA_MULT2" ], "mana_multiplier": 0.35 + }, + { + "type": "mutation", + "id": "DEBUG_spell_mutation", + "name": "Debug Spell Mutation", + "points": 20, + "description": "Gives all of the debug spells at max level.", + "spells_learned": [ [ "example_template", 10 ], [ "debug_stamina", 0 ], [ "debug_hp", 0 ], [ "debug_bionic", 0 ], [ "debug_effect", 0 ] ] } ] diff --git a/data/mods/Magiclysm/worldgen/magic_cabin.json b/data/mods/Magiclysm/worldgen/magic_cabin.json new file mode 100644 index 0000000000000..fccda2169aea6 --- /dev/null +++ b/data/mods/Magiclysm/worldgen/magic_cabin.json @@ -0,0 +1,167 @@ +[ + { + "type": "mapgen", + "method": "json", + "om_terrain": "magic_cabin", + "object": { + "fill_ter": "t_floor", + "rows": [ + ".......spppppppppp9..9..", + "9.ppp..sp||o|o|o||......", + "..pbp.9sp| NNNNNx||o||.9", + "..ppp..ss+ |YDY|..", + "9.......||t ttG o..", + "....9..||||| B| h o..", + ".9....||@@B| B|III|4.", + "..|||||Y + B|||||..", + "..|Q + By| ||.", + "..o S||||||B Y hhho.", + "..|& + KKy|R G tGto.", + "%^||||| |B Y hhho.", + "%.UU|A| @@ + y||.", + "%...+Z|x@@D|y VVOVSF||%%", + "%.M.||||oo|||+||ooo||..%", + "%.......UU.p.s.p.......%", + "%............s..111111.%", + "%.........ssss9........%", + "%.........spbp..222222.%", + "%......ssssUUU.........%", + "%........9.....9333333.%", + "%..........9......9....%", + "%.....9.............9..%", + "%%%%%%%%%%%%%%%%%%%%%%%%" + ], + "place_nested": [ + { + "chunks": [ [ "roof_6x6_garden_3", 25 ], [ "roof_6x6_greenhouse_1", 25 ], [ "roof_5x5_coop", 25 ], [ "roof_6x6_garden_2", 25 ] ], + "x": 2, + "y": 16 + } + ], + "place_loot": [ { "item": "television", "x": 10, "y": 6, "chance": 100 }, { "item": "stepladder", "x": 21, "y": 15, "chance": 100 } ], + "terrain": { + ".": [ [ "t_grass", 5 ], [ "t_grass_long", 2 ] ], + "p": "t_grass_long", + "M": "t_grass_long", + "b": "t_grass_long", + "U": "t_grass_long", + "|": "t_wall_log", + "z": "t_floor_blue", + "+": "t_door_locked", + "o": "t_window_domestic", + "%": "t_privacy_fence", + "4": "t_gutter_downspout", + "^": "t_privacy_fencegate_c", + "s": "t_dirt", + "1": "t_shrub_strawberry", + "2": "t_shrub_blackberry", + "3": "t_shrub_huckleberry", + "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" + ] + }, + "furniture": { + "p": [ "f_datura", "f_bluebell", "f_mutpoppy", "f_dahlia", "f_flower_tulip", "f_chamomile", "f_flower_spurge", "f_lily" ], + "b": "f_birdbath", + "B": "f_bookcase", + "y": [ "f_indoor_plant_y", "f_indoor_plant" ], + "@": "f_bed", + "t": "f_table", + "Q": "f_shower", + "S": "f_sink", + "Y": "f_armchair", + "R": "f_fireplace", + "C": "f_counter", + "N": "f_sofa", + "D": "f_table", + "K": "f_wardrobe", + "x": "f_floor_lamp", + "G": "f_table", + "I": "f_desk", + "h": "f_chair", + "V": "f_counter", + "M": "f_rotary_clothesline", + "O": "f_oven", + "F": "f_fridge", + "U": "f_bench", + "A": "f_air_conditioner", + "Z": "f_water_heater" + }, + "toilets": { "&": { } }, + "items": { + "I": { "item": "office", "chance": 30 }, + "Q": { "item": "shower", "chance": 30 }, + "S": { "item": "softdrugs", "chance": 30 }, + "@": { "item": "bed", "chance": 20, "repeat": [ 1, 2 ] }, + "V": { "item": "kitchen_counters", "chance": 20, "repeat": [ 1, 2 ] }, + "t": { "item": "dishes_dining", "chance": 30 }, + "D": { "item": "magic_shop_wands", "chance": 30 }, + "F": { "item": "fridge", "chance": 20, "repeat": [ 1, 2 ] }, + "G": { "item": "magic_shop_potions", "chance": 30, "repeat": [ 1, 2 ] }, + "O": { "item": "oven", "chance": 20, "repeat": [ 1, 2 ] }, + "K": { "item": "allclothes", "chance": 20, "repeat": [ 1, 2 ] }, + "B": { "item": "magic_shop_books", "chance": 20, "repeat": [ 1, 2 ] } + } + } + }, + { + "type": "mapgen", + "method": "json", + "om_terrain": "magic_cabin_roof", + "object": { + "fill_ter": "t_shingle_flat_roof", + "rows": [ + " ", + " |22222223 ", + " |.......32223 ", + " |...........3 ", + " ||...&.......3 ", + " ||............3 ", + " ||.............5 ", + " |222|..............3 ", + " |..................33 ", + " |=..................3 ", + " |.........Q.........3 ", + " |-|.................3 ", + " |................33 ", + " |...............33 ", + " |---------------3 ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " " + ], + "palettes": [ "roof_palette" ], + "terrain": { ".": "t_shingle_flat_roof" }, + "furniture": { "Q": "f_chimney" } + } + } +] diff --git a/data/mods/Magiclysm/worldgen/magic_shop.json b/data/mods/Magiclysm/worldgen/magic_shop.json new file mode 100644 index 0000000000000..3f5d9a28af96e --- /dev/null +++ b/data/mods/Magiclysm/worldgen/magic_shop.json @@ -0,0 +1,234 @@ +[ + { + "type": "mapgen", + "method": "json", + "om_terrain": "magic_shop", + "object": { + "fill_ter": "t_floor", + "rows": [ + "........ss..............", + ".....9..ss..p9pMMp9p....", + "........ss..............", + "..9....pssp||||||o||||||", + ".......pssp|<|BBBxBBBBB|", + "....9..pssp|+|B*J**J* B|", + ".9....||++|| *W**J* B|", + ".....|| ****** |", + "....||K t t N|", + "...||K t t tttt K||", + "..|| K|.", + "..| HH HH HH ##+##+#|.", + "..o #& S#LL|.", + "..|y CCCC?CC H|||o|||||.", + "..o a H|zzzzzzz%.", + "..|yPPPyPP H|z......%.", + "..||######+###|z......%.", + ".9.||BYx y@@oz......%.", + "....||B h +z......%.", + ".....||f III yoz......%.", + "..9..4||||o||||z......%.", + "........%pppMMpz9..b..%.", + ".9..9...^zzzzzzz....9.%.", + "........%%%%%%%%%%%%%%%." + ], + "place_nested": [ { "chunks": [ [ "roof_6x6_garden_3", 50 ], [ "roof_6x6_garden_4", 50 ] ], "x": 16, "y": 15 } ], + "terrain": { + ".": [ [ "t_grass", 5 ], [ "t_grass_long", 2 ], "t_dirt", "t_shrub" ], + "p": "t_grass_long", + "M": "t_grass_long", + "b": "t_grass_long", + "U": "t_grass_long", + "R": "t_grass_long", + "|": "t_rock_wall", + "z": "t_floor_blue", + "#": "t_wall_b", + "+": "t_door_red_c", + "o": "t_window_domestic", + "J": "t_carpet_green", + "W": "t_carpet_green", + "*": "t_carpet_green", + "%": "t_privacy_fence", + "<": "t_stairs_up", + "4": "t_gutter_downspout", + "^": "t_privacy_fencegate_c", + "s": "t_sidewalk", + "?": "t_console_broken", + "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" + ] + }, + "furniture": { + "p": [ "f_datura", "f_bluebell", "f_mutpoppy", "f_dahlia", "f_flower_tulip", "f_chamomile", "f_flower_spurge", "f_lily" ], + "b": "f_birdbath", + "B": "f_bookcase", + "y": [ "f_indoor_plant_y", "f_indoor_plant" ], + "f": "f_filing_cabinet", + "@": "f_sofa", + "Y": "f_armchair", + "x": "f_floor_lamp", + "N": "f_bigmirror", + "I": "f_desk", + "K": "f_wardrobe", + "M": "f_bench", + "L": "f_locker", + "h": "f_chair", + "J": "f_armchair", + "W": "f_table", + "C": "f_counter", + "a": "f_stool", + "t": "f_table", + "H": "f_displaycase", + "P": "f_glass_cabinet", + "S": "f_sink" + }, + "toilets": { "&": { } }, + "items": { + "I": { "item": "office", "chance": 30 }, + "f": { "item": "office_paper", "chance": 30 }, + "L": { "item": "cleaning", "chance": 30 }, + "y": { "item": "trash", "chance": 20, "repeat": [ 2, 4 ] }, + "B": { "item": "magic_shop_books", "chance": 20, "repeat": [ 1, 2 ] }, + "K": { "item": "magic_shop_clothes", "chance": 20, "repeat": [ 1, 2 ] }, + "H": { "item": "magic_shop_wands", "chance": 20, "repeat": [ 1, 2 ] }, + "P": { "item": "magic_shop_potions", "chance": 20, "repeat": [ 1, 2 ] }, + "t": { "item": "magic_shop_books", "chance": 20, "repeat": [ 1, 2 ] }, + "S": { "item": "softdrugs", "chance": 20, "repeat": [ 1, 2 ] } + } + } + }, + { + "type": "mapgen", + "method": "json", + "om_terrain": "magic_shop_2ndfloor", + "object": { + "fill_ter": "t_floor", + "rows": [ + " ", + " ", + " ", + " |o|##########", + " |>|4********#", + " |+||********#", + " ||oo||.y|********#", + " ||y.N.Y..|********#", + " ||B..N.t.R|********#", + " ||B...N.t.B|*******##", + " ||Y........xo*******# ", + " |y...hh.....+*******# ", + " oC..tttt....o*******# ", + " oC...hh....y|######## ", + " oC.........I| ", + " |CFCOCC...hI| ", + " ||%%%%%%+%%%| ", + " ||Q.S%....K| ", + " ||..+.@@..o ", + " ||&%.@@t.| ", + " |||ooo||| ", + " 4 ", + " ", + " " + ], + "terrain": { + ".": "t_floor", + " ": "t_open_air", + "*": "t_tile_flat_roof", + "o": "t_window_domestic", + "|": "t_rock_wall", + "%": "t_wall_b", + "+": "t_door_c", + ">": "t_stairs_down", + "#": "t_glass_railing", + "4": "t_gutter_downspout" + }, + "toilets": { "&": { } }, + "furniture": { + "@": "f_bed", + "t": "f_table", + "Q": "f_shower", + "S": "f_sink", + "B": "f_bookcase", + "Y": "f_armchair", + "R": "f_fireplace", + "C": "f_counter", + "N": "f_sofa", + "K": "f_wardrobe", + "x": "f_floor_lamp", + "I": "f_desk", + "h": "f_chair", + "O": "f_oven", + "F": "f_fridge", + "y": [ "f_indoor_plant_y", "f_indoor_plant" ] + }, + "items": { + "I": { "item": "office", "chance": 30 }, + "Q": { "item": "shower", "chance": 30 }, + "S": { "item": "softdrugs", "chance": 30 }, + "@": { "item": "bed", "chance": 20, "repeat": [ 1, 2 ] }, + "C": { "item": "kitchen_counters", "chance": 20, "repeat": [ 1, 2 ] }, + "t": { "item": "dishes_dining", "chance": 30 }, + "F": { "item": "fridge", "chance": 20, "repeat": [ 1, 2 ] }, + "O": { "item": "oven", "chance": 20, "repeat": [ 1, 2 ] }, + "K": { "item": "allclothes", "chance": 20, "repeat": [ 1, 2 ] }, + "B": { "item": "magic_shop_books", "chance": 20, "repeat": [ 1, 2 ] } + } + } + }, + { + "type": "mapgen", + "method": "json", + "om_terrain": "magic_shop_roof", + "object": { + "fill_ter": "t_flat_roof", + "rows": [ + " ", + " ", + " ", + " |23 ", + " |.3 ", + " |.53 ", + " |2222|..3 ", + " ||.......3 ", + " ||........3 ", + " ||.........3 ", + " ||..........3 ", + " |..A...:....3 ", + " |...........3 ", + " |...........3 ", + " |.......&...3 ", + " |...........3 ", + " ||..........3 ", + " ||...X.....3 ", + " ||........3 ", + " ||.......3 ", + " |5------3 ", + " ", + " ", + " " + ], + "palettes": [ "roof_palette" ] + } + } +] diff --git a/data/mods/Magiclysm/worldgen/multitile_city_buildings.json b/data/mods/Magiclysm/worldgen/multitile_city_buildings.json new file mode 100644 index 0000000000000..b7e298e61e7f2 --- /dev/null +++ b/data/mods/Magiclysm/worldgen/multitile_city_buildings.json @@ -0,0 +1,12 @@ +[ + { + "type": "city_building", + "id": "magic_shop", + "locations": [ "land" ], + "overmaps": [ + { "point": [ 0, 0, 0 ], "overmap": "magic_shop_north" }, + { "point": [ 0, 0, 1 ], "overmap": "magic_shop_2ndfloor_north" }, + { "point": [ 0, 0, 2 ], "overmap": "magic_shop_roof_north" } + ] + } +] diff --git a/data/mods/Magiclysm/worldgen/overmap_specials.json b/data/mods/Magiclysm/worldgen/overmap_specials.json new file mode 100644 index 0000000000000..072c7f0af4fb7 --- /dev/null +++ b/data/mods/Magiclysm/worldgen/overmap_specials.json @@ -0,0 +1,15 @@ +[ + { + "type": "overmap_special", + "id": "magic_cabin", + "overmaps": [ + { "point": [ 0, 0, 0 ], "overmap": "magic_cabin_north" }, + { "point": [ 0, 0, 1 ], "overmap": "magic_cabin_roof_north" } + ], + "locations": [ "wilderness" ], + "city_distance": [ 20, -1 ], + "city_sizes": [ 0, 20 ], + "occurrences": [ 0, 5 ], + "rotate": true + } +] diff --git a/data/mods/Magiclysm/worldgen/overmap_terrain.json b/data/mods/Magiclysm/worldgen/overmap_terrain.json new file mode 100644 index 0000000000000..9c3e29b564f0a --- /dev/null +++ b/data/mods/Magiclysm/worldgen/overmap_terrain.json @@ -0,0 +1,57 @@ +[ + { + "type": "overmap_terrain", + "id": "magic_shop", + "name": "magic shop", + "sym": "M", + "color": "red", + "see_cost": 5, + "extras": "build", + "mondensity": 2, + "flags": [ "SIDEWALK" ] + }, + { + "type": "overmap_terrain", + "id": "magic_shop_2ndfloor", + "name": "magic shop", + "sym": "M", + "color": "red", + "see_cost": 5, + "extras": "build", + "mondensity": 2, + "flags": [ "SIDEWALK" ] + }, + { + "type": "overmap_terrain", + "id": "magic_shop_roof", + "name": "magic shop roof", + "sym": "M", + "color": "red", + "see_cost": 5, + "extras": "build", + "mondensity": 2, + "flags": [ "SIDEWALK" ] + }, + { + "type": "overmap_terrain", + "id": "magic_cabin", + "name": "cabin", + "sym": "F", + "color": "green", + "see_cost": 5, + "extras": "build", + "mondensity": 2, + "flags": [ "SIDEWALK" ] + }, + { + "type": "overmap_terrain", + "id": "magic_cabin_roof", + "name": "cabin", + "sym": "F", + "color": "green", + "see_cost": 5, + "extras": "build", + "mondensity": 2, + "flags": [ "SIDEWALK" ] + } +] diff --git a/data/mods/Magiclysm/worldgen/regional_overlay.json b/data/mods/Magiclysm/worldgen/regional_overlay.json new file mode 100644 index 0000000000000..4a88796ff3428 --- /dev/null +++ b/data/mods/Magiclysm/worldgen/regional_overlay.json @@ -0,0 +1,8 @@ +[ + { + "type": "region_overlay", + "id": "magiclysm_buildings_overlay", + "regions": [ "all" ], + "city": { "shops": { "magic_shop": 100 } } + } +] diff --git a/data/mods/Medieval_Stuff/ammo.json b/data/mods/Medieval_Stuff/ammo.json deleted file mode 100644 index 881c657efe2f6..0000000000000 --- a/data/mods/Medieval_Stuff/ammo.json +++ /dev/null @@ -1,24 +0,0 @@ -[ - { - "id": "scrap_bronze", - "type": "AMMO", - "category": "spare_parts", - "name": "bronze", - "name_plural": "bronze", - "description": "Decent-sized chunks of bronze, for fashioning some old-school items.", - "weight": 218, - "volume": 1, - "price": 1200, - "to_hit": -2, - "bashing": 1, - "material": "bronze", - "symbol": ",", - "color": "yellow", - "count": 1, - "ammo_type": "components", - "range": 0, - "damage": 0, - "pierce": 0, - "dispersion": 0 - } -] diff --git a/data/mods/Medieval_Stuff/armor.json b/data/mods/Medieval_Stuff/armor.json deleted file mode 100644 index 5cc9e90576137..0000000000000 --- a/data/mods/Medieval_Stuff/armor.json +++ /dev/null @@ -1,66 +0,0 @@ -[ - { - "id": "helmet_corinthian", - "type": "ARMOR", - "category": "armor", - "name": "Corinthian helm", - "description": "An ancient Greek bronze helmet that provides excellent protection for the head, with slits for the eyes and mouth.", - "weight": 1310, - "volume": 10, - "price": 30000, - "bashing": 10, - "material": [ "bronze" ], - "symbol": "[", - "color": "yellow", - "covers": [ "HEAD", "EYES", "MOUTH" ], - "coverage": 90, - "encumbrance": 30, - "warmth": 10, - "material_thickness": 3, - "techniques": [ "WBLOCK_1" ], - "flags": [ "VARSIZE", "STURDY" ] - }, - { - "id": "armor_cuirass", - "type": "ARMOR", - "name": "bell cuirass", - "category": "armor", - "name_plural": "bell cuirasses", - "description": "An ancient Greek breastplate, made of bronze.", - "weight": 5896, - "volume": 24, - "price": 50000, - "to_hit": -5, - "bashing": 6, - "material": [ "bronze" ], - "symbol": "[", - "color": "yellow", - "covers": [ "TORSO" ], - "coverage": 90, - "encumbrance": 15, - "warmth": 15, - "material_thickness": 3, - "flags": [ "VARSIZE", "OUTER", "STURDY" ] - }, - { - "id": "legguard_bronze", - "type": "ARMOR", - "category": "armor", - "name": "pair of bronze greaves", - "name_plural": "pairs of bronze greaves", - "description": "A pair of bronze leg guards with a simple leather lining.", - "weight": 2520, - "volume": 22, - "price": 40000, - "to_hit": 1, - "material": [ "bronze", "leather" ], - "symbol": "[", - "color": "yellow", - "covers": [ "LEGS" ], - "coverage": 70, - "encumbrance": 10, - "warmth": 15, - "material_thickness": 4, - "flags": [ "BELTED", "STURDY" ] - } -] diff --git a/data/mods/Medieval_Stuff/handloaded_bullets.json b/data/mods/Medieval_Stuff/handloaded_bullets.json index 5b0c891d41848..824ff3bd8537e 100644 --- a/data/mods/Medieval_Stuff/handloaded_bullets.json +++ b/data/mods/Medieval_Stuff/handloaded_bullets.json @@ -14,11 +14,11 @@ "count": 1, "ammo_type": "fire_lance", "range": 3, - "damage": 50, + "damage": 15, "pierce": 0, "dispersion": 0, "recoil": 3000, - "effects": [ "COOKOFF", "RECYCLED" ] + "effects": [ "COOKOFF", "RECYCLED", "BLINDS_EYES" ] }, { "id": "lance_charge_shot", @@ -35,7 +35,7 @@ "count": 1, "ammo_type": "fire_lance", "range": 4, - "damage": 75, + "damage": 30, "pierce": 1, "dispersion": 0, "recoil": 3000, diff --git a/data/mods/Medieval_Stuff/item_groups.json b/data/mods/Medieval_Stuff/item_groups.json index bc09b669450ea..c1b08ddc94c99 100644 --- a/data/mods/Medieval_Stuff/item_groups.json +++ b/data/mods/Medieval_Stuff/item_groups.json @@ -20,11 +20,6 @@ "id": "antique_rare", "type": "item_group", "items": [ - [ "ji", 1 ], - [ "dao", 3 ], - [ "sword_xiphos", 4 ], - [ "khopesh", 4 ], - [ "spear_dory", 3 ], [ "fire_lance", 2 ], [ "lance_charge", 1 ], [ "lance_charge_shot", 1 ], @@ -39,7 +34,7 @@ { "id": "museum_melee", "type": "item_group", - "items": [ [ "ji", 2 ], [ "dao", 3 ], [ "sword_xiphos", 4 ], [ "sword_forged", 3 ], [ "khopesh", 4 ], [ "spear_dory", 3 ] ] + "items": [ [ "ji", 2 ], [ "dao", 3 ], [ "sword_xiphos", 4 ], [ "khopesh", 4 ], [ "spear_dory", 3 ] ] }, { "id": "museum_guns", @@ -60,9 +55,6 @@ "id": "museum_armor", "type": "item_group", "items": [ - [ "helmet_corinthian", 45 ], - [ "armor_cuirass", 25 ], - [ "legguard_bronze", 20 ], [ "shield_wooden", 10 ], [ "shield_wooden_large", 5 ], [ "shield_hoplon", 10 ], diff --git a/data/mods/Medieval_Stuff/martial_arts_manuals.json b/data/mods/Medieval_Stuff/martial_arts_manuals.json deleted file mode 100644 index 75b120953c876..0000000000000 --- a/data/mods/Medieval_Stuff/martial_arts_manuals.json +++ /dev/null @@ -1,15 +0,0 @@ -[ - { - "id": "manual_swordsmanship", - "copy-from": "book_martial", - "type": "GENERIC", - "name": "The Medieval Warrior", - "name_plural": "The Medieval Warrior", - "description": "A complete guide to Medieval Swordsmanship." - }, - { - "id": "book_martial", - "type": "item_group", - "items": [ [ "manual_swordsmanship", 5 ] ] - } -] diff --git a/data/mods/Medieval_Stuff/martialarts.json b/data/mods/Medieval_Stuff/martialarts.json deleted file mode 100644 index 575b4f2706bd1..0000000000000 --- a/data/mods/Medieval_Stuff/martialarts.json +++ /dev/null @@ -1,62 +0,0 @@ -[ - { - "type": "martial_art", - "id": "style_swordsmanship", - "name": "Medieval Swordsmanship", - "description": "The art of the longsword and other weapons, preceding the later development of fencing. Designed for combat both unarmored and in armor, it includes grappling as well as defensive and offensive sword techniques, plus familiarity with other weapons like polearms.", - "initiate": [ "You stand tall and become vigilant against attacks.", "%s stands tall and becomes vigilant." ], - "arm_block": 99, - "leg_block": 99, - "onattack_buffs": [ - { - "id": "swordsmanship_attack_buff", - "name": "Perfect Defense", - "description": "Bonus dodges after an attack.", - "buff_duration": 3, - "melee_allowed": true, - "bonus_dodges": 2 - } - ], - "ondodge_buffs": [ - { - "id": "swordsmanship_counter", - "name": "Displacement", - "description": "The enemy has presented an opening in their defense.", - "min_melee": 2, - "melee_allowed": true, - "max_stacks": 1, - "buff_duration": 2 - } - ], - "techniques": [ - "tec_swordsmanship_counter", - "tec_swordsmanship_grab", - "tec_swordsmanship_break", - "tec_swordsmanship_zornhau", - "tec_swordsmanship_unterhau" - ], - "weapons": [ - "sword_wood", - "sword_nail", - "sword_crude", - "zweihander", - "zweihander_inferior", - "zweifire_off", - "zweifire_on", - "arming_sword", - "arming_sword_inferior", - "longsword", - "longsword_inferior", - "dusksword", - "estoc", - "q_staff", - "i_staff", - "makeshift_halberd", - "glaive", - "pike", - "spear_steel", - "halberd", - "sword_forged" - ] - } -] diff --git a/data/mods/Medieval_Stuff/materials.json b/data/mods/Medieval_Stuff/materials.json deleted file mode 100644 index 00ae1d51ad3d3..0000000000000 --- a/data/mods/Medieval_Stuff/materials.json +++ /dev/null @@ -1,18 +0,0 @@ -[ - { - "type": "material", - "ident": "bronze", - "name": "Bronze", - "density": 58, - "bash_resist": 4, - "cut_resist": 5, - "acid_resist": 1, - "fire_resist": 2, - "elec_resist": 0, - "chip_resist": 15, - "salvaged_into": "scrap_bronze", - "dmg_adj": [ "marked", "dented", "smashed", "shattered" ], - "bash_dmg_verb": "dented", - "cut_dmg_verb": "scratched" - } -] diff --git a/data/mods/Medieval_Stuff/melee.json b/data/mods/Medieval_Stuff/melee.json deleted file mode 100644 index b30962057f0f0..0000000000000 --- a/data/mods/Medieval_Stuff/melee.json +++ /dev/null @@ -1,56 +0,0 @@ -[ - { - "id": "ji", - "type": "GENERIC", - "name": "ji", - "name_plural": "ji", - "//": "Couldn't find a good way to pluralize the transliteration.", - "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, - "volume": 15, - "price": 50000, - "to_hit": 2, - "bashing": 16, - "cutting": 31, - "material": [ "wood", "bronze" ], - "symbol": "/", - "color": "yellow", - "techniques": [ "WBLOCK_1", "DEF_DISARM" ], - "flags": [ "DURABLE_MELEE", "REACH_ATTACK" ] - }, - { - "id": "spear_dory", - "type": "GENERIC", - "name": "dory", - "name_plural": "dories", - "description": "A well-made spear with a bronze head, Greek in origin.", - "weight": 1598, - "volume": 14, - "price": 10000, - "to_hit": 2, - "bashing": 8, - "cutting": 28, - "material": [ "bronze", "wood" ], - "symbol": "/", - "color": "yellow", - "techniques": [ "WBLOCK_1", "IMPALE" ], - "qualities": [ [ "COOK", 1 ] ], - "flags": [ "SPEAR", "REACH_ATTACK", "DURABLE_MELEE" ] - }, - { - "id": "sword_forged", - "type": "GENERIC", - "name": "forged sword", - "description": "A common short sword, forged from steel. The pointy end is the dangerous one.", - "weight": 700, - "volume": 8, - "to_hit": 2, - "bashing": 4, - "cutting": 20, - "material": "steel", - "symbol": "!", - "color": "dark_gray", - "techniques": [ "WBLOCK_2" ], - "flags": [ "SPEAR", "SHEATH_SWORD" ] - } -] diff --git a/data/mods/Medieval_Stuff/modinfo.json b/data/mods/Medieval_Stuff/modinfo.json index 04773888b64ce..9831e85a571f3 100644 --- a/data/mods/Medieval_Stuff/modinfo.json +++ b/data/mods/Medieval_Stuff/modinfo.json @@ -2,9 +2,9 @@ { "type": "MOD_INFO", "ident": "Medieval_Stuff", - "name": "Medieval and Historic Content", + "name": "Medieval and Historic Classes and Shields", "authors": [ "Chaosvolt" ], - "description": "Assorted fun things for the wannabe knight, legionary, and more.", + "description": "Assorted fun classes and shields for the wannabe knight, legionary, and more.", "category": "items", "dependencies": [ "dda" ] } diff --git a/data/mods/Medieval_Stuff/mutations.json b/data/mods/Medieval_Stuff/mutations.json deleted file mode 100644 index 25223bfeff0da..0000000000000 --- a/data/mods/Medieval_Stuff/mutations.json +++ /dev/null @@ -1,12 +0,0 @@ -[ - { - "type": "mutation", - "id": "MARTIAL_ARTS5", - "name": "Melee Weapon Training", - "points": 3, - "description": "You have practiced fighting with weapons. You start with your choice of Eskrima, Fencing, Pentjak Silat, Niten Ichi-Ryu, Sōjutsu, or Medieval Swordsmanship.", - "starting_trait": true, - "initial_ma_styles": [ "style_eskrima", "style_fencing", "style_silat", "style_niten", "style_sojutsu", "style_swordsmanship" ], - "valid": false - } -] diff --git a/data/mods/Medieval_Stuff/professions.json b/data/mods/Medieval_Stuff/professions.json index 1eb115ac9668c..e8d34144a6b9c 100644 --- a/data/mods/Medieval_Stuff/professions.json +++ b/data/mods/Medieval_Stuff/professions.json @@ -78,7 +78,7 @@ "waterskin" ], "entries": [ - { "item": "sword_forged", "container-item": "baldric" }, + { "item": "sword_xiphos", "container-item": "baldric" }, { "item": "knife_hunting", "container-item": "sheath" }, { "item": "javelin_iron", "count": 2 } ] diff --git a/data/mods/Medieval_Stuff/recipe_armor.json b/data/mods/Medieval_Stuff/recipe_armor.json deleted file mode 100644 index 5b6dc3373ec22..0000000000000 --- a/data/mods/Medieval_Stuff/recipe_armor.json +++ /dev/null @@ -1,39 +0,0 @@ -[ - { - "result": "helmet_corinthian", - "type": "recipe", - "category": "CC_ARMOR", - "subcategory": "CSC_ARMOR_HEAD", - "skill_used": "fabrication", - "difficulty": 6, - "time": 70000, - "book_learn": [ [ "textbook_armwest", 5 ] ], - "using": [ [ "forging_standard", 3 ], [ "bronzesmithing_tools", 1 ] ], - "components": [ [ [ "scrap_bronze", 7 ] ], [ [ "fur", 4 ], [ "leather", 4 ] ] ] - }, - { - "result": "armor_cuirass", - "type": "recipe", - "category": "CC_ARMOR", - "subcategory": "CSC_ARMOR_TORSO", - "skill_used": "fabrication", - "difficulty": 5, - "time": 280000, - "book_learn": [ [ "textbook_armwest", 8 ] ], - "using": [ [ "forging_standard", 14 ], [ "bronzesmithing_tools", 1 ] ], - "components": [ [ [ "scrap_bronze", 28 ] ] ] - }, - { - "result": "legguard_bronze", - "type": "recipe", - "category": "CC_ARMOR", - "subcategory": "CSC_ARMOR_LEGS", - "skill_used": "fabrication", - "difficulty": 5, - "time": 120000, - "autolearn": true, - "book_learn": [ [ "textbook_armwest", 4 ], [ "recipe_melee", 4 ] ], - "using": [ [ "forging_standard", 6 ], [ "bronzesmithing_tools", 1 ] ], - "components": [ [ [ "fur", 6 ], [ "tanned_pelt", 1 ], [ "leather", 6 ], [ "tanned_hide", 1 ] ], [ [ "scrap_bronze", 12 ] ] ] - } -] diff --git a/data/mods/Medieval_Stuff/recipe_others.json b/data/mods/Medieval_Stuff/recipe_others.json deleted file mode 100644 index 8761824184e39..0000000000000 --- a/data/mods/Medieval_Stuff/recipe_others.json +++ /dev/null @@ -1,30 +0,0 @@ -[ - { - "result": "anvil_bronze", - "type": "recipe", - "category": "CC_OTHER", - "subcategory": "CSC_OTHER_TOOLS", - "skill_used": "fabrication", - "difficulty": 2, - "time": 100000, - "autolearn": true, - "using": [ [ "forging_standard", 5 ] ], - "qualities": [ { "id": "HAMMER", "level": 1 }, { "id": "ANVIL", "level": 1 } ], - "tools": [ [ [ "crucible", -1 ], [ "crucible_clay", -1 ] ] ], - "components": [ [ [ "scrap_bronze", 10 ] ] ] - }, - { - "result": "scrap_bronze", - "type": "recipe", - "category": "CC_OTHER", - "subcategory": "CSC_OTHER_MATERIALS", - "skill_used": "fabrication", - "difficulty": 2, - "time": 10000, - "batch_time_factors": [ 90, 4 ], - "autolearn": true, - "using": [ [ "forging_standard", 1 ] ], - "tools": [ [ [ "crucible", -1 ], [ "crucible_clay", -1 ] ] ], - "components": [ [ [ "tin", 10 ], [ "solder_wire", 10 ] ], [ [ "copper", 50 ] ] ] - } -] diff --git a/data/mods/Medieval_Stuff/recipe_weapon.json b/data/mods/Medieval_Stuff/recipe_weapon.json new file mode 100644 index 0000000000000..4c811678f7310 --- /dev/null +++ b/data/mods/Medieval_Stuff/recipe_weapon.json @@ -0,0 +1,16 @@ +[ + { + "result": "fire_lance", + "type": "recipe", + "category": "CC_WEAPON", + "subcategory": "CSC_WEAPON_RANGED", + "skill_used": "fabrication", + "difficulty": 3, + "skills_required": [ "gun", 1 ], + "time": 12000, + "reversible": true, + "book_learn": [ [ "textbook_armschina", 3 ] ], + "qualities": [ { "id": "SAW_M_FINE", "level": 1 }, { "id": "SCREW_FINE", "level": 1 } ], + "components": [ [ [ "qiang", 1 ] ], [ [ "pipe", 1 ] ], [ [ "scrap", 1 ] ] ] + } +] diff --git a/data/mods/Medieval_Stuff/recipe_weapons.json b/data/mods/Medieval_Stuff/recipe_weapons.json deleted file mode 100644 index 2f9bba92dbf69..0000000000000 --- a/data/mods/Medieval_Stuff/recipe_weapons.json +++ /dev/null @@ -1,133 +0,0 @@ -[ - { - "result": "ji", - "type": "recipe", - "category": "CC_WEAPON", - "subcategory": "CSC_WEAPON_PIERCING", - "skill_used": "fabrication", - "difficulty": 6, - "time": 50000, - "book_learn": [ [ "textbook_armschina", 5 ] ], - "using": [ [ "forging_standard", 2 ], [ "bronzesmithing_tools", 1 ] ], - "qualities": [ { "id": "CUT", "level": 1 } ], - "components": [ - [ [ "scrap_bronze", 4 ] ], - [ [ "stick_long", 1 ] ], - [ [ "rag", 2 ], [ "felt_patch", 2 ], [ "leather", 2 ], [ "fur", 2 ] ] - ] - }, - { - "result": "dao", - "type": "recipe", - "category": "CC_WEAPON", - "subcategory": "CSC_WEAPON_CUTTING", - "skill_used": "fabrication", - "difficulty": 7, - "time": 55000, - "book_learn": [ [ "textbook_armschina", 5 ] ], - "using": [ [ "forging_standard", 2 ], [ "bronzesmithing_tools", 1 ] ], - "components": [ - [ - [ "rag", 1 ], - [ "felt_patch", 1 ], - [ "leather", 1 ], - [ "fur", 1 ], - [ "duct_tape", 50 ], - [ "cordage_short", 2, "LIST" ], - [ "filament", 100, "LIST" ] - ], - [ [ "scrap_bronze", 5 ] ] - ] - }, - { - "result": "fire_lance", - "type": "recipe", - "category": "CC_WEAPON", - "subcategory": "CSC_WEAPON_RANGED", - "skill_used": "fabrication", - "difficulty": 3, - "skills_required": [ "gun", 1 ], - "time": 12000, - "reversible": true, - "book_learn": [ [ "textbook_armschina", 3 ] ], - "qualities": [ { "id": "SAW_M_FINE", "level": 1 }, { "id": "SCREW_FINE", "level": 1 } ], - "components": [ [ [ "qiang", 1 ] ], [ [ "pipe", 1 ] ], [ [ "scrap", 1 ] ] ] - }, - { - "result": "sword_xiphos", - "type": "recipe", - "category": "CC_WEAPON", - "subcategory": "CSC_WEAPON_CUTTING", - "skill_used": "fabrication", - "difficulty": 6, - "time": 45000, - "book_learn": [ [ "textbook_weapwest", 4 ] ], - "using": [ [ "forging_standard", 2 ], [ "bronzesmithing_tools", 1 ] ], - "components": [ - [ - [ "rag", 1 ], - [ "felt_patch", 1 ], - [ "leather", 1 ], - [ "fur", 1 ], - [ "duct_tape", 50 ], - [ "cordage_short", 2, "LIST" ], - [ "filament", 100, "LIST" ] - ], - [ [ "scrap_bronze", 4 ] ] - ] - }, - { - "result": "khopesh", - "type": "recipe", - "category": "CC_WEAPON", - "subcategory": "CSC_WEAPON_CUTTING", - "skill_used": "fabrication", - "difficulty": 7, - "time": 55000, - "book_learn": [ [ "textbook_weapwest", 5 ] ], - "using": [ [ "forging_standard", 2 ], [ "bronzesmithing_tools", 1 ] ], - "components": [ - [ - [ "rag", 1 ], - [ "felt_patch", 1 ], - [ "leather", 1 ], - [ "fur", 1 ], - [ "duct_tape", 50 ], - [ "cordage_short", 2, "LIST" ], - [ "filament", 100, "LIST" ] - ], - [ [ "scrap_bronze", 5 ] ] - ] - }, - { - "result": "spear_dory", - "type": "recipe", - "category": "CC_WEAPON", - "subcategory": "CSC_WEAPON_PIERCING", - "skill_used": "fabrication", - "difficulty": 4, - "time": 30000, - "book_learn": [ [ "textbook_weapwest", 4 ] ], - "using": [ [ "forging_standard", 1 ], [ "bronzesmithing_tools", 1 ] ], - "qualities": [ { "id": "CUT", "level": 1 } ], - "components": [ - [ [ "scrap_bronze", 2 ] ], - [ [ "stick_long", 1 ] ], - [ [ "rag", 2 ], [ "felt_patch", 2 ], [ "leather", 2 ], [ "fur", 2 ] ] - ] - }, - { - "result": "sword_forged", - "type": "recipe", - "category": "CC_WEAPON", - "subcategory": "CSC_WEAPON_PIERCING", - "skill_used": "fabrication", - "difficulty": 5, - "time": 240000, - "autolearn": true, - "using": [ [ "forging_standard", 3 ], [ "steel_standard", 3 ] ], - "qualities": [ { "id": "ANVIL", "level": 3 }, { "id": "HAMMER", "level": 3 }, { "id": "CHISEL", "level": 3 } ], - "tools": [ [ [ "tongs", -1 ] ], [ [ "crucible", -1 ], [ "crucible_clay", -1 ] ] ], - "components": [ [ [ "2x4", 1 ], [ "stick", 2 ] ], [ [ "fur", 1 ], [ "leather", 1 ] ] ] - } -] diff --git a/data/mods/Medieval_Stuff/requirements.json b/data/mods/Medieval_Stuff/requirements.json deleted file mode 100644 index 884fcb1a8a125..0000000000000 --- a/data/mods/Medieval_Stuff/requirements.json +++ /dev/null @@ -1,9 +0,0 @@ -[ - { - "id": "bronzesmithing_tools", - "type": "requirement", - "//": "Tools for casting and work hardening items made from bronze", - "qualities": [ { "id": "HAMMER", "level": 2 }, { "id": "ANVIL", "level": 2 } ], - "tools": [ [ [ "crucible", -1 ], [ "crucible_clay", -1 ] ] ] - } -] diff --git a/data/mods/Medieval_Stuff/snippets.json b/data/mods/Medieval_Stuff/snippets.json deleted file mode 100644 index ca9f1c8fcad2a..0000000000000 --- a/data/mods/Medieval_Stuff/snippets.json +++ /dev/null @@ -1,35 +0,0 @@ -[ - { - "type": "snippet", - "category": "flier", - "text": [ - "This is an flier depicting an ancient Greek soldier facing off against a viking. Below it is the text \"From kopeshes to arming swords, we have all your arms and armor needs!\"" - ] - }, - { - "type": "snippet", - "category": "note", - "text": [ "\"Got every kinda sword I need, except a spatha. And an urumi. And maybe a szabla too.\"" ] - }, - { - "type": "snippet", - "category": "note", - "text": [ "\"whys it called a heater shield anyway? only heats if i light it on fire.\"" ] - }, - { - "type": "snippet", - "category": "note", - "text": [ "\"OW IT IS TOO DAMN COLD TO BE A HOPLITE\"" ] - }, - { - "type": "snippet", - "category": "note", - "text": [ "\"I wonder if painting my longsword black and giving it a baddass name will make it cut better.\"" ], - "//": "Reference to Dusk, the debug item in the mod." - }, - { - "type": "snippet", - "category": "note", - "text": [ "\"Copper, tin, what the hell am I gonna make outta bronze anyway?\"" ] - } -] diff --git a/data/mods/Medieval_Stuff/techniques.json b/data/mods/Medieval_Stuff/techniques.json deleted file mode 100644 index 0ad8e9d946896..0000000000000 --- a/data/mods/Medieval_Stuff/techniques.json +++ /dev/null @@ -1,52 +0,0 @@ -[ - { - "type": "technique", - "id": "tec_swordsmanship_grab", - "name": "grab", - "min_melee": 3, - "unarmed_allowed": true, - "melee_allowed": true, - "down_dur": 1, - "messages": [ "You grab %s", " grabs %s" ] - }, - { - "type": "technique", - "id": "tec_swordsmanship_break", - "name": "grab break", - "min_melee": 3, - "unarmed_allowed": true, - "melee_allowed": true, - "defensive": true, - "grab_break": true, - "messages": [ "The %s tries to grab you, but you break its grab!", "The %s tries to grab , but they break its grab!" ] - }, - { - "type": "technique", - "id": "tec_swordsmanship_counter", - "name": "displace and counter", - "min_melee": 4, - "req_buffs": [ "swordsmanship_counter" ], - "messages": [ "You displace and counter %s", " displaces and counters %s" ], - "mult_bonuses": [ [ "damage", "cut", 1.1 ], [ "movecost", 0.75 ] ], - "stun_dur": 1 - }, - { - "type": "technique", - "id": "tec_swordsmanship_unterhau", - "name": "sweeping strike", - "min_melee": 5, - "crit_tec": true, - "down_dur": 2, - "messages": [ "You trip %s with a sweeping strike", " trips %s with a sweeping strike" ] - }, - { - "type": "technique", - "id": "tec_swordsmanship_zornhau", - "name": "vicious strike", - "min_melee": 6, - "crit_tec": true, - "mult_bonuses": [ [ "damage", "bash", 1.5 ], [ "damage", "cut", 1.5 ], [ "damage", "stab", 1.5 ] ], - "stun_dur": 1, - "messages": [ "You hack at %s with a vicious strike", " hack at %s with a vicious strike" ] - } -] diff --git a/data/mods/More_Locations/military_outpost/mil_outpost_1brc_01.json b/data/mods/More_Locations/military_outpost/mil_outpost_1brc_01.json index ed7da991b290b..b5af534107f77 100644 --- a/data/mods/More_Locations/military_outpost/mil_outpost_1brc_01.json +++ b/data/mods/More_Locations/military_outpost/mil_outpost_1brc_01.json @@ -40,7 +40,7 @@ "X": [ { "item": "human_flesh", "amount": 12 }, { "item": "knife_butcher", "chance": 1 } ], "x": { "item": "human_flesh", "amount": [ 10, 20 ] } }, - "place_fields": [ { "x": [ 7, 19 ], "y": [ 12, 19 ], "field": "fd_blood", "age": 2, "density": 2, "repeat": 60 } ] + "place_fields": [ { "x": [ 7, 19 ], "y": [ 12, 19 ], "field": "fd_blood", "age": 2, "intensity": 2, "repeat": 60 } ] } } ] diff --git a/data/mods/More_Locations/military_outpost/mil_outpost_ublc_03.json b/data/mods/More_Locations/military_outpost/mil_outpost_ublc_03.json index 38e23008f25a9..80b6fb9016fab 100644 --- a/data/mods/More_Locations/military_outpost/mil_outpost_ublc_03.json +++ b/data/mods/More_Locations/military_outpost/mil_outpost_ublc_03.json @@ -38,7 +38,7 @@ "h": { "item": { "item": "corpse", "amount": [ 1, 4 ] }, "fields": { "field": "fd_blood" } }, "H": { "item": { "item": "corpse", "amount": [ 3, 9 ] }, "fields": { "field": "fd_blood" } } }, - "place_fields": [ { "x": [ 2, 12 ], "y": [ 17, 22 ], "field": "fd_blood", "age": 2, "density": 2, "repeat": 20 } ] + "place_fields": [ { "x": [ 2, 12 ], "y": [ 17, 22 ], "field": "fd_blood", "age": 2, "intensity": 2, "repeat": 20 } ] } } ] diff --git a/data/mods/Mundane_Zombies/modinfo.json b/data/mods/Mundane_Zombies/modinfo.json index 4751a11214d3b..14f4c87f615b9 100644 --- a/data/mods/Mundane_Zombies/modinfo.json +++ b/data/mods/Mundane_Zombies/modinfo.json @@ -20,7 +20,6 @@ "mon_flesh_angel", "mon_homunculus", "mon_shia", - "mon_zombear", "mon_zombie_acidic", "mon_zombie_armored", "mon_zombie_bio_op", @@ -45,15 +44,12 @@ "mon_zombie_master", "mon_zombie_necro", "mon_zombie_predator", - "mon_zombie_runner", - "mon_zombie_scientist", "mon_zombie_scorched", "mon_zombie_screecher", "mon_zombie_shady", "mon_zombie_shrieker", "mon_zombie_smoker", "mon_zombie_spitter", - "mon_zombie_survivor", "mon_zombie_technician", "mon_skeleton_hulk", "mon_zombie_anklebiter", @@ -63,9 +59,10 @@ "mon_zombie_snotgobbler", "mon_zombie_sproglodyte", "mon_zombie_waif", - "mon_zombie_child_fungus", "mon_zombie_grenadier", - "mon_zombie_grenadier_elite" + "mon_zombie_grenadier_elite", + "mon_zombie_soldier_acid_1", + "mon_zombie_soldier_acid_2" ] } ] diff --git a/data/mods/National_Guard_Camp/national_guard_camp/national_guard_camp_b1.json b/data/mods/National_Guard_Camp/national_guard_camp/national_guard_camp_b1.json index 671dfc5bdf774..031be5313a459 100644 --- a/data/mods/National_Guard_Camp/national_guard_camp/national_guard_camp_b1.json +++ b/data/mods/National_Guard_Camp/national_guard_camp/national_guard_camp_b1.json @@ -55,8 +55,8 @@ ], "palettes": [ "national_guard_camp_b" ], "place_fields": [ - { "field": "fd_blood", "x": [ 20, 22 ], "y": [ 24, 26 ], "age": 0, "density": 1, "repeat": 8 }, - { "field": "fd_blood", "x": [ 88, 90 ], "y": [ 24, 26 ], "age": 0, "density": 1, "repeat": 8 } + { "field": "fd_blood", "x": [ 20, 22 ], "y": [ 24, 26 ], "age": 0, "intensity": 1, "repeat": 8 }, + { "field": "fd_blood", "x": [ 88, 90 ], "y": [ 24, 26 ], "age": 0, "intensity": 1, "repeat": 8 } ], "place_monsters": [ { "monster": "GROUP_WRAITHEON_INFANTRY", "x": [ 1, 22 ], "y": [ 25, 46 ], "density": 0.075 }, @@ -111,8 +111,8 @@ { "monster": "GROUP_WRAITHEON_INFANTRY", "x": [ 73, 94 ], "y": [ 25, 46 ], "density": 0.075 } ], "place_fields": [ - { "field": "fd_blood", "x": [ 44, 46 ], "y": [ 24, 26 ], "age": 0, "density": 1, "repeat": 8 }, - { "field": "fd_blood", "x": [ 88, 90 ], "y": [ 24, 26 ], "age": 0, "density": 1, "repeat": 8 } + { "field": "fd_blood", "x": [ 44, 46 ], "y": [ 24, 26 ], "age": 0, "intensity": 1, "repeat": 8 }, + { "field": "fd_blood", "x": [ 88, 90 ], "y": [ 24, 26 ], "age": 0, "intensity": 1, "repeat": 8 } ], "place_vehicles": [ { "vehicle": "golf_cart", "x": 42, "y": 10, "chance": 25, "rotation": 270 }, @@ -257,7 +257,7 @@ "r": { "item": "chem_school", "chance": 45 } }, "toilets": { "t": { } }, - "fields": { "!": { "field": "fd_nuke_gas", "density": 1, "age": 0 } }, + "fields": { "!": { "field": "fd_nuke_gas", "intensity": 1, "age": 0 } }, "place_monsters": [ { "monster": "GROUP_WRAITHEON_INFANTRY", "x": [ 25, 46 ], "y": [ 1, 22 ], "density": 0.1 }, { "monster": "GROUP_WRAITHEON_INFANTRY", "x": [ 49, 70 ], "y": [ 1, 22 ], "density": 0.1 }, @@ -556,7 +556,7 @@ { "monster": "GROUP_WRAITHEON_CONSTRUCTION", "x": [ 49, 70 ], "y": [ 1, 22 ], "density": 0.075 }, { "monster": "GROUP_WRAITHEON_INFANTRY", "x": [ 49, 70 ], "y": [ 25, 46 ], "density": 0.075 } ], - "place_fields": [ { "field": "fd_blood", "x": [ 56, 58 ], "y": [ 43, 45 ], "age": 0, "density": 1, "repeat": 8 } ] + "place_fields": [ { "field": "fd_blood", "x": [ 56, 58 ], "y": [ 43, 45 ], "age": 0, "intensity": 1, "repeat": 8 } ] }, "om_terrain": [ [ "national_guard_camp_b1_48", "national_guard_camp_b1_49", "national_guard_camp_b1_50" ], @@ -717,7 +717,7 @@ { "vehicle": "golf_cart", "x": 42, "y": 8, "chance": 25, "rotation": 270 }, { "vehicle": "golf_cart", "x": 42, "y": [ 30, 43 ], "chance": 25, "rotation": 90 } ], - "place_fields": [ { "field": "fd_blood", "x": [ 26, 28 ], "y": [ 21, 23 ], "age": 0, "density": 1, "repeat": 8 } ] + "place_fields": [ { "field": "fd_blood", "x": [ 26, 28 ], "y": [ 21, 23 ], "age": 0, "intensity": 1, "repeat": 8 } ] }, "om_terrain": [ [ "national_guard_camp_b1_54", "national_guard_camp_b1_55", "national_guard_camp_b1_56" ], @@ -782,7 +782,7 @@ ], "palettes": [ "national_guard_camp_b" ], "terrain": { "=": [ "t_door_metal_c", "t_door_metal_locked", "t_door_metal_locked", "t_door_metal_locked" ] }, - "fields": { "!": { "field": "fd_nuke_gas", "density": 1, "age": 0 } }, + "fields": { "!": { "field": "fd_nuke_gas", "intensity": 1, "age": 0 } }, "items": { "r": { "item": "electronics", "chance": 30 }, "(": { "item": "sewer", "chance": 1 } }, "place_monsters": [ { "monster": "GROUP_WRAITHEON_INFANTRY", "x": [ 1, 22 ], "y": [ 1, 22 ], "density": 0.075 }, @@ -853,7 +853,7 @@ " 884 e~~~~~~~~~~~~~~~~~~~~~~~~~e7777777777e Y Y e~" ], "palettes": [ "national_guard_camp_b" ], - "fields": { "!": { "field": "fd_nuke_gas", "density": 1, "age": 0 } }, + "fields": { "!": { "field": "fd_nuke_gas", "intensity": 1, "age": 0 } }, "items": { "L": { "item": "reactor_equipment", "chance": 30 }, "(": { "item": "sewer", "chance": 1 } }, "terrain": { "=": [ "t_door_metal_c", "t_door_metal_locked", "t_door_metal_locked", "t_door_metal_locked" ] }, "place_monsters": [ @@ -1299,7 +1299,7 @@ { "monster": "GROUP_WRAITHEON_INFANTRY", "x": [ 25, 46 ], "y": [ 25, 46 ], "density": 0.075 }, { "monster": "GROUP_WRAITHEON_INFANTRY", "x": [ 49, 70 ], "y": [ 25, 46 ], "density": 0.075 } ], - "place_fields": [ { "field": "fd_blood", "x": [ 65, 67 ], "y": [ 19, 21 ], "age": 0, "density": 1, "repeat": 8 } ] + "place_fields": [ { "field": "fd_blood", "x": [ 65, 67 ], "y": [ 19, 21 ], "age": 0, "intensity": 1, "repeat": 8 } ] }, "om_terrain": [ [ "national_guard_camp_b1_98", "national_guard_camp_b1_99", "national_guard_camp_b1_100" ], @@ -1366,8 +1366,8 @@ "terrain": { "=": [ "t_door_metal_c", "t_door_metal_locked", "t_door_metal_locked", "t_door_metal_locked" ] }, "items": { "d": { "item": "office", "chance": 40 }, "o": { "item": "radio", "chance": 40 } }, "place_fields": [ - { "field": "fd_blood", "x": [ 8, 11 ], "y": [ 2, 4 ], "age": 0, "density": 1, "repeat": 8 }, - { "field": "fd_blood", "x": [ 68, 70 ], "y": [ 18, 20 ], "age": 0, "density": 1, "repeat": 8 } + { "field": "fd_blood", "x": [ 8, 11 ], "y": [ 2, 4 ], "age": 0, "intensity": 1, "repeat": 8 }, + { "field": "fd_blood", "x": [ 68, 70 ], "y": [ 18, 20 ], "age": 0, "intensity": 1, "repeat": 8 } ], "place_monsters": [ { "monster": "GROUP_WRAITHEON_INFANTRY", "x": [ 1, 22 ], "y": [ 1, 22 ], "density": 0.075 }, @@ -1443,8 +1443,8 @@ "items": { "r": { "item": "electronics", "chance": 40 }, "c": { "item": "robots", "chance": 25 } }, "toilets": { "t": { } }, "place_fields": [ - { "field": "fd_blood", "x": [ 8, 10 ], "y": [ 12, 14 ], "age": 0, "density": 1, "repeat": 8 }, - { "field": "fd_blood", "x": [ 67, 69 ], "y": [ 33, 35 ], "age": 0, "density": 1, "repeat": 8 } + { "field": "fd_blood", "x": [ 8, 10 ], "y": [ 12, 14 ], "age": 0, "intensity": 1, "repeat": 8 }, + { "field": "fd_blood", "x": [ 67, 69 ], "y": [ 33, 35 ], "age": 0, "intensity": 1, "repeat": 8 } ], "place_monsters": [ { "monster": "GROUP_WRAITHEON_INFANTRY", "x": [ 1, 22 ], "y": [ 1, 22 ], "density": 0.075 }, @@ -2111,9 +2111,9 @@ ], "place_vehicles": [ { "vehicle": "golf_cart", "x": [ 4, 19 ], "y": 27, "chance": 25, "rotation": 0 } ], "place_fields": [ - { "field": "fd_blood", "x": [ 43, 45 ], "y": [ 38, 40 ], "age": 0, "density": 1, "repeat": 8 }, - { "field": "fd_blood", "x": [ 31, 33 ], "y": [ 24, 25 ], "age": 0, "density": 1, "repeat": 6 }, - { "field": "fd_blood", "x": [ 50, 52 ], "y": [ 27, 29 ], "age": 0, "density": 1, "repeat": 8 } + { "field": "fd_blood", "x": [ 43, 45 ], "y": [ 38, 40 ], "age": 0, "intensity": 1, "repeat": 8 }, + { "field": "fd_blood", "x": [ 31, 33 ], "y": [ 24, 25 ], "age": 0, "intensity": 1, "repeat": 6 }, + { "field": "fd_blood", "x": [ 50, 52 ], "y": [ 27, 29 ], "age": 0, "intensity": 1, "repeat": 8 } ] }, "om_terrain": [ diff --git a/data/mods/No_Medieval_Items/modinfo.json b/data/mods/No_Medieval_Items/modinfo.json index 8d68a24eff90e..e410b251140f9 100644 --- a/data/mods/No_Medieval_Items/modinfo.json +++ b/data/mods/No_Medieval_Items/modinfo.json @@ -30,6 +30,7 @@ "rapier_fake", "rapier", "estoc", + "estoc_inferior", "estoc_fake", "kris", "kris_fake", diff --git a/data/mods/No_Rail_Stations/modinfo.json b/data/mods/No_Rail_Stations/modinfo.json new file mode 100644 index 0000000000000..bc090156c61d5 --- /dev/null +++ b/data/mods/No_Rail_Stations/modinfo.json @@ -0,0 +1,11 @@ +[ + { + "type": "MOD_INFO", + "ident": "No_Rail_Stations", + "name": "No Rail Stations", + "authors": [ "Inglonias" ], + "description": "Removes above-ground rail stations from the game.", + "category": "buildings", + "dependencies": [ "dda" ] + } +] diff --git a/data/mods/No_Rail_Stations/overmap_specials.json b/data/mods/No_Rail_Stations/overmap_specials.json new file mode 100644 index 0000000000000..d9acca5805b44 --- /dev/null +++ b/data/mods/No_Rail_Stations/overmap_specials.json @@ -0,0 +1,34 @@ +[ + { + "id": "Railroad Station", + "type": "overmap_special", + "overmaps": [ + { "point": [ 0, 1, 0 ], "overmap": "railroad_station_0_1_north" }, + { "point": [ 0, 2, 0 ], "overmap": "railroad_station_0_2_north" }, + { "point": [ 0, 3, 0 ], "overmap": "railroad_station_0_3_north" }, + { "point": [ 0, 4, 0 ], "overmap": "railroad_station_0_4_north" }, + { "point": [ 1, 1, 0 ], "overmap": "railroad_station_1_1_north" }, + { "point": [ 1, 2, 0 ], "overmap": "railroad_station_1_2_north" }, + { "point": [ 1, 3, 0 ], "overmap": "railroad_station_1_3_north" }, + { "point": [ 1, 4, 0 ], "overmap": "railroad_station_1_4_north" }, + { "point": [ 2, 0, 0 ], "overmap": "road_end_north" }, + { "point": [ 2, 1, 0 ], "overmap": "railroad_station_2_1_north" }, + { "point": [ 2, 2, 0 ], "overmap": "railroad_station_2_2_north" }, + { "point": [ 2, 3, 0 ], "overmap": "railroad_station_2_3_north" }, + { "point": [ 2, 4, 0 ], "overmap": "railroad_station_2_4_north" }, + { "point": [ 2, 5, 0 ], "overmap": "road_end_south" }, + { "point": [ 0, 1, -1 ], "overmap": "railroad_station_under_0_1_north" }, + { "point": [ 0, 2, -1 ], "overmap": "railroad_station_under_0_2_north" }, + { "point": [ 0, 3, -1 ], "overmap": "railroad_station_under_0_3_north" }, + { "point": [ 1, 1, -1 ], "overmap": "railroad_station_under_1_1_north" }, + { "point": [ 1, 2, -1 ], "overmap": "railroad_station_under_1_2_north" }, + { "point": [ 1, 3, -1 ], "overmap": "railroad_station_under_1_3_north" } + ], + "connections": [ { "point": [ 2, 0, 0 ], "terrain": "road" }, { "point": [ 2, 5, 0 ], "terrain": "road" } ], + "locations": [ "land", "forest" ], + "city_distance": [ -1, 20 ], + "city_sizes": [ 3, 12 ], + "occurrences": [ 0, 0 ], + "flags": [ "CLASSIC" ] + } +] diff --git a/data/mods/No_Rail_Stations/region_overlay.json b/data/mods/No_Rail_Stations/region_overlay.json new file mode 100644 index 0000000000000..a33c079592501 --- /dev/null +++ b/data/mods/No_Rail_Stations/region_overlay.json @@ -0,0 +1,8 @@ +[ + { + "type": "region_overlay", + "id": "no_rail_yards", + "regions": [ "all" ], + "city": { "houses": { "railroad_city": 0 } } + } +] diff --git a/data/mods/blazemod/PAQ.txt b/data/mods/blazemod/PAQ.txt deleted file mode 100644 index ad66e967ff577..0000000000000 --- a/data/mods/blazemod/PAQ.txt +++ /dev/null @@ -1,37 +0,0 @@ -Pre-emptively Answered Questions: - -- How do I use manual turrets? -Stand on the same tile that the turret is on, have your hands free, and "f"ire it. - -- How do I make automated turrets? -Craft a turret chassis (Electronics, Mechanics, and Fabrication must be at 5 to see the recipe) and install it. You can then install most non-pistol weapons as an automated turret. - -- What's the difference between " turret" and "automated "? -Turrets have a built-in cargo where you can drop appropriate ammo to load it. Automated guns do not have a cargo slot, you must install an appropriate ammunition rack (either a small metal tank or a cargo carrier for large ammo). Ammunition racks are loaded like fuel tanks, but only accept the basic ammunition type. - -- My automated turrets won't fire! -Make sure turrets are enabled by using your vehicle controls. -Make sure turrets have access to appropriate ammo. Ammunition racks can supply all turrets on the vehicle with the right ammo. Turrets that use gas or battery power need appropriate containers. -Make sure to check "Configure Individual Turrets" in the vehicle control menu. -Turrets all have different ranges at which they'll shoot, the enemy might still be out of range. -Explosive turrets won't fire if the target is too close to the vehicle. - -- I don't understand the individual turret options. -The squares next to the turret's name show its setting. -Blank means it will not fire. -"1" means it will only fire a single shot (If it has a burst option). -"B" means it will fire full bursts. -"m" means it will only fire if you control it by using "f"ire while having free hands while being on the same tile as the vehicle's controls. -"M" means the same as "m", but does burst fire instead of single shots. -If you're using a turret that doesn't have burst fire, it will be blank or "x" for off/on. -Turrets that are manually fired won't appear on the configuration menu. - -- Blob parts? Vortex parts? Diamond parts? -For blob parts you need cooking at level 6 to see the first recipe, 7 to see them all. You also need fabrication at 5. -For vortex parts, a mechanics skill of 8 to see all recipes. -For diamond parts you need fabrication at 10 and access to a CVD machine. -Everything else is up for you to find. - -- I have a question that this doesn't answer./I found a bug./I have a suggestion. -You can find the forum thread here: http://smf.cataclysmdda.com/index.php?topic=8060.0 -Also, make sure, that if you downloaded the new version from the forum, that you delete the old blazemod folder first. Bugs may arise from duplicated files. \ No newline at end of file diff --git a/data/mods/mapspecials_demo/missile_silo/silo_fblc_01.json b/data/mods/mapspecials_demo/missile_silo/silo_fblc_01.json index f4e92de0649ec..4f02bff5cacf9 100644 --- a/data/mods/mapspecials_demo/missile_silo/silo_fblc_01.json +++ b/data/mods/mapspecials_demo/missile_silo/silo_fblc_01.json @@ -36,7 +36,7 @@ "rotation": 3, "palettes": [ "missile_silo" ], "terrain": { "*": "t_metal_floor" }, - "fields": { "*": { "field": "fd_nuke_gas", "chance": 3, "density": 2, "age": 0 } }, + "fields": { "*": { "field": "fd_nuke_gas", "chance": 3, "intensity": 2, "age": 0 } }, "monster": { "Z": { "monster": "mon_turret_rifle" } } } } diff --git a/data/mods/mapspecials_demo/missile_silo/silo_fbrc_01.json b/data/mods/mapspecials_demo/missile_silo/silo_fbrc_01.json index 53f1e0042176b..cda1b55a6cf05 100644 --- a/data/mods/mapspecials_demo/missile_silo/silo_fbrc_01.json +++ b/data/mods/mapspecials_demo/missile_silo/silo_fbrc_01.json @@ -36,7 +36,7 @@ "rotation": 2, "palettes": [ "missile_silo" ], "terrain": { "*": "t_metal_floor" }, - "fields": { "*": { "field": "fd_nuke_gas", "chance": 3, "density": 2, "age": 0 } }, + "fields": { "*": { "field": "fd_nuke_gas", "chance": 3, "intensity": 2, "age": 0 } }, "monster": { "Z": { "monster": "mon_turret_rifle" } } } } diff --git a/data/mods/mapspecials_demo/missile_silo/silo_ftlc_01.json b/data/mods/mapspecials_demo/missile_silo/silo_ftlc_01.json index 79b6e07dfcbe7..fb77de4ce59fc 100644 --- a/data/mods/mapspecials_demo/missile_silo/silo_ftlc_01.json +++ b/data/mods/mapspecials_demo/missile_silo/silo_ftlc_01.json @@ -36,7 +36,7 @@ "rotation": 0, "palettes": [ "missile_silo" ], "terrain": { "*": "t_metal_floor" }, - "fields": { "*": { "field": "fd_nuke_gas", "chance": 3, "density": 2, "age": 0 } }, + "fields": { "*": { "field": "fd_nuke_gas", "chance": 3, "intensity": 2, "age": 0 } }, "monster": { "z": { "monster": "mon_zombie_soldier" }, "Z": { "monster": "mon_zombie_bio_op" } } } } diff --git a/data/mods/mapspecials_demo/missile_silo/silo_ftrc_01.json b/data/mods/mapspecials_demo/missile_silo/silo_ftrc_01.json index c5c71b7c7f8f8..132bf9d937ba5 100644 --- a/data/mods/mapspecials_demo/missile_silo/silo_ftrc_01.json +++ b/data/mods/mapspecials_demo/missile_silo/silo_ftrc_01.json @@ -36,7 +36,7 @@ "rotation": 1, "palettes": [ "missile_silo" ], "terrain": { "*": "t_metal_floor" }, - "fields": { "*": { "field": "fd_nuke_gas", "chance": 3, "density": 2, "age": 0 } }, + "fields": { "*": { "field": "fd_nuke_gas", "chance": 3, "intensity": 2, "age": 0 } }, "monster": { "z": { "monster": "mon_zombie_soldier" } } } } diff --git a/data/motd/de.motd b/data/motd/de.motd index f9eeb3dff790b..83472ffe448c9 100644 --- a/data/motd/de.motd +++ b/data/motd/de.motd @@ -4,7 +4,7 @@ Besuch uns: * Homepage: https://cataclysmdda.org -* Wiki: http://tools.cataclysmdda.com/wiki +* Wiki: https://cddawiki.chezzo.com/cdda_wiki * Melde Bugs, Vorschläge und folge der Entwicklung auf: https://github.com/CleverRaven/Cataclysm-DDA/issues diff --git a/data/motd/en.motd b/data/motd/en.motd index e8e17ec42a5c4..b975a72345f95 100644 --- a/data/motd/en.motd +++ b/data/motd/en.motd @@ -4,7 +4,7 @@ Visit us: * Homepage: https://cataclysmdda.org -* Wiki: http://tools.cataclysmdda.com/wiki +* Wiki: https://cddawiki.chezzo.com/cdda_wiki * Report bugs, suggestion and follow the development at: https://github.com/CleverRaven/Cataclysm-DDA/issues @@ -18,3 +18,55 @@ Join the discussion on forums and chats: Other useful links are also available at our Homepage. In game you can access the options via the main menu (Esc). + +****************************************************************************** + Disclaimer for the experimental builds: +****************************************************************************** +Q: What is an experimental build? +A: The goal of the experimental builds is to be a second tier of quality +control. It's the frontline where new content is released to be tested and +balanced after initial quality control. Be aware that by choosing to play +the latest experimental builds you are participating in the development +process by literally playtesting the new content, and it is prone to bugs +and underdeveloped features. + +Q: Why are experimental builds even a thing? +A: Consider it like playing an alpha/beta version - bugs and underdeveloped +features are part of it. Due to continuous integration rigors, experimental +builds are always in a state of a constant work in progress. Experimental is +a sandbox where the bug detecting and feature polishing takes place. Big +and small features are constantly released to those builds to be checked +for overall stability and balance. Because of that, experimentals are not +under the rigor of guaranteeing balance and stability. In fact, nothing +is guaranteed in the experimental builds. + +Q: Are experimental builds playable then? +A: Yes. But while experimental builds overall are stable, it is also +not guaranteed as features may be introduced in an underdeveloped +state, in parts; and may introduce bugs, including severe ones that may +crash the game or corrupt savegames. It's rare, but due to the complexity +of the game, the initial quality control before merging with experimental +build may be inadequate, and there is always room for human error. +This is why experimental builds exist in the first place. + +Q: Should I play experimental builds then, or stick to stable build? +A: The reward is instant access to the newest content, the risk is losing +your game progress if a nasty bug emerges. It is always your choice to play +experimental builds, with a stable build avalaible, so play at your own +discretion. You take all of the burden if something goes wrong, so be warned. +Take precautions, make backups. Sometimes it's even best to postpone +updating for few days until a big feature has been stabilized or +a significant bug has been removed. + +Q: Should I be aware of anything else? +A: Yes. Remember that everything you see and are about to see is potentially +subject to change. All features, including newly implemented, are a work in +progress and may change in the course of game development. +And, as said previously, nothing is guaranteed, including balance and +stability. + +Q: What if I find the risk of playing experimental build unacceptable? +A: If the risk is unacceptable - play the stable version. If you are willing +to take the risk - enjoy the newly added content of the experimental builds +and partake in development - report bugs, submit suggestions, or even +contribute your own content to the game. Good luck. diff --git a/data/motd/es_AR.motd b/data/motd/es_AR.motd index b885e87c68688..6c74fc4e1b723 100644 --- a/data/motd/es_AR.motd +++ b/data/motd/es_AR.motd @@ -14,6 +14,6 @@ Cambios principales de la v0.C Cooper: Para ver las noticias recientes sobre Cataclysm DDA, por favor, visitá: Página web: https://cataclysmdda.org -Wiki: http://tools.cataclysmdda.com/wiki +Wiki: https://cddawiki.chezzo.com/cdda_wiki En el juego, podés acceder a las opciones con el menú de ayuda (?2). diff --git a/data/motd/it_IT.motd b/data/motd/it_IT.motd index a62064c561dc2..84e5a94445a2d 100644 --- a/data/motd/it_IT.motd +++ b/data/motd/it_IT.motd @@ -14,6 +14,6 @@ Contenuti principali in v0.C Cooper: Per le ultime discussioni e notizie su DDA, si prega di visitare: Pagina principale: https://cataclysmdda.org -Wiki: http://tools.cataclysmdda.com/wiki +Wiki: https://cddawiki.chezzo.com/cdda_wiki Mentre giochi puoi modificare le opzioni tramite il menù di aiuto (?2) diff --git a/data/motd/ko.motd b/data/motd/ko.motd index 58e5fd9f39ec2..cca51f080c533 100644 --- a/data/motd/ko.motd +++ b/data/motd/ko.motd @@ -14,6 +14,6 @@ v0.C Cooper 주요 변경점: Cataclysm DDA에 관한 최신 정보를 원하신다면 다음 사이트를 참고해주세요: 홈페이지: https://cataclysmdda.org -위키: http://tools.cataclysmdda.com/wiki +위키: https://cddawiki.chezzo.com/cdda_wiki 도움말을 통하면 게임 안에서도 설정을 변경할 수 있습니다. (?2) diff --git a/data/motd/pt_BR.motd b/data/motd/pt_BR.motd index f4784603cc7f6..556e003447872 100644 --- a/data/motd/pt_BR.motd +++ b/data/motd/pt_BR.motd @@ -14,6 +14,6 @@ Compatível com os saves das versões 0.A e 0.B. Para últimas discussões e novidades sobre Cataclysm DDA visite: Página principal: https://cataclysmdda.org -Wiki: http://tools.cataclysmdda.com/wiki +Wiki: https://cddawiki.chezzo.com/cdda_wiki Em jogo você pode acessar as opções pelo menu de ajuda (? + 2) diff --git a/data/motd/ru.motd b/data/motd/ru.motd index 9696ef89d5f02..8c0035fb85256 100644 --- a/data/motd/ru.motd +++ b/data/motd/ru.motd @@ -4,7 +4,7 @@ Полезные ссылки: * Официальный сайт: https://cataclysmdda.org -* Вики: http://tools.cataclysmdda.com/wiki +* Вики: https://cddawiki.chezzo.com/cdda_wiki Сообщайте о багах, выдвигайте предложения и следите за разработкой: * GitHub: https://github.com/CleverRaven/Cataclysm-DDA/issues diff --git a/data/motd/zh_CN.motd b/data/motd/zh_CN.motd index 02efe9f5cc173..fe18a7603b026 100644 --- a/data/motd/zh_CN.motd +++ b/data/motd/zh_CN.motd @@ -14,6 +14,6 @@ 若要了解该游戏的最新消息和讨论,请浏览以下网页: 主页:https://cataclysmdda.org -百科:http://tools.cataclysmdda.com/wiki +百科:https://cddawiki.chezzo.com/cdda_wiki 在游戏中你可以通过帮助菜单查看游戏设置。(?2) diff --git a/data/motd/zh_TW.motd b/data/motd/zh_TW.motd index 043fb38d128fa..cb2e30587ce84 100644 --- a/data/motd/zh_TW.motd +++ b/data/motd/zh_TW.motd @@ -14,6 +14,6 @@ 需要烏日到站最新的新聞與討論,請拜訪: 首頁: https://cataclysmdda.org -維基: http://tools.cataclysmdda.com/wiki +維基: https://cddawiki.chezzo.com/cdda_wiki 在遊戲中你能夠透過說明選單來存取選項(?2)。 diff --git a/data/xdg/cataclysm-dda.appdata.xml b/data/xdg/cataclysm-dda.appdata.xml index 8cb17265d25e3..f36340c013185 100644 --- a/data/xdg/cataclysm-dda.appdata.xml +++ b/data/xdg/cataclysm-dda.appdata.xml @@ -14,15 +14,7 @@ to giant insects to killer robots and things far stranger and deadlier, and against the others like yourself, that want what you have...

- - - http://www.cataclysmdda.com/assets/drive.png - - - http://www.cataclysmdda.com/assets/status.png - - - http://www.cataclysmdda.com/ + https://www.cataclysmdda.org/ https://github.com/CleverRaven/Cataclysm-DDA/issues https://www.transifex.com/cataclysm-dda-translators/cataclysm-dda/ cataclysm-dda.desktop diff --git a/doc/DEVELOPER_TOOLING.md b/doc/DEVELOPER_TOOLING.md index da14ff0b69237..64d5e39087194 100644 --- a/doc/DEVELOPER_TOOLING.md +++ b/doc/DEVELOPER_TOOLING.md @@ -9,6 +9,56 @@ On Windows, there is an astyle extension for Visual Studio. See the [JSON style guide](JSON_STYLE.md). +## clang-tidy + +Cataclysm has a [clang-tidy configuration file](../.clang-tidy) and if you have +`clang-tidy` available you can run it to perform static analysis of the +codebase. We test with `clang-tidy` from LLVM 8.0.1 on Travis, so for the most +consistent results, you might want to use that version. + +### Custom clang-tidy plugin + +We have written our own clang-tidy checks in a custom plugin. Unfortunately, +`clang-tidy` as distributed by LLVM doesn't support plugins, so making this +work requires some extra steps. + +If you are on Ubuntu Xenial then you might be able to get it working the same +way Travis does. Add the LLVM 8 Xenial source [listed +here](https://apt.llvm.org/) to your `sources.list`, install the `clang-8 +libclang-8-dev llvm-8-dev llvm-8-tools` packages and build Cataclysm with CMake +adding `-DCATA_CLANG_TIDY_PLUGIN=ON`. + +On other distributions you will probably need to build `clang-tidy` yourself. +* Check out the `llvm`, `clang`, and `clang-tools-extra` repositories in the + required layout (as described for example + [here](https://quuxplusone.github.io/blog/2018/04/16/building-llvm-from-source/). +* Patch in plugin support for `clang-tidy` using [this + patch](https://github.com/jbytheway/clang-tidy-plugin-support/blob/master/plugin-support.patch). +* Configure LLVM using CMake, including the + `-DCMAKE_EXE_LINKER_FLAGS="-rdynamic"` option. +* Add the `build/bin` directory to your path so that `clang-tidy` and + `FileCheck` are found from there. + +Then you can use your locally build `clang-tidy` to compile Cataclysm. You'll +need to use the CMake version of the Cataclysm build rather than the `Makefile` +build. Add the following CMake options: +```sh +-DCATA_CLANG_TIDY_PLUGIN=ON +-DCATA_CLANG_TIDY_INCLUDE_DIR="$extra_dir/clang-tidy" +-DCATA_CHECK_CLANG_TIDY="$extra_dir/test/clang-tidy/check_clang_tidy.py" +``` +where `$extra_dir` is the location of your `clang-tools-extra` checkout. + +If you wish to run the tests for the custom clang-tidy plugin you will also +need `lit`. This will be built as part of `llvm`, or you can install it via +`pip` or your local package manager if you prefer. + +Then, assuming `build` is your Cataclysm build directory, you can run the tests +with +```sh +lit -v build/tools/clang-tidy-plugin/test +``` + ## include-what-you-use [include-what-you-use](https://github.com/include-what-you-use/include-what-you-use) diff --git a/doc/GAME_BALANCE.md b/doc/GAME_BALANCE.md index ca700547dcb97..fe17908ad61d4 100644 --- a/doc/GAME_BALANCE.md +++ b/doc/GAME_BALANCE.md @@ -207,8 +207,8 @@ Ammo ID | Description | Energy, J | Dmg | Base Brl | 9x19mm +P+ | 115gr JHP bullet | 678 | 26 | 5.9in | | .38 Special | 130gr FMJ bullet | 256 | 16 | 4in | | .38 FMJ | 130gr FMJ bullet | 256 | 16 | 4in | | -.38 Super | 90gr JHP bullet | 658 | 26 | 4in | | -10mm Auto | 180gr FMJ bullet | 575 | 24 | 4in | | +.38 Super | 147gr JHP bullet | 660 | 26 | 4in | | +10mm Auto | 180gr FMJ bullet | 960 | 31 | 4in | | .40 S&W | 135gr JHP bullet | 575 | 24 | 4in | | .40 FMJ | 180gr FMJ bullet | 598 | 24 | 4in | | .44 Magnum | 240gr JHP bullet | 1570 | 40 | 7.5in | | @@ -216,6 +216,7 @@ Ammo ID | Description | Energy, J | Dmg | Base Brl | .45 ACP FMJ | 230gr FMJ bullet | 447 | 21 | 5in | | .45 ACP +P | 200gr JHP bullet | 702 | 26 | 5in | | .454 Casull | 300gr JSP bullet | 2459 | 50 | 7.5in | | +.45 Colt JHP | 250gr JHP bullet | 610 | 25 | 7.5in | | .500 S&W Magnum | 500gr bullet | 3056 | 55 | 8.4in | | 4.6x30mm | 31gr copper plated steel bullet | 505 | 22 | 7.1in | damage reduced by 4 | 5.7x28mm SS190 | 31gr AP FMJ bullet | 534 | 23 | 10.4in | damage reduced by 3 | @@ -240,6 +241,7 @@ Ammo ID | Description | Energy, J | Dmg | Base Brl | .50 BMG Ball | 750gr FMJ-BT bullet | 17083 | 131 | 45in | | .50 BMG M33 Ball | 706.7gr bullet | 18013 | 134 | 45in | | .50 BMG M903 SLAP | 355gr tungsten AP bullet | 17083 | 131 | 45in | Can't be used with M107A1 | +.410 000 shot | 5 000 pellets | 1530 | 39 | 18in | | # LIQUIDS: Multi-charge items are weighed by the charge/use. If you have an item that contains 40 uses, it'll weigh 40x as much (when found in-game) as you entered in the JSON. Liquids are priced by the 250mL unit, but handled in containers. This can cause problems if you create something that comes in (say) a gallon jug (15 charges) and price it at the cost of a jug's worth: it'll be 15x as expensive as intended. diff --git a/doc/JSON_FLAGS.md b/doc/JSON_FLAGS.md index 0dc0dc1a48957..ffcd50e1f7f46 100644 --- a/doc/JSON_FLAGS.md +++ b/doc/JSON_FLAGS.md @@ -239,6 +239,7 @@ Some armor flags, such as `WATCH` and `ALARMCLOCK` are compatible with other ite - ```HELMET_COMPAT``` Items that are not SKINTIGHT or OVERSIZE but can be worn with a helmet. - ```HOOD``` Allow this clothing to conditionally cover the head, for additional warmth or water protection., if the player's head isn't encumbered - ```HYGROMETER``` This gear is equipped with an accurate hygrometer (which is used to measure humidity). +- ```NO_TAKEOFF``` Item with that flag can't be taken off. - ```NO_QUICKDRAW``` Don't offer to draw items from this holster when the fire key is pressed whilst the players hands are empty - ```ONLY_ONE``` You can wear only one. - ```OUTER``` Outer garment layer. @@ -1099,8 +1100,9 @@ These branches are also the valid entries for the categories of `dreams` in `dre ### Flags - ```ALLOW_ROTTEN``` Explicitly allow rotten components when crafting non-perishables. -- ```BLIND_EASY``` Easy to craft with little to no light -- ```BLIND_HARD``` Possible to craft with little to no light, but difficult +- ```BLIND_EASY``` Easy to craft with little to no light. +- ```BLIND_HARD``` Possible to craft with little to no light, but difficult. +- ```SECRET``` Not automatically learned at character creation time based on high skill levels. - ```UNCRAFT_LIQUIDS_CONTAINED``` Spawn liquid items in its default container. - ```UNCRAFT_SINGLE_CHARGE``` Lists returned amounts for one charge of an item that is counted by charges. - ```FULL_MAGAZINE``` If this recipe requires magazines, it needs one that is full. For deconstruction recipes, it will spawn a full magazine when deconstructed. diff --git a/doc/JSON_INFO.md b/doc/JSON_INFO.md index f24cbd6efc8c2..dc801a86810f0 100644 --- a/doc/JSON_INFO.md +++ b/doc/JSON_INFO.md @@ -172,6 +172,7 @@ Currently, only effect names, item action names, and item category names support | description | In-game description. | canceled_mutations | (_optional_) A list of mutations/traits that are removed when this bionic is installed (e.g. because it replaces the fault biological part). | included_bionics | (_optional_) Additional bionics that are installed automatically when this bionic is installed. This can be used to install several bionics from one CBM item, which is useful as each of those can be activated independently. +| included | (_optional_) Whether this bionic is included with another. If true this bionic does not require a CBM item to be defined. (default: `false`) ```C++ { @@ -189,6 +190,7 @@ Currently, only effect names, item action names, and item category names support ``` Bionics effects are defined in the code and new effects cannot be created through JSON alone. +When adding a new bionic, if it's not included with another one, you must also add the corresponding CBM item in `data/json/items/bionics.json`. Even for a faulty bionic. ### Dreams @@ -1370,6 +1372,7 @@ The contents of use_action fields can either be a string indicating a built-in f "need_fire_msg": "You need a lighter!", // Message to display if there is no fire. "need_charges": 1, // Number of charges the item needs to transform. "need_charges_msg": "The lamp is empty.", // Message to display if there aren't enough charges. + "need_worn": true; // Whether the item needs to be worn to be transformed, is false by default. "target_charges" : 3, // Number of charges the transformed item has. "rand_target_charges: [10, 15, 25], // Randomize the charges the transformed item has. This example has a 50% chance of rng(10, 15) charges and a 50% chance of rng(15, 25) (The endpoints are included) "container" : "jar", // Container holding the target item. diff --git a/doc/MAGIC.md b/doc/MAGIC.md index 269c99e3fcad6..8d55c2d9ec392 100644 --- a/doc/MAGIC.md +++ b/doc/MAGIC.md @@ -18,7 +18,7 @@ In `data/mods/Magiclysm` there is a template spell, copied here for your perusal "spell_class": "NONE" // "base_casting_time": 100, // this is the casting time (in moves) "base_energy_cost": 10, // the amount of energy (of the requisite type) to cast the spell - "energy_source": "MANA", // the type of energy used to cast the spell. types are: MANA, BIONIC, HP, STAMINA, NONE (none will not use mana) + "energy_source": "MANA", // the type of energy used to cast the spell. types are: MANA, BIONIC, HP, STAMINA, FATIGUE, NONE (none will not use mana) "difficulty": 12, // the difficulty to learn/cast the spell "max_level": 10, // maximum level you can achieve in the spell "min_damage": 0, // minimum damage (or "starting" damage) diff --git a/doc/NPCs.md b/doc/NPCs.md index c4abfe14d0782..641fbbf05e913 100644 --- a/doc/NPCs.md +++ b/doc/NPCs.md @@ -441,11 +441,11 @@ Effect | Description `give_equipment` | Allows your character to select items from the NPC's inventory and transfer them to your inventory. `npc_gets_item` | Allows your character to select an item from your character's inventory and transfer it to the NPC's inventory. The NPC will not accept it if they do not have space or weight to carry it, and will set a reason that can be referenced in a future dynamic line with `"use_reason"`. `npc_gets_item_to_use` | Allow your character to select an item from your character's inventory and transfer it to the NPC's inventory. The NPC will attempt to wield it and will not accept it if it is too heavy or is an inferior weapon to what they are currently using, and will set a reason that can be referenced in a future dynamic line with `"use_reason"`. -`u_buy_item: item_string`, (*optional* `cost: cost_num`, *optional* `count: count_num`, *optional* `container: container_string`) | The NPC will give your character the item or `count_num` copies of the item, contained in container, and will remove `cost_num` from your character's cash if specified.
If cost isn't present, the NPC gives your character the item at no charge. -`u_sell_item: item_string`, (*optional* `cost: cost_num`, *optional* `count: count_num`) | Your character will give the NPC the item or `count_num` copies of the item, and will add `cost_num` to your character's cash if specified.
If cost isn't present, the your character gives the NPC the item at no charge.
This effect will fail if you do not have at least `count_num` copies of the item, so it should be checked with `u_has_items`. -`u_bulk_trade_accept`
`npc_bulk_trade_accept` | Only valid after a `repeat_response`. The player trades all instances of the item from the `repeat_response` with the NPC. For `u_bulk_trade_accept`, the player loses the items from their inventory and gains cash; for `npc_bulk_trade_accept`, the player gains the items from the NPC's inventory and loses cash. +`u_buy_item: item_string`, (*optional* `cost: cost_num`, *optional* `count: count_num`, *optional* `container: container_string`) | The NPC will give your character the item or `count_num` copies of the item, contained in container, and will subtract `cost_num` from `op_of_u.owed` if specified. If the `op_o_u.owed` is less than `cost_num`, the trade window will open and the player will have to trade to make up the difference; the NPC will not give the player the item unless `cost_num` is satisfied.
If cost isn't present, the NPC gives your character the item at no charge. +`u_sell_item: item_string`, (*optional* `cost: cost_num`, *optional* `count: count_num`) | Your character will give the NPC the item or `count_num` copies of the item, and will add `cost_num` to the NPC's `op_of_u.owed` if specified.
If cost isn't present, the your character gives the NPC the item at no charge.
This effect will fail if you do not have at least `count_num` copies of the item, so it should be checked with `u_has_items`. +`u_bulk_trade_accept`
`npc_bulk_trade_accept` | Only valid after a `repeat_response`. The player trades all instances of the item from the `repeat_response` with the NPC. For `u_bulk_trade_accept`, the player loses the items from their inventory and gains the same value of the NPC's faction currecy; for `npc_bulk_trade_accept`, the player gains the items from the NPC's inventory and loses the same value of the NPC's faction currency. If there is remaining value, or the NPC doesn't have a faction currency, the remainder goes into the NPC's `op_of_u.owed`. `u_bulk_donate`
`npc_bulk_donate` | Only valid after a `repeat_response`. The player or NPC transfers all instances of the item from the `repeat_response`. For `u_bulk_donate`, the player loses the items from their inventory and the NPC gains them; for `npc_bulk_donate`, the player gains the items from the NPC's inventory and the NPC loses them. -`u_spend_cash: cost_num` | Remove `cost_num` from your character's cash. Negative values means your character gains cash. +`u_spend_cash: cost_num` | Remove `cost_num` from your character's cash. Negative values means your character gains cash. *deprecated* NPCs should not deal in e-cash anymore, only personal debts and items. `add_debt: mod_list` | Increases the NPC's debt to the player by the values in the `mod_list`.
The following would increase the NPC's debt to the player by 1500x the NPC's altruism and 1000x the NPC's opinion of the player's value: `{ "effect": { "add_debt": [ [ "ALTRUISM", 3 ], [ "VALUE", 2 ], [ "TOTAL", 500 ] ] } }` `u_consume_item`, `npc_consume_item: item_string`, (*optional* `count: count_num`) | You or the NPC will delete the item or `count_num` copies of the item from their inventory.
This effect will fail if the you or NPC does not have at least `count_num` copies of the item, so it should be checked with `u_has_items` or `npc_has_items`. `u_remove_item_with`, `npc_remove_item_with: item_string` | You or the NPC will delete any instances of item in inventory.
This is an unconditional remove and will not fail if you or the NPC does not have the item. @@ -565,7 +565,8 @@ Condition | Type | Description #### Player Only conditions `"u_has_mission"` | string | `true` if the mission is assigned to the player character. -`"u_has_cash"` | int | `true` if the player character has at least `u_has_cash` cash available. Used to check if the PC can buy something. +`"u_has_cash"` | int | `true` if the player character has at least `u_has_cash` cash available. *Deprecated* Previously used to check if the player could buy something, but NPCs shouldn't use e-cash for trades anymore. +`"u_are_owed"` | int | `true` if the NPC's op_of_u.owed is at least `u_are_owed`. Can be used to check if the player can buy something from the NPC without needing to barter anything. `"u_has_camp"` | simple string | `true` is the player has one or more active base camps. #### Player and NPC interaction conditions diff --git a/doc/cataclysm-tiles.6 b/doc/cataclysm-tiles.6 index f6ed83afe84b1..ab4e8bfa1409f 100644 --- a/doc/cataclysm-tiles.6 +++ b/doc/cataclysm-tiles.6 @@ -91,6 +91,6 @@ Please submit bug reports to .Sh AUTHORS .An Kevin Granade Aq Mt kevin.granade@gmail.com .Sh SEE ALSO -.Lk http://www.cataclysmdda.com/ Homepage +.Lk https://cataclysmdda.org/ Homepage .Lk https://discourse.cataclysmdda.org/ Forums .Lk https://github.com/CleverRaven/Cataclysm-DDA GitHub diff --git a/doc/cataclysm.6 b/doc/cataclysm.6 index f1f8e8181b451..7b4dad7080261 100644 --- a/doc/cataclysm.6 +++ b/doc/cataclysm.6 @@ -89,6 +89,6 @@ Please submit bug reports to .Sh AUTHORS .An Kevin Granade Aq Mt kevin.granade@gmail.com .Sh SEE ALSO -.Lk http://www.cataclysmdda.com/ Homepage +.Lk https://cataclysmdda.org/ Homepage .Lk https://discourse.cataclysmdda.org/ Forums .Lk https://github.com/CleverRaven/Cataclysm-DDA GitHub diff --git a/gfx/HitButton_iso/HitButton_iso.png b/gfx/HitButton_iso/HitButton_iso.png index 754bedc426e2e..c0d2c13873d24 100644 Binary files a/gfx/HitButton_iso/HitButton_iso.png and b/gfx/HitButton_iso/HitButton_iso.png differ diff --git a/gfx/HitButton_iso/tile_config.json b/gfx/HitButton_iso/tile_config.json index 90c7e00048804..665f5d23e7087 100644 --- a/gfx/HitButton_iso/tile_config.json +++ b/gfx/HitButton_iso/tile_config.json @@ -40,6 +40,14 @@ "id": ["player_male" ], "fg": 6 }, + { + "id": ["overlay_male_run", "overlay_female_run" ], + "fg": 2501 + }, + { + "id": ["overlay_male_crouch", "overlay_female_crouch" ], + "fg": 2502 + }, { "id": ["unknown", "null", "t_null", "tr_null", "f_null", "fd_null", "vp_null", "apparatus", "bio_blade_weapon", "bio_blaster_gun", "bio_claws_weapon", "bio_eye_optic", "bio_laser_gun", "bio_lightning", "pseuso_bio_picklock", "software_blood_data", "software_hacking", "software_math", "software_medical", "software_useless", "testflames", "toolset", "generic_no_ammo", "cvd_machine", "muscle", "vp_pointer_fake_ammo", "vp_pseuso_bio_picklock", "vp_null", "vp_tracker", "vp_aisle_lights", "vp_roof_cloth", "vp_roof", "vp_hdroof", "vp_engine_1cyl", "vp_engine_vtwin", "vp_engine_inline4", "vp_engine_v6", "vp_engine_v8", "vp_engine_v12", "vp_diesel_engine_v6", "vp_diesel_engine_v8", "vp_diesel_engine_i6", "vp_engine_electric", "vp_engine_electric_enhanced", "vp_engine_electric_large", "vp_engine_electric_small", "vp_engine_plasma", "vp_foot_pedals", "vp_hand_rims", "vp_gas_tank_small", "vp_gas_tank", "vp_napalm_tank", "vp_gas_tank_little", "vp_diesel_tank_small", "vp_diesel_tank", "vp_diesel_tank_little", "vp_small_storage_battery", "vp_medium_storage_battery", "vp_storage_battery_mount", "vp_storage_battery_removable", "vp_storage_battery", "vp_minireactor", "vp_hydrogen_tank", "vp_water_tank_small", "vp_water_tank_little", "vp_water_tank", "vp_water_dirty_tank_small", "vp_water_dirty_tank_little", "vp_water_dirty_tank", "vp_water_tank_barrel", "vp_controls", "vp_controls_electronic", "vp_muffler", "vp_seatbelt", "vp_vehicle_alarm", "vp_seatbelt_heavyduty", "vp_v_curtain", "vp_aisle_curtain", "vp_water_faucet", "vp_plating_wood", "vp_plating_steel", "vp_plating_superalloy", "vp_plating_spiked", "vp_plating_hard", "vp_plating_military", "vp_headlight", "vp_headlight_reinforced", "vp_horn_bicycle", "vp_horn_car", "vp_horn_big", "vp_beeper", "vp_battery_motorbike", "vp_battery_car", "vp_alternator_motorbike", "vp_alternator_car", "vp_alternator_truck", "vp_generator_7500w", "vp_inboard_mirror", "vp_stereo", "vp_engine_1cyl_small", "vp_jumper_cable", "vp_jumper_cable_heavy", "vp_jumper_cable_debug", "vp_roof_wood", "vp_plating_chitin", "vp_plating_bone", "vp_metal_wheel", "vp_mounted_rm614", "vp_mounted_rm298", "vp_door_motor", "vp_drive_by_wire_controls", "vp_cam_control", "vp_atomic_lamp", "vp_atomic_light", "vp_vehicle_clock", "fake_UPS", "fire", "money", "pointer_fake_ammo" ], "//": "pseudo-items / stuff that shouldn't exist go here.", @@ -8594,12 +8602,36 @@ "id": ["t_grass_tall"], "fg": 2500 }, + { + "id": ["mon_zombie_brainless"], + "fg": 2503 + }, { "id": ["t_window_bars" ], "multitile": true, "height_3d": 2, "fg": [ 2496, 2497 ] }, + { + "id": ["foodperson_mask"], + "fg": 2504 + }, + { + "id": ["overlay_worn_foodperson_mask"], + "fg": 2505 + }, + { + "id": ["overlay_worn_foodperson_mask_on"], + "fg": 2506 + }, + { + "id": ["cape_fp"], + "fg": 2507 + }, + { + "id": ["overlay_worn_cape_fp"], + "fg": 2508 + }, { "id": ["highlight_item" ], "fg": 9 diff --git a/gfx/MSX++DeadPeopleEdition/14_tiles2_32x32_22365-27564.png b/gfx/MSX++DeadPeopleEdition/14_tiles2_32x32_22365-27564.png index c5182ada0251b..2524c04570d73 100644 Binary files a/gfx/MSX++DeadPeopleEdition/14_tiles2_32x32_22365-27564.png and b/gfx/MSX++DeadPeopleEdition/14_tiles2_32x32_22365-27564.png differ diff --git a/gfx/MSX++DeadPeopleEdition/17_top_hats_32x32-33165-35756.png b/gfx/MSX++DeadPeopleEdition/17_top_hats_32x32-33165-35756.png index ee16b384aa871..d93b81e9c7ae4 100644 Binary files a/gfx/MSX++DeadPeopleEdition/17_top_hats_32x32-33165-35756.png and b/gfx/MSX++DeadPeopleEdition/17_top_hats_32x32-33165-35756.png differ diff --git a/gfx/MSX++DeadPeopleEdition/18_big_things_64x80_35757.png b/gfx/MSX++DeadPeopleEdition/18_big_things_64x80_35757.png index 60087ccbfe6ee..2d21bec397e68 100644 Binary files a/gfx/MSX++DeadPeopleEdition/18_big_things_64x80_35757.png and b/gfx/MSX++DeadPeopleEdition/18_big_things_64x80_35757.png differ diff --git a/gfx/MSX++DeadPeopleEdition/1_tiles_32x32_0-5199.png b/gfx/MSX++DeadPeopleEdition/1_tiles_32x32_0-5199.png index 8d9ff3856505e..af03311a705d3 100644 Binary files a/gfx/MSX++DeadPeopleEdition/1_tiles_32x32_0-5199.png and b/gfx/MSX++DeadPeopleEdition/1_tiles_32x32_0-5199.png differ diff --git a/gfx/MSX++DeadPeopleEdition/3_tree_64x80_5392-5471.png b/gfx/MSX++DeadPeopleEdition/3_tree_64x80_5392-5471.png index 38544beea5b0e..aeb21cbb1e9c3 100644 Binary files a/gfx/MSX++DeadPeopleEdition/3_tree_64x80_5392-5471.png and b/gfx/MSX++DeadPeopleEdition/3_tree_64x80_5392-5471.png differ diff --git a/gfx/MSX++DeadPeopleEdition/8_tiles-monster-variants_32x32_11652-16851.png b/gfx/MSX++DeadPeopleEdition/8_tiles-monster-variants_32x32_11652-16851.png index 816aad6106b1b..1a163b85e680c 100644 Binary files a/gfx/MSX++DeadPeopleEdition/8_tiles-monster-variants_32x32_11652-16851.png and b/gfx/MSX++DeadPeopleEdition/8_tiles-monster-variants_32x32_11652-16851.png differ diff --git a/gfx/MSX++DeadPeopleEdition/9_tiles-connected_32x32_16852-22051.png b/gfx/MSX++DeadPeopleEdition/9_tiles-connected_32x32_16852-22051.png index ec919aeccc65f..750136169ccb0 100644 Binary files a/gfx/MSX++DeadPeopleEdition/9_tiles-connected_32x32_16852-22051.png and b/gfx/MSX++DeadPeopleEdition/9_tiles-connected_32x32_16852-22051.png differ diff --git a/gfx/MSX++DeadPeopleEdition/tile_config.json b/gfx/MSX++DeadPeopleEdition/tile_config.json index e4c1b1348b073..27ebfb82b0019 100644 --- a/gfx/MSX++DeadPeopleEdition/tile_config.json +++ b/gfx/MSX++DeadPeopleEdition/tile_config.json @@ -23,7 +23,10 @@ "fake_milling_item", "fake_burrowing", "f_lilypad_season_winter", - "f_lotus_season_winter" + "f_lotus_season_winter", + "animal", + "bio_powershot", + "f_no_item" ], "fg": 0, @@ -46658,7 +46661,7 @@ "rotates": false }, { - "id": ["357", "357_mag", "357_magn"], + "id": ["357", "357_mag", "357_magn", "357mag_fmj", "357mag_jhp", "reloaded_357mag_fmj", "reloaded_357mag_jhp"], "fg": 18, "bg": 957, "rotates": false @@ -46794,7 +46797,7 @@ "bg": 957 }, { - "id": "38_fmj", + "id": ["38_fmj", "38super_fmj", "reloaded_38super_fmj"], "fg": 33, "bg": 957, "rotates": false @@ -46902,7 +46905,7 @@ "rotates": false }, { - "id": "45_long_colt", + "id": ["45_long_colt", "45colt_jhp", "reloaded_45colt_jhp"], "fg": 49, "bg": 957, "rotates": false @@ -47153,7 +47156,7 @@ "rotates": false }, { - "id": "9mmfmj", + "id": ["9mmfmj", "bp_9mm", "bp_9mmfmj"], "fg": 86, "bg": 957, "rotates": false @@ -47779,7 +47782,7 @@ "fg": 169 }, { - "id": "reloaded_10mm", + "id": ["reloaded_10mm", "10mm_fmj", "reloaded_10mm_fmj"], "fg": 170, "bg": 957, "rotates": false @@ -48120,7 +48123,7 @@ "rotates": false }, { - "id": "410_shot", + "id": ["410_shot", "410shot_000", "reloaded_410shot_000"], "fg": 9, "bg": 957, "rotates": false @@ -48238,7 +48241,7 @@ "bg": 957 }, { - "id": "shot_00", + "id": ["shot_00", "bp_shot_00"], "fg": 223, "bg": 957, "rotates": false @@ -48256,13 +48259,13 @@ "rotates": false }, { - "id": "shot_bird", + "id": ["shot_bird", "bp_shot_bird"], "fg": 225, "bg": 957, "rotates": false }, { - "id": "shot_flechette", + "id": ["shot_flechette", "bp_shot_flechette"], "fg": 226, "bg": 957, "rotates": false @@ -48274,7 +48277,7 @@ "rotates": false }, { - "id": "shot_slug", + "id": ["shot_slug", "bp_shot_slug"], "fg": 227, "bg": 957 }, @@ -53803,19 +53806,19 @@ "rotates": false }, { - "id": ["38_casing", "3030_casing"], + "id": ["38_casing", "3030_casing", "38super_casing"], "fg": 1612, "bg": 957, "rotates": false }, { - "id": ["45lc_casing", "460_casing"], + "id": ["45lc_casing", "460_casing", "45colt_casing"], "fg": 1612, "bg": 957, "rotates": false }, { - "id": ["357sig_casing", "357_casing"], + "id": ["357sig_casing", "357_casing", "357mag_casing"], "fg": 1612, "bg": 957, "rotates": false @@ -54469,7 +54472,7 @@ "rotates": false }, { - "id": ["char_kiln", "kiln", "kilnrig", "vp_veh_kiln"], + "id": ["char_kiln", "kiln", "kilnrig", "vp_veh_kiln", "fake_char_kiln"], "fg": 1706, "bg": 957, "rotates": false @@ -54744,7 +54747,7 @@ "rotates": false }, { - "id": "forge", + "id": ["forge", "fake_forge"], "fg": 3534, "bg": 957, "rotates": false @@ -61319,6 +61322,12 @@ "fg": 1544, "bg": 967, "rotates": false + }, + { + "id": "t_cactus", + "fg": 1544, + "bg": 3215, + "rotates": false }, { "id": "mon_amigara_horror", @@ -69298,7 +69307,7 @@ "rotates": false }, { - "id": ["milk", "rice_milk", "milkshake", "milkshake_deluxe", "milkshake_fastfood", "almond_milk", "soy_milk", "milk_reconstituted"], + "id": ["milk", "rice_milk", "milkshake", "milkshake_deluxe", "milkshake_fastfood", "almond_milk", "soy_milk", "milk_reconstituted", "milk_raw", "milk_evap", "milk_UHT"], "fg": 1153, "rotates": false }, @@ -71686,7 +71695,7 @@ "fg": 1512 }, { - "id": "f_floor_canvas", + "id": ["f_floor_canvas", "f_punching_bag"], "fg": 1513, "rotates": false }, @@ -72304,7 +72313,7 @@ "rotates": false }, { - "id": "57mm_casing", + "id": ["57mm_casing", "4570_casing"], "fg": 1620, "rotates": false }, @@ -72323,7 +72332,7 @@ "fg": 1622 }, { - "id": ["9mm_casing", ".380_casing"], + "id": ["9mm_casing", ".380_casing", "10mm_casing"], "fg": 1623, "rotates": false }, @@ -73825,7 +73834,7 @@ "rotates": false }, { - "id": "shot_hull", + "id": ["shot_hull", "410shot_hull"], "fg": 1917, "rotates": false }, @@ -80196,10 +80205,6 @@ "fg": 2070, "rotates": false }, - { - "id": "rm11b_sniper_rifle", - "fg": 2073 - }, { "id": ["overlay_wielded_2_shot_special", "overlay_wielded_hs_semi"], "fg": 2074, @@ -85291,7 +85296,7 @@ ] }, { - "id": "t_searth_test", + "id": ["t_searth_test", "t_searth"], "fg": 3227, "bg": 3215, "rotates": false, @@ -93677,41 +93682,75 @@ "id": "mon_spinosaurus", "fg": 5456, "rotates": false + }, + { + "id": "corpse_mon_spinosaurus", + "fg": 5457, + "rotates": false }, { "id": "mon_tyrannosaurus", "fg": 5458, "rotates": false + }, { + "id": "corpse_mon_tyrannosaurus", + "fg": 5459, + "rotates": false }, { "id": "mon_triceratops", "fg": 5460, "rotates": false + }, { + "id": "corpse_mon_triceratops", + "fg": 5461, + "rotates": false }, { "id": "mon_stegosaurus", "fg": 5462, "rotates": false + }, { + "id": "corpse_mon_stegosaurus", + "fg": 5463, + "rotates": false }, { "id": "mon_ankylosaurus", "fg": 5464, "rotates": false + }, { + "id": "corpse_mon_ankylosaurus", + "fg": 5465, + "rotates": false }, { "id": "mon_allosaurus", "fg": 5466, "rotates": false + }, { + "id": "corpse_mon_allosaurus", + "fg": 5467, + "rotates": false }, { "id": "mon_parasaurolophus", "fg": 5468, "rotates": false + }, { + "id": "corpse_mon_parasaurolophus", + "fg": 5469, + "rotates": false }, { "id": "mon_utahraptor", "fg": 5470, "rotates": false + }, + { + "id": "corpse_mon_utahraptor", + "fg": 5471, + "rotates": false } ] @@ -95539,7 +95578,30 @@ ], "bg": 967, "rotates": false - } + }, + { + "id": "mon_zombie_dancer", + "fg": [ + { "weight":111, "sprite":2700}, + { "weight":111, "sprite":12196}, + { "weight":111, "sprite":12197}, + { "weight":111, "sprite":12198}, + { "weight":111, "sprite":12199}, + { "weight":111, "sprite":12200}, + { "weight":111, "sprite":12201}, + { "weight":111, "sprite":12202}, + { "weight":111, "sprite":12203}, + { "weight":111, "sprite":12205}, + { "weight":111, "sprite":12206}, + { "weight":111, "sprite":12207}, + { "weight":111, "sprite":12208}, + { "weight":111, "sprite":12209}, + { "weight":111, "sprite":12210}, + { "weight":111, "sprite":12211} + ], + "bg": 967, + "rotates": false + } ] }, @@ -98801,7 +98863,7 @@ "rotates": false }, { - "id": ["t_sand"], + "id": ["t_sand", "t_sand_singing", "t_sanddune"], "fg": 17540, "multitile": true, @@ -101754,7 +101816,7 @@ "rotates": false }, { - "id": "t_wall_metal", + "id": ["t_wall_metal", "t_secretdoor_metal_c"], "fg": 18628, "bg": 993, "rotates": false, @@ -103345,6 +103407,551 @@ } ], "rotates": false + }, + { + "id": "f_sandbag_half", + "fg": 19252, + "bg": 0, + "multitile": true, + "additional_tiles": [ + { + "id": "center", + "fg": 19252, + "bg": 0 + }, + { + "id": "corner", + "fg": [19253, 19254, 19255, 19256], + "bg": 0 + }, + { + "id": "t_connection", + "fg": [19257, 19258, 19259, 19260], + "bg": 0 + }, + { + "id": "edge", + "fg": [19261, 19262], + "bg": 0 + }, + { + "id": "end_piece", + "fg": [19263, 19264, 19265, 19266], + "bg": 0 + }, + { + "id": "unconnected", + "fg": 19267, + "bg": 0 + } + ], + "rotates": false + }, + { + "id": "f_sandbag_wall", + "fg": 19268, + "bg": 0, + "multitile": true, + "additional_tiles": [ + { + "id": "center", + "fg": 19268, + "bg": 0 + }, + { + "id": "corner", + "fg": [19269, 19270, 19271, 19272], + "bg": 0 + }, + { + "id": "t_connection", + "fg": [19273, 19274, 19275, 19276], + "bg": 0 + }, + { + "id": "edge", + "fg": [19277, 19278], + "bg": 0 + }, + { + "id": "end_piece", + "fg": [19279, 19280, 19281, 19282], + "bg": 0 + }, + { + "id": "unconnected", + "fg": 19283, + "bg": 0 + } + ], + "rotates": false + }, + { + "id": "t_breach_stone_fake", + "fg": 19284, + "bg": 0, + "multitile": true, + "additional_tiles": [ + { + "id": "center", + "fg": 19284, + "bg": 0 + }, + { + "id": "corner", + "fg": [19285, 19286, 19287, 19288], + "bg": 0 + }, + { + "id": "t_connection", + "fg": [19289, 19290, 19291, 19292], + "bg": 0 + }, + { + "id": "edge", + "fg": [19293, 19294], + "bg": 0 + }, + { + "id": "end_piece", + "fg": [19295, 19296, 19297, 19298], + "bg": 0 + }, + { + "id": "unconnected", + "fg": 19299, + "bg": 0 + } + ], + "rotates": false + }, + { + "id": "t_breach_concrete_fake_c", + "fg": 19300, + "bg": 0, + "multitile": true, + "additional_tiles": [ + { + "id": "center", + "fg": 19300, + "bg": 0 + }, + { + "id": "corner", + "fg": [19301, 19302, 19303, 19304], + "bg": 0 + }, + { + "id": "t_connection", + "fg": [19305, 19306, 19307, 19308], + "bg": 0 + }, + { + "id": "edge", + "fg": [19309, 19310], + "bg": 0 + }, + { + "id": "end_piece", + "fg": [19311, 19312, 19313, 19314], + "bg": 0 + }, + { + "id": "unconnected", + "fg": 19315, + "bg": 0 + } + ], + "rotates": false + }, + { + "id": "f_leaves_pile", + "fg": 19316, + "bg": 0, + "multitile": true, + "additional_tiles": [ + { + "id": "center", + "fg": 19316, + "bg": 0 + }, + { + "id": "corner", + "fg": [19317, 19318, 19319, 19320], + "bg": 0 + }, + { + "id": "t_connection", + "fg": [19321, 19322, 19323, 19324], + "bg": 0 + }, + { + "id": "edge", + "fg": [19325, 19326], + "bg": 0 + }, + { + "id": "end_piece", + "fg": [19327, 19328, 19329, 19330], + "bg": 0 + }, + { + "id": "unconnected", + "fg": 19331, + "bg": 0 + } + ], + "rotates": false + }, + { + "id": "t_outcrop", + "fg": 19332, + "bg": 3215, + "multitile": true, + "additional_tiles": [ + { + "id": "center", + "fg": 19332, + "bg": 3215 + }, + { + "id": "corner", + "fg": [19333, 19334, 19335, 19336], + "bg": 3215 + }, + { + "id": "t_connection", + "fg": [19337, 19338, 19339, 19340], + "bg": 3215 + }, + { + "id": "edge", + "fg": [19341, 19342], + "bg": 3215 + }, + { + "id": "end_piece", + "fg": [19343, 19344, 19345, 19346], + "bg": 3215 + }, + { + "id": "unconnected", + "fg": 19347, + "bg": 3215 + } + ], + "rotates": false + }, + { + "id": "t_desertpavement", + "fg": 19348, + "bg": 3215, + "multitile": true, + "additional_tiles": [ + { + "id": "center", + "fg": 19348, + "bg": 3215 + }, + { + "id": "corner", + "fg": [19349, 19350, 19351, 19352], + "bg": 3215 + }, + { + "id": "t_connection", + "fg": [19353, 19354, 19355, 19356], + "bg": 3215 + }, + { + "id": "edge", + "fg": [19357, 19358], + "bg": 3215 + }, + { + "id": "end_piece", + "fg": [19359, 19360, 19361, 19362], + "bg": 3215 + }, + { + "id": "unconnected", + "fg": 19363, + "bg": 3215 + } + ], + "rotates": false + }, + { + "id": "t_carpet_red", + "fg": 19364, + "bg": 987, + "multitile": true, + "additional_tiles": [ + { + "id": "center", + "fg": 19364, + "bg": 987 + }, + { + "id": "corner", + "fg": [19365, 19366, 19367, 19368], + "bg": 987 + }, + { + "id": "t_connection", + "fg": [19369, 19370, 19371, 19372], + "bg": 987 + }, + { + "id": "edge", + "fg": [19373, 19374], + "bg": 987 + }, + { + "id": "end_piece", + "fg": [19375, 19376, 19377, 19378], + "bg": 987 + }, + { + "id": "unconnected", + "fg": 19379, + "bg": 987 + } + ], + "rotates": false + }, + { + "id": "t_carpet_yellow", + "fg": 19380, + "bg": 987, + "multitile": true, + "additional_tiles": [ + { + "id": "center", + "fg": 19380, + "bg": 987 + }, + { + "id": "corner", + "fg": [19381, 19382, 19383, 19384], + "bg": 987 + }, + { + "id": "t_connection", + "fg": [19385, 19386, 19387, 19388], + "bg": 987 + }, + { + "id": "edge", + "fg": [19389, 19390], + "bg": 987 + }, + { + "id": "end_piece", + "fg": [19391, 19392, 19393, 19394], + "bg": 987 + }, + { + "id": "unconnected", + "fg": 19395, + "bg": 987 + } + ], + "rotates": false + }, + { + "id": "t_carpet_green", + "fg": 19396, + "bg": 987, + "multitile": true, + "additional_tiles": [ + { + "id": "center", + "fg": 19396, + "bg": 987 + }, + { + "id": "corner", + "fg": [19397, 19398, 19399, 19400], + "bg": 987 + }, + { + "id": "t_connection", + "fg": [19401, 19402, 19403, 19404], + "bg": 987 + }, + { + "id": "edge", + "fg": [19405, 19406], + "bg": 987 + }, + { + "id": "end_piece", + "fg": [19407, 19408, 19409, 19410], + "bg": 987 + }, + { + "id": "unconnected", + "fg": 19411, + "bg": 987 + } + ], + "rotates": false + }, + { + "id": "t_carpet_purple", + "fg": 19412, + "bg": 987, + "multitile": true, + "additional_tiles": [ + { + "id": "center", + "fg": 19412, + "bg": 987 + }, + { + "id": "corner", + "fg": [19413, 19414, 19415, 19416], + "bg": 987 + }, + { + "id": "t_connection", + "fg": [19417, 19418, 19419, 19420], + "bg": 987 + }, + { + "id": "edge", + "fg": [19421, 19422], + "bg": 987 + }, + { + "id": "end_piece", + "fg": [19423, 19424, 19425, 19426], + "bg": 987 + }, + { + "id": "unconnected", + "fg": 19427, + "bg": 987 + } + ], + "rotates": false + }, + { + "id": "t_carpet_concrete", + "fg": 19428, + "bg": 5010, + "multitile": true, + "additional_tiles": [ + { + "id": "center", + "fg": 19428, + "bg": 5010 + }, + { + "id": "corner", + "fg": [19429, 19430, 19431, 19432], + "bg": 5010 + }, + { + "id": "t_connection", + "fg": [19433, 19434, 19435, 19436], + "bg": 5010 + }, + { + "id": "edge", + "fg": [19437, 19438], + "bg": 5010 + }, + { + "id": "end_piece", + "fg": [19439, 19440, 19441, 19442], + "bg": 5010 + }, + { + "id": "unconnected", + "fg": 19443, + "bg": 5010 + } + ], + "rotates": false + }, + { + "id": "t_carpet_metal", + "fg": 19444, + "bg": 23383, + "multitile": true, + "additional_tiles": [ + { + "id": "center", + "fg": 19444, + "bg": 23383 + }, + { + "id": "corner", + "fg": [19445, 19446, 19447, 19448], + "bg": 23383 + }, + { + "id": "t_connection", + "fg": [19449, 19450, 19451, 19452], + "bg": 23383 + }, + { + "id": "edge", + "fg": [19453, 19454], + "bg": 23383 + }, + { + "id": "end_piece", + "fg": [19455, 19456, 19457, 19458], + "bg": 23383 + }, + { + "id": "unconnected", + "fg": 19459, + "bg": 23383 + } + ], + "rotates": false + },{ + "id": "free_realestate", + "fg": 19460, + "bg": 0, + "multitile": true, + "additional_tiles": [ + { + "id": "center", + "fg": 19460, + "bg": 0 + }, + { + "id": "corner", + "fg": [19461, 19462, 19463, 19464], + "bg": 0 + }, + { + "id": "t_connection", + "fg": [19465, 19466, 19467, 19468], + "bg": 0 + }, + { + "id": "edge", + "fg": [19469, 19470], + "bg": 0 + }, + { + "id": "end_piece", + "fg": [19471, 19472, 19473, 19474], + "bg": 0 + }, + { + "id": "unconnected", + "fg": 19475, + "bg": 0 + } + ], + "rotates": true } ] @@ -117700,7 +118307,7 @@ "bg": 0 }, { - "id": "t_metal_floor", + "id": ["t_metal_floor", "t_secretdoor_metal_o"], "fg": 23383, "bg": 0 }, @@ -124951,8 +125558,1084 @@ { "weight":1, "sprite":24567} ], "rotates": false + }, + { + "id": "1895sbl", + "fg": 24568, + "rotates": false + }, + { + "id": "overlay_wielded_1895sbl", + "fg": 24569, + "rotates": false + }, { + "id": "40mm_slug", + "fg": 24570, + "rotates": false + },{ + "id": ["4570_sp", "reloaded_4570_sp"], + "fg": 24571, + "rotates": false + },{ + "id": ["4570_pen", "reloaded_4570_pen"], + "fg": 24572, + "rotates": false + }, + { + "id": ["4570_low", "reloaded_4570_low"], + "fg": 24573, + "rotates": false + }, + { + "id": "bfr", + "fg": 24574, + "rotates": false + }, + { + "id": "overlay_wielded_bfr", + "fg": 24575, + "rotates": false + }, { + "id": "bp_38_special", + "fg": 24576, + "rotates": false + },{ + "id": "bp_44magnum", + "fg": 24577, + "rotates": false + },{ + "id": "bp_454_Casull", + "fg": 24578, + "rotates": false + }, + { + "id": "reloaded_4570_bp", + "fg": 24579, + "rotates": false + }, + { + "id": ["roller_shoes_on", "roller_shoes_off"], + "fg": 24580, + "rotates": false + }, + { + "id": ["overlay_worn_roller_shoes_off"], + "fg": 24581, + "rotates": false + }, + { + "id": ["overlay_worn_roller_shoes_on"], + "fg": 24582, + "rotates": false + }, + { + "id": ["rosin"], + "fg": 24583, + "rotates": false + }, + { + "id": ["sharps"], + "fg": 24584, + "rotates": false + }, + { + "id": ["overlay_wielded_sharps"], + "fg": 24585, + "rotates": false + }, + { + "id": ["DEBUG_spellbook"], + "fg": 24586, + "rotates": false + }, + { + "id": ["armor_stonefist", "stonefist"], + "fg": 24587, + "rotates": false + }, + { + "id": ["overlay_worn_armor_stonefist", "overlay_wielded_stonefist"], + "fg": 24588, + "rotates": false + }, { + "id": ["crystallized_mana"], + "fg": 24589, + "rotates": false + },{ + "id": ["generic_spellbook"], + "fg": 24590, + "rotates": false + }, + { + "id": ["ice_gliders"], + "fg": 24591, + "rotates": false + }, + { + "id": ["overlay_worn_ice_gliders"], + "fg": 24592, + "rotates": false + }, { + "id": ["magic_lamp"], + "fg": 24593, + "rotates": false + }, + { + "id": ["afs_welding_mask"], + "fg": 24594, + "rotates": false + }, + { + "id": ["overlay_worn_afs_welding_mask"], + "fg": 24595, + "rotates": false + }, + { + "id": ["afs_welding_mask_makeshift"], + "fg": 24596, + "rotates": false + }, { + "id": ["overlay_worn_afs_welding_mask_makeshift"], + "fg": 24597, + "rotates": false + }, + { + "id": ["magic_light"], + "fg": 24598, + "rotates": false + }, + { + "id": ["priest_beginner"], + "fg": 24599, + "rotates": false + }, + { + "id": ["priest_advanced"], + "fg": 24600, + "rotates": false + }, + { + "id": ["pyro"], + "fg": 24601, + "rotates": false + }, + { + "id": ["shield_ice"], + "fg": 24602, + "rotates": false + }, + { + "id": ["overlay_worn_shield_ice"], + "fg": 24603, + "rotates": false + }, + { + "id": ["small_mana_crystal"], + "fg": 24604, + "rotates": false + }, { + "id": ["stormglove"], + "fg": 24605, + "rotates": false + },{ + "id": ["overlay_wielded_stormglove"], + "fg": 24606, + "rotates": false + }, + { + "id": ["stormhammer"], + "fg": 24607, + "rotates": false + },{ + "id": ["overlay_wielded_stormhammer"], + "fg": 24608, + "rotates": false + }, + { + "id": ["tome_of_storms"], + "fg": 24609, + "rotates": false + },{ + "id": ["wand_fireball"], + "fg": 24610, + "rotates": false + }, + { + "id": ["overlay_wielded_wand_fireball"], + "fg": 24611, + "rotates": false + },{ + "id": ["wand_magic_missile"], + "fg": 24612, + "rotates": false + }, + { + "id": ["overlay_wielded_wand_magic_missile"], + "fg": 24613, + "rotates": false + }, + { + "id": ["RobofacCoin"], + "fg": 24614, + "rotates": false + }, + { + "id": ["riding_saddle"], + "fg": 24615, + "rotates": false + }, { + "id": ["yoke_harness"], + "fg": 24616, + "rotates": false + },{ + "id": ["vp_yoke_harness"], + "fg": 24617, + "rotates": true + },{ + "id": ["biomancer_spellbook"], + "fg": 24618, + "rotates": true + },{ + "id": ["bonespear"], + "fg": 24619, + "rotates": true + },{ + "id": ["overlay_wielded_bonespear"], + "fg": 24620, + "rotates": true + },{ + "id": ["druid_recurve"], + "fg": 24621, + "rotates": true + },{ + "id": ["overlay_wielded_druid_recurve"], + "fg": 24622, + "rotates": true + },{ + "id": ["druid_spellbook"], + "fg": 24623, + "rotates": true + },{ + "id": ["fleshpouch"], + "fg": 24624, + "rotates": true + },{ + "id": ["overlay_worn_fleshpouch"], + "fg": 24625, + "rotates": true + },{ + "id": ["tentacle_whip"], + "fg": 24626, + "rotates": true + },{ + "id": ["overlay_wielded_tentacle_whip"], + "fg": 24627, + "rotates": true + },{ + "id": ["winter_grasp"], + "fg": 24628, + "rotates": true + },{ + "id": ["wizard_beginner"], + "fg": 24629, + "rotates": true + },{ + "id": ["wizard_advanced"], + "fg": 24630, + "rotates": true + },{ + "id": ["wizard_utility"], + "fg": 24631, + "rotates": true + },{ + "id": ["afs_atompot"], + "fg": 24632, + "rotates": true + }, + { + "id": ["corpse_mon_compsognathus"], + "fg": 24633, + "rotates": true + }, { + "id": ["corpse_mon_gallimimus"], + "fg": 24634, + "rotates": true + },{ + "id": ["corpse_mon_titanis"], + "fg": 24635, + "rotates": true + },{ + "id": ["corpse_mon_eoraptor"], + "fg": 24636, + "rotates": true + },{ + "id": ["corpse_mon_velociraptor"], + "fg": 24637, + "rotates": true + },{ + "id": ["corpse_mon_deinonychus"], + "fg": 24638, + "rotates": true + },{ + "id": ["corpse_mon_dimorphodon"], + "fg": 24639, + "rotates": true + },{ + "id": ["corpse_mon_dilophosaurus"], + "fg": 24640, + "rotates": true + }, + { + "id": ["t_breach_stone_fake_lowered"], + "fg": 24641, + "rotates": false + }, + { + "id": ["t_breach_lever"], + "fg": 24642, + "bg": 24641, + "rotates": false + }, + { + "id": ["t_breach_concrete_fake_o"], + "fg": 24643, + "bg": 24641, + "rotates": false + }, + { + "id": ["mon_leaper"], + "fg": 24644, + "bg": 967, + "rotates": false + }, + { + "id": ["mon_pack"], + "fg": 24645, + "bg": 967, + "rotates": false + }, { + "id": ["mon_puker"], + "fg": 24646, + "bg": 967, + "rotates": false + }, + { + "id": ["mon_dullahan"], + "fg": 24647, + "bg": 967, + "rotates": false + }, + { + "id": ["mon_animate_arm"], + "fg": 24648, + "bg": 0, + "rotates": false + }, + { + "id": "overlay_wielded_cestus", + "fg": 24649, + "bg": 0, + "rotates": false + }, { + "id": ["1cyl_combustion_large", "vp_engine_1cyl_large"], + "fg": 24650, + "bg": 0, + "rotates": false + },{ + "id": "Dana_sourdough_bread", + "fg": 24651, + "bg": 0, + "rotates": false + },{ + "id": ["battery_motorbike_small", "vp_battery_motorbike_small"], + "fg": 24652, + "bg": 0, + "rotates": false + }, + { + "id": "landough_calrisean", + "fg": 24653, + "bg": 0, + "rotates": false + }, + { + "id": "motorcycle_headlight", + "fg": 24654, + "bg": 0, + "rotates": false + }, + { + "id": "vp_motorcycle_headlight", + "fg": 24655, + "bg": 0, + "rotates": false + },{ + "id": "tr_unfinished_construction", + "fg": 24656, + "bg": 0, + "rotates": false + },{ + "id": "wood_beam", + "fg": 24657, + "bg": 0, + "rotates": false + },{ + "id": "cholla_bud", + "fg": 24658, + "bg": 0, + "rotates": false + }, + { + "id": "mon_scorpion_giant", + "fg": 24659, + "bg": 967, + "rotates": false + }, { + "id": "mon_kangaroo_hook", + "fg": 24660, + "bg": 967, + "rotates": false + }, + { + "id": "mon_zandcrawler", + "fg": 24661, + "bg": 967, + "rotates": false + }, { + "id": "mon_gilamon", + "fg": 24662, + "bg": 0, + "rotates": false + }, + { + "id": "f_bitts", + "fg": 24663, + "bg": 0, + "rotates": false + }, + { + "id": "RPG_die", + "fg": 24664, + "bg": 0, + "rotates": false + }, + { + "id": "metal_RPG_die", + "fg": 24665, + "bg": 0, + "rotates": false + }, + { + "id": "pneumatic_shotgun", + "fg": 24666, + "bg": 0, + "rotates": false + }, + { + "id": "overlay_wielded_pneumatic_shotgun", + "fg": 24667, + "bg": 0, + "rotates": false + }, + { + "id": ["shotcanister_bearing", "shotcanister_flechette", "shotcanister_pebble", "shotcanister_scrap" ], + "fg": 24668, + "bg": 0, + "rotates": false + },{ + "id": ["mana_potion_lesser" ], + "fg": 24669, + "bg": 0, + "rotates": false + },{ + "id": ["recovery_spellbook" ], + "fg": 24670, + "bg": 0, + "rotates": false + }, + { + "id": ["glock_31" ], + "fg": 24671, + "bg": 0, + "rotates": false + }, { + "id": ["overlay_wielded_glock_31" ], + "fg": 24672, + "bg": 0, + "rotates": false + }, + { + "id": ["needlepistol" ], + "fg": 24673, + "bg": 0, + "rotates": false + }, + { + "id": "rm11b_sniper_rifle", + "fg": 24674 + }, + { + "id": "overlay_wielded_rm11b_sniper_rifle", + "fg": 24675 + }, + { + "id": "t_card_fp", + "fg": 24676 + }, + { + "id": "fp_loyalty_card", + "fg": 24677 + }, + { + "id": "m17", + "fg": 24678 + }, + { + "id": "overlay_wielded_m17", + "fg": 24679 + }, + { + "id": "angular_grinder", + "fg": 24680 + }, + { + "id": "overlay_wielded_polisher", + "fg": 24681, + "bg": 0, + "rotates": false + }, + { + "id": "overlay_wielded_angular_grinder", + "fg": 24682, + "bg": 0, + "rotates": false + }, + { + "id": "badge_foodkid", + "fg": 24683, + "bg": 0, + "rotates": false + }, + { + "id": "overlay_worn_badge_cybercop", + "fg": 24684, + "bg": 0 + },{ + "id": "overlay_worn_badge_deputy", + "fg": 24685, + "bg": 0 + },{ + "id": "overlay_worn_badge_detective", + "fg": 24686, + "bg": 0 + },{ + "id": "overlay_worn_badge_marshal", + "fg": 24687, + "bg": 0 + },{ + "id": "badge_swat", + "fg": 24688, + "bg": 0 + },{ + "id": "overlay_worn_badge_swat", + "fg": 24689, + "bg": 0 + }, + { + "id": "overlay_worn_badge_foodkid", + "fg": 24690, + "bg": 0 + }, { + "id": "overlay_worn_badge_doctor", + "fg": 24691, + "bg": 0 + }, + { + "id": "butterfly_swords", + "fg": 24692, + "bg": 0 + }, + { + "id": "overlay_wielded_butterfly_swords", + "fg": 24693, + "bg": 0 + },{ + "id": "cape_fp", + "fg": 24694, + "bg": 0 + },{ + "id": "overlay_worn_cape_fp", + "fg": 24695, + "bg": 0 + },{ + "id": "foodperson_mask", + "fg": 24696, + "bg": 0 + }, + { + "id": "foodperson_mask_on", + "fg": 24697, + "bg": 0 + }, { + "id": "chestguard_hard", + "fg": 24698, + "bg": 0 + },{ + "id": "overlay_worn_chestguard_hard", + "fg": 24699, + "bg": 0 + }, + { + "id": "vp_wheel_motorbike", + "fg": 4187, + "bg": 0, + "rotates": true, + "multitile": true, + "additional_tiles": [ + { + "id": "broken", + "fg": 24712, + "bg": 0 + } + ] + }, + { + "id": "vp_wheel_motorbike_steerable", + "fg": 4187, + "bg": 0, + "rotates": true, + "multitile": true, + "additional_tiles": [ + { + "id": "broken", + "fg": 24712, + "bg": 0 + } + ] + }, + { + "id": "vp_wheel_motorbike_or", + "fg": 4187, + "bg": 0, + "rotates": true, + "multitile": true, + "additional_tiles": [ + { + "id": "broken", + "fg": 24712, + "bg": 0 + } + ] + }, + { + "id": "vp_wheel_motorbike_or_steerable", + "fg": 24700, + "bg": 0, + "rotates": true, + "multitile": true, + "additional_tiles": [ + { + "id": "broken", + "fg": 24713, + "bg": 0 + } + ] + }, + { + "id": "vp_wheel_bicycle", + "fg": 4185, + "rotates": true, + "multitile": true, + "additional_tiles": [ + { + "id": "broken", + "fg": 24706, + "bg": 0 + } + ] + }, + { + "id": "vp_wheel_bicycle_steerable", + "fg": 24701, + "bg": 0, + "rotates": true, + "multitile": true, + "additional_tiles": [ + { + "id": "broken", + "fg": 24707, + "bg": 0 + } + ] + }, + { + "id": "vp_basketsm", + "fg": 24702, + "bg": 0, + "rotates": true + }, + { + "id": "vp_wheel_bicycle_or", + "fg": 24703, + "bg": 0, + "rotates": true, + "multitile": true, + "additional_tiles": [ + { + "id": "broken", + "fg": 24708, + "bg": 0 + } + ] + }, + { + "id": "vp_wheel_bicycle_or_steerable", + "fg": 24704, + "bg": 0, + "rotates": true, + "multitile": true, + "additional_tiles": [ + { + "id": "broken", + "fg": 24709, + "bg": 0 + } + ] + }, + { + "id": "vp_wheel_small", + "fg": 4188, + "rotates": true, + "multitile": true, + "additional_tiles": [ + { + "id": "broken", + "fg": 24710, + "bg": 0 + } + ] + }, + { + "id": "vp_wheel_small_steerable", + "fg": 24705, + "bg": 0, + "rotates": true, + "multitile": true, + "additional_tiles": [ + { + "id": "broken", + "fg": 24711, + "bg": 0 + } + ] + }, + { + "id": "armor_scrapsuit", + "fg": 24714, + "bg": 0 + }, + { + "id": "cuirass_scrap", + "fg": 24715, + "bg": 0 + }, + { + "id": "overlay_worn_cuirass_scrap", + "fg": 24716, + "bg": 0 + }, { + "id": "armguard_scrap", + "fg": 24717, + "bg": 0 + }, + { + "id": "overlay_worn_armguard_scrap", + "fg": 24718, + "bg": 0 + },{ + "id": "helmet_scrap", + "fg": 24719, + "bg": 0 + }, + { + "id": "overlay_worn_helmet_scrap", + "fg": 24720, + "bg": 0 + },{ + "id": "legguard_scrap", + "fg": 24721, + "bg": 0 + }, + { + "id": "overlay_worn_legguard_scrap", + "fg": 24722, + "bg": 0 + },{ + "id": "boots_scrap", + "fg": 24723, + "bg": 0 + }, + { + "id": "overlay_worn_boots_scrap", + "fg": 24724, + "bg": 0 + },{ + "id": "hand_vice", + "fg": 24725, + "bg": 0 + }, + { + "id": "robofac_jumpsuit", + "fg": 24726, + "bg": 0 + }, + { + "id": "overlay_male_worn_robofac_jumpsuit", + "fg": 24727, + "bg": 0 + },{ + "id": "overlay_female_worn_robofac_jumpsuit", + "fg": 24728, + "bg": 0 + },{ + "id": "hinge", + "fg": 24729, + "bg": 0 + }, + { + "id": "homemade_burrito", + "fg": 24730, + "bg": 0 + },{ + "id": "junk_burrito", + "fg": 24731, + "bg": 0 + },{ + "id": "pin_reamer", + "fg": 24732, + "bg": 0 + }, + { + "id": "saddlebag", + "fg": 24733, + "bg": 0 + }, + { + "id": "overlay_worn_saddlebag", + "fg": 24734, + "bg": 0 + }, + { + "id": ["shot_dragon", "reloaded_shot_dragon"], + "fg": 24735, + "bg": 0 }, { + "id": ["p320_357sig"], + "fg": 24736, + "bg": 0 + }, { + "id": ["overlay_wielded_p320_357sig"], + "fg": 24737, + "bg": 0 + }, + { + "id": ["f_hanging_meathook"], + "fg": 24738, + "bg": 0 + }, { + "id": ["f_speaker_cabinet"], + "fg": 24739, + "bg": 0 + }, { + "id": ["carton_sealed"], + "fg": 24740, + "bg": 0 + }, { + "id": ["carton_unsealed"], + "fg": 24741, + "bg": 0 + }, + { + "id": ["amplifier_head"], + "fg": 24742, + "bg": 0 + }, { + "id": ["butter"], + "fg": 24743, + "bg": 0 + },{ + "id": ["buttermilk"], + "fg": 24744, + "bg": 0 + }, + { + "id": ["grip_hook"], + "fg": 24745, + "bg": 0 + }, { + "id": ["overlay_wielded_grip_hook"], + "fg": 24746, + "bg": 0 + }, { + "id": ["tshirt_tour"], + "fg": 24747, + "bg": 0 + }, { + "id": ["overlay_female_worn_tshirt_tour"], + "fg": 24748, + "bg": 0 + },{ + "id": ["overlay_male_worn_tshirt_tour"], + "fg": 24749, + "bg": 0 + }, + { + "id": ["ghee"], + "fg": 24750, + "bg": 0 + }, { + "id": ["gloves_cut_resistant"], + "fg": 24751, + "bg": 0 + }, { + "id": ["overlay_worn_gloves_cut_resistant"], + "fg": 24752, + "bg": 0 + }, + { + "id": ["manual_wingchun"], + "fg": 24753, + "bg": 0 + }, { + "id": ["metal_file"], + "fg": 24754, + "bg": 0 + },{ + "id": ["pipe_cleaner"], + "fg": 24755, + "bg": 0 + }, { + "id": ["guitar_electric"], + "fg": 24756, + "bg": 0 + },{ + "id": ["overlay_wielded_guitar_electric"], + "fg": 24757, + "bg": 0 + }, + { + "id": ["overlay_worn_acoustic_guitar"], + "fg": 24758, + "bg": 0 + }, { + "id": ["overlay_worn_guitar_electric"], + "fg": 24759, + "bg": 0 + }, + { + "id": ["xlhsurvivor_suit"], + "fg": 24760, + "bg": 0 + }, { + "id": ["overlay_worn_xlhsurvivor_suit"], + "fg": 24761, + "bg": 0 + }, { + "id": ["xlkevlar"], + "fg": 24762, + "bg": 0 + }, { + "id": ["overlay_worn_xlkevlar"], + "fg": 24763, + "bg": 0 + }, + { + "id": ["eshaper_spellbook"], + "fg": 24764, + "bg": 0 + }, + { + "id": ["kevlar_armor_horse"], + "fg": 24765, + "bg": 0 + }, { + "id": ["acidchitin_armor_horse"], + "fg": 24766, + "bg": 0 + }, { + "id": ["chitin_armor_horse"], + "fg": 24767, + "bg": 0 + }, { + "id": ["chainmail_armor_horse"], + "fg": 24768, + "bg": 0 + }, { + "id": ["leather_armor_horse"], + "fg": 24769, + "bg": 0 + }, { + "id": ["leatherbone_armor_horse"], + "fg": 24770, + "bg": 0 + }, { + "id": ["rubber_armor_horse"], + "fg": 24771, + "bg": 0 + }, { + "id": ["superalloy_armor_horse"], + "fg": 24772, + "bg": 0 + },{ + "id": ["saiga410mag_10rd"], + "fg": 24773, + "bg": 0 + },{ + "id": ["saiga410mag_30rd"], + "fg": 24774, + "bg": 0 + }, + { + "id": ["m1911a1_38super"], + "fg": 24775, + "bg": 0 + }, + { + "id": ["overlay_wielded_m1911a1_38super"], + "fg": 24776, + "bg": 0 + },{ + "id": ["m1911mag_10rd_38super"], + "fg": 24777, + "bg": 0 + },{ + "id": ["p320mag_14rd_357sig"], + "fg": 24778, + "bg": 0 + },{ + "id": ["p320mag_17rd_9x19mm"], + "fg": 24779, + "bg": 0 + },{ + "id": ["magus_spellbook"], + "fg": 24780, + "bg": 0 + }, + { + "id": ["magus_spellbook_move"], + "fg": 24781, + "bg": 0 + }, { + "id": ["summon_undead_spellbook"], + "fg": 24782, + "bg": 0 + },{ + "id": ["summon_scroll_smudged"], + "fg": 24783, + "bg": 0 + }, + { "id": "atlatl", "fg": 1986, "bg": 0, @@ -126452,6 +128135,16 @@ "id": "overlay_worn_fedora", "fg": 33185, "rotates": false + }, + { + "id": "overlay_worn_foodperson_mask", + "fg": 33186, + "rotates": false + }, + { + "id": "overlay_worn_foodperson_mask_on", + "fg": 33187, + "rotates": false } ] }, @@ -126787,9 +128480,171 @@ "id": ["corpse_mon_ayenel"], "fg": 35810, "rotates": false - } + }, + { + "id": ["overlay_worn_magic_lamp"], + "fg": 35811, + "rotates": false + }, { + "id": ["overlay_worn_magic_light"], + "fg": 35812, + "rotates": false + }, { + "id": ["mon_slasher"], + "fg": 35813, + "rotates": false + }, { + "id": ["mon_waster"], + "fg": 35814, + "rotates": false + }, { + "id": ["mon_twitcher"], + "fg": 35815, + "rotates": false + }, { + "id": ["mon_bushelephant"], + "fg": 35816, + "rotates": false + }, { + "id": ["mon_bushelephant_fungal"], + "fg": 35817, + "rotates": false + }, { + "id": ["overlay_male_crouch", "overlay_female_crouch"], + "fg": 35818, + "rotates": false + }, { + "id": ["overlay_male_run", "overlay_female_run"], + "fg": 35819, + "rotates": false + }, { + "id": ["long_pole"], + "fg": 35820, + "rotates": false + }, { + "id": ["overlay_wielded_long_pole"], + "fg": 35821, + "rotates": false + }, + { + "id": ["t_wood_stairs_down"], + "fg": 35822, + "rotates": false + }, + { + "id": ["t_wood_stairs_up_half"], + "fg": 35823, + "rotates": false + }, + { + "id": ["t_wood_stairs_up_broken"], + "fg": 35824, + "rotates": false + }, + { + "id": ["t_wood_stairs_up"], + "fg": 35825, + "bg": 0, + "rotates": false + }, { + "id": ["2h_flail_steel"], + "fg": 35826, + "rotates": false + }, + { + "id": ["overlay_wielded_2h_flail_steel"], + "fg": 35827, + "bg": 0, + "rotates": false + }, { + "id": ["2h_flail_wood"], + "fg": 35828, + "rotates": false + }, + { + "id": ["overlay_wielded_2h_flail_wood"], + "fg": 35829, + "bg": 0, + "rotates": false + }, + { + "id": ["t_slope_up"], + "fg": 35837, + "multitile": true, + "additional_tiles": [ + { + "id": "center", + "fg": 35837, + "bg": 972 + }, + { + "id": "corner", + "fg": [35838, 35839, 35840, 35841], + "bg": 972 + }, + { + "id": "t_connection", + "fg": [35842, 35843, 35844, 35845], + "bg": 972 + }, + { + "id": "edge", + "fg": [35846, 35847], + "bg": 972 + }, + { + "id": "end_piece", + "fg": [35848, 35849, 35850, 35851], + "bg": 972 + }, + { + "id": "unconnected", + "fg": 35852, + "bg": 972 + } + ], + "rotates": false + }, + { + "id": ["t_slope_down"], + "fg": 35853, + "multitile": true, + "additional_tiles": [ + { + "id": "center", + "fg": 35853, + "bg": 972 + }, + { + "id": "corner", + "fg": [35854, 35855, 35856, 35857], + "bg": 972 + }, + { + "id": "t_connection", + "fg": [35858, 35859, 35860, 35861], + "bg": 972 + }, + { + "id": "edge", + "fg": [35858, 35863], + "bg": 972 + }, + { + "id": "end_piece", + "fg": [35864, 35865, 35866, 35867], + "bg": 972 + }, + { + "id": "unconnected", + "fg": 35868, + "bg": 972 + } + ], + "rotates": false + } ] - } + } ] } \ No newline at end of file diff --git a/lang/extract_json_strings.py b/lang/extract_json_strings.py index 4effbd1530cdc..b3649a8249335 100755 --- a/lang/extract_json_strings.py +++ b/lang/extract_json_strings.py @@ -120,6 +120,7 @@ def warning_supressed(filename): "BIONIC_ITEM", "BOOK", "COMESTIBLE", + "construction_category", "CONTAINER", "dream", "ENGINE", @@ -133,6 +134,7 @@ def warning_supressed(filename): "json_flag", "keybinding", "MAGAZINE", + "map_extra", "MOD_INFO", "MONSTER", "morale_type", @@ -527,6 +529,9 @@ def extract_dynamic_line(line, outfile): extract_dynamic_line_optional(line, "npc_female", outfile) extract_dynamic_line_optional(line, "yes", outfile) extract_dynamic_line_optional(line, "no", outfile) + extract_dynamic_line_optional(line, "has_no_available_mission", outfile) + extract_dynamic_line_optional(line, "has_many_assigned_missions", outfile) + extract_dynamic_line_optional(line, "has_no_assigned_mission", outfile) elif type(line) == str: writestr(outfile, line) @@ -936,6 +941,9 @@ def extract(item, infilename): if "description" in special_attack: writestr(outfile, special_attack["description"], **kwargs) wrote = True + if "footsteps" in item: + writestr(outfile, item["footsteps"], **kwargs) + wrote = True if not wrote: if not warning_supressed(infilename): print("WARNING: {}: nothing translatable found in item: {}".format(infilename, item)) diff --git a/lang/po/cataclysm-dda.pot b/lang/po/cataclysm-dda.pot index 27b5de527dba6..5323ffb0c9cd8 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.D\n" "Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2019-06-14 15:45+0800\n" +"POT-Creation-Date: 2019-06-21 16:15+0800\n" "PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n" "Last-Translator: FULL NAME \n" "Language-Team: LANGUAGE \n" @@ -20,7 +20,7 @@ msgstr[1] "" #. ~ Description for battery #: lang/json/AMMO_from_json.py msgid "" -"Some free-floating battery charge. This can be reloaded into rechargable " +"Some free-floating battery charge. This can be reloaded into rechargable " "battery cells, but can never be unloaded." msgstr "" @@ -1787,6 +1787,21 @@ msgid "" "manually." msgstr "" +#: lang/json/AMMO_from_json.py +msgid "10mm Auto FMJ" +msgstr "" + +#. ~ Description for 10mm Auto FMJ +#: lang/json/AMMO_from_json.py +msgid "" +"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." +msgstr "" + +#: lang/json/AMMO_from_json.py +msgid "reloaded 10mm Auto FMJ" +msgstr "" + #: lang/json/AMMO_from_json.py msgid "H&K 12mm" msgstr "" @@ -2209,6 +2224,18 @@ msgid "" "generating greater pressure." msgstr "" +#: lang/json/AMMO_from_json.py +msgid "reloaded .357 Magnum FMJ" +msgid_plural "reloaded .357 Magnum FMJ" +msgstr[0] "" +msgstr[1] "" + +#: lang/json/AMMO_from_json.py +msgid "reloaded .357 Magnum JHP" +msgid_plural "reloaded .357 Magnum JHP" +msgstr[0] "" +msgstr[1] "" + #: lang/json/AMMO_from_json.py msgid ".357 SIG FMJ" msgstr "" @@ -2313,7 +2340,7 @@ msgstr "" #: lang/json/AMMO_from_json.py msgid "" "This .38 Special cartridge is loaded with a 200gr cast lead hollowpoint and " -"23gr of blackpowder. While it's much slower than a regular .38, it has " +"23gr of blackpowder. While it's much slower than a regular .38, it has " "tremendous stopping power." msgstr "" @@ -2369,18 +2396,19 @@ msgid "reloaded .380 ACP +P" msgstr "" #: lang/json/AMMO_from_json.py -#: lang/json/ammunition_type_from_json.py -msgid "10mm Auto" -msgid_plural "10mm Auto" -msgstr[0] "" -msgstr[1] "" +msgid ".38 Super FMJ" +msgstr "" -#. ~ Description for 10mm Auto +#. ~ Description for .38 Super FMJ #: lang/json/AMMO_from_json.py msgid "" -"10mm Auto ammunition with 180gr FMJ bullets. The 10mm Auto round is one of " -"the most powerful pistol cartridges available, although its usefulness is " -"limited by high recoil." +".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." +msgstr "" + +#: lang/json/AMMO_from_json.py +msgid "reloaded .38 Super FMJ" msgstr "" #: lang/json/AMMO_from_json.py @@ -2410,12 +2438,6 @@ msgid "" "strengths while reducing recoil." msgstr "" -#: lang/json/AMMO_from_json.py -msgid "reloaded 10mm Auto" -msgid_plural "reloaded 10mm Auto" -msgstr[0] "" -msgstr[1] "" - #: lang/json/AMMO_from_json.py msgid "reloaded .40 S&W FMJ" msgstr "" @@ -2542,10 +2564,23 @@ msgstr "" #. ~ Description for 40mm slug #: lang/json/AMMO_from_json.py msgid "" -"A 40mm shell loaded with a massive bullet. Say goodbye to your shoulder, I " +"A 40mm shell loaded with a massive bullet. Say goodbye to your shoulder, I " "guess." msgstr "" +#: lang/json/AMMO_from_json.py +msgid ".410 000 shot" +msgstr "" + +#. ~ Description for .410 000 shot +#: lang/json/AMMO_from_json.py +msgid "A .410 shell with 5 000 pellets. Good for a hunting or combat load." +msgstr "" + +#: lang/json/AMMO_from_json.py +msgid "reloaded .410 000 shot" +msgstr "" + #: lang/json/AMMO_from_json.py msgid ".44 Magnum FMJ" msgstr "" @@ -2762,6 +2797,23 @@ msgid "" "been hand-loaded." msgstr "" +#: lang/json/AMMO_from_json.py +msgid ".45 Colt JHP" +msgstr "" + +#. ~ Description for .45 Colt JHP +#: lang/json/AMMO_from_json.py +msgid "" +".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." +msgstr "" + +#: lang/json/AMMO_from_json.py +msgid "reloaded .45 Colt JHP" +msgstr "" + #: lang/json/AMMO_from_json.py msgid "4.6x30mm" msgstr "" @@ -3290,6 +3342,14 @@ msgid "" "internal pressure offering superior damage, accuracy, and penetration." msgstr "" +#: lang/json/AMMO_from_json.py +msgid "9x19mm JHP blackpowder" +msgstr "" + +#: lang/json/AMMO_from_json.py +msgid "9x19mm FMJ blackpowder" +msgstr "" + #: lang/json/AMMO_from_json.py msgid "reloaded 9x19mm JHP" msgstr "" @@ -3480,6 +3540,10 @@ msgstr "" msgid "reloaded birdshot" msgstr "" +#: lang/json/AMMO_from_json.py +msgid "reloaded dragon's breath shell" +msgstr "" + #: lang/json/AMMO_from_json.py msgid "reloaded 00 shot" msgstr "" @@ -3539,6 +3603,19 @@ msgid "" "its applications in combat are very limited." msgstr "" +#: lang/json/AMMO_from_json.py +msgid "dragon's breath shell" +msgstr "" + +#. ~ Description for dragon's breath shell +#: lang/json/AMMO_from_json.py +msgid "" +"A shotgun shell filled with magnesium pellets or shards, used mostly as a " +"distress flare or pyrotechnics tool. When the round is fired, high " +"temperature sparks and flames shoot out of the barrel, igniting everything " +"in their path." +msgstr "" + #: lang/json/AMMO_from_json.py msgid "flechette shell" msgstr "" @@ -3777,6 +3854,17 @@ msgstr "" msgid "A heavy formed piece of steel. Useful for some crafting recipes." msgstr "" +#: lang/json/AMMO_from_json.py +msgid "door hinge" +msgstr "" + +#. ~ Description for door hinge +#: lang/json/AMMO_from_json.py +msgid "" +"A small metal hinge with two metal plates with screw holes. Useful for " +"making doors." +msgstr "" + #: lang/json/AMMO_from_json.py msgid "incendiary" msgid_plural "incendiaries" @@ -3875,6 +3963,13 @@ msgstr "" msgid "plutonium cell" msgstr "" +#. ~ Description for battery +#: lang/json/AMMO_from_json.py +msgid "" +"Some free-floating battery charge. This can be reloaded into rechargable " +"battery cells, but can never be unloaded." +msgstr "" + #: lang/json/AMMO_from_json.py msgid "chunk of rubber" msgid_plural "chunks of rubber" @@ -4925,6 +5020,13 @@ msgid_plural "reloaded .40 S&W JHP" msgstr[0] "" msgstr[1] "" +#: lang/json/AMMO_from_json.py lang/json/ammunition_type_from_json.py +#: lang/json/ammunition_type_from_json.py +msgid "10mm Auto" +msgid_plural "10mm Auto" +msgstr[0] "" +msgstr[1] "" + #. ~ Description for 10mm Auto #. ~ Description for reloaded 10mm Auto #: lang/json/AMMO_from_json.py @@ -4934,6 +5036,12 @@ msgid "" "limited by high recoil." msgstr "" +#: lang/json/AMMO_from_json.py +msgid "reloaded 10mm Auto" +msgid_plural "reloaded 10mm Auto" +msgstr[0] "" +msgstr[1] "" + #: lang/json/AMMO_from_json.py lang/json/ammunition_type_from_json.py msgid ".45 Long Colt" msgid_plural ".45 Long Colt" @@ -4973,7 +5081,7 @@ msgid_plural "reloaded .410 slug" msgstr[0] "" msgstr[1] "" -#: lang/json/AMMO_from_json.py +#: lang/json/AMMO_from_json.py lang/json/ammunition_type_from_json.py msgid ".410 shot" msgid_plural ".410 shot" msgstr[0] "" @@ -5240,6 +5348,20 @@ msgstr[1] "" msgid "Arm guards made of stacked paper sheets held together with duct tape." msgstr "" +#: lang/json/ARMOR_from_json.py +msgid "pair of scrap arm guards" +msgid_plural "pairs of scrap arm guards" +msgstr[0] "" +msgstr[1] "" + +#. ~ Description for pair of scrap arm guards +#: lang/json/ARMOR_from_json.py +msgid "" +"A pair of arm guards made from scraps of metal secured by simple strings; " +"the loose collection of plates provides decent but not the most convenient " +"protection." +msgstr "" + #: lang/json/ARMOR_from_json.py msgid "pair of neoprene arm sleeves" msgid_plural "pairs of neoprene arm sleeves" @@ -5605,6 +5727,19 @@ msgid "" "A plastic name tag marking the wearer as a real doctor of the medical kind." msgstr "" +#: lang/json/ARMOR_from_json.py +msgid "Foodkid badge" +msgid_plural "Foodkid badges" +msgstr[0] "" +msgstr[1] "" + +#. ~ Description for Foodkid badge +#: lang/json/ARMOR_from_json.py +msgid "" +"A star shaped badge, on it you can read \"Foodkid\" in bold letters. This " +"is Foodperson's trusty sidekick's badge." +msgstr "" + #: lang/json/ARMOR_from_json.py msgid "balaclava" msgid_plural "balaclavas" @@ -6171,6 +6306,17 @@ msgid "" "are light and easy to wear." msgstr "" +#: lang/json/ARMOR_from_json.py +msgid "Foodperson's cape" +msgid_plural "Foodperson's capes" +msgstr[0] "" +msgstr[1] "" + +#. ~ Description for Foodperson's cape +#: lang/json/ARMOR_from_json.py +msgid "A brightly-colored cape emblazoned with the \"Fp\" symbol." +msgstr "" + #: lang/json/ARMOR_from_json.py msgid "cassock" msgid_plural "cassocks" @@ -6276,6 +6422,17 @@ msgid "" "storage." msgstr "" +#: lang/json/ARMOR_from_json.py +msgid "hard chest guard" +msgid_plural "hard chest guards" +msgstr[0] "" +msgstr[1] "" + +#. ~ Description for hard chest guard +#: lang/json/ARMOR_from_json.py +msgid "A plastron of interlocking plastic plate protecting your torso." +msgstr "" + #: lang/json/ARMOR_from_json.py msgid "chestwrap" msgid_plural "chestwraps" @@ -6618,6 +6775,19 @@ msgid "" "went into decline, cuirasses remained in use among cavalry in Europe." msgstr "" +#: lang/json/ARMOR_from_json.py +msgid "scrap cuirass" +msgid_plural "scrap cuirasses" +msgstr[0] "" +msgstr[1] "" + +#. ~ Description for scrap cuirass +#: lang/json/ARMOR_from_json.py +msgid "" +"A cuirass made from scraps of metal secured by simple strings; the loose " +"collection of plates provides decent but not the most convenient protection." +msgstr "" + #: lang/json/ARMOR_from_json.py msgid "salvaged power armor" msgid_plural "salvaged power armors" @@ -7586,6 +7756,18 @@ msgstr[1] "" msgid "A tough pair of gloves, for tough everyday work." msgstr "" +#: lang/json/ARMOR_from_json.py +msgid "pair of cut resistant gloves" +msgid_plural "pairs of cut resistant gloves" +msgstr[0] "" +msgstr[1] "" + +#. ~ Description for pair of cut resistant gloves +#: lang/json/ARMOR_from_json.py +msgid "" +"A pair of cut resistant gloves, useful when rapidly breaking down carcasses." +msgstr "" + #: lang/json/ARMOR_from_json.py msgid "pair of hand wraps" msgid_plural "pairs of hand wraps" @@ -8259,6 +8441,19 @@ msgid "" "respirator and eye protection. For dangerous scavenging ventures." msgstr "" +#: lang/json/ARMOR_from_json.py +msgid "scrap helmet" +msgid_plural "scrap helmets" +msgstr[0] "" +msgstr[1] "" + +#. ~ Description for scrap helmet +#: lang/json/ARMOR_from_json.py +msgid "" +"A helmet made from scraps of metal secured by simple strings; the loose " +"collection of plates provides decent but not the most convenient protection." +msgstr "" + #: lang/json/ARMOR_from_json.py msgid "skid lid" msgid_plural "skid lids" @@ -8549,6 +8744,12 @@ msgstr[1] "" msgid "A jacket made from denim. Provides decent protection from cuts." msgstr "" +#: lang/json/ARMOR_from_json.py +msgid "" +"A jacket made from denim. Provides decent protection from cuts. This one " +"is haphazardly covered with patches featuring metal band logos." +msgstr "" + #: lang/json/ARMOR_from_json.py msgid "leather jacket" msgid_plural "leather jackets" @@ -8842,6 +9043,17 @@ msgid "" "Provides decent storage and is not very encumbering." msgstr "" +#: lang/json/ARMOR_from_json.py +msgid "Hub 01 jumpsuit" +msgid_plural "Hub 01 jumpsuits" +msgstr[0] "" +msgstr[1] "" + +#. ~ Description for Hub 01 jumpsuit +#: lang/json/ARMOR_from_json.py +msgid "A brown jumpsuit worn by the staff of Hub 01." +msgstr "" + #: lang/json/ARMOR_from_json.py msgid "XL jumpsuit" msgid_plural "XL jumpsuits" @@ -8971,8 +9183,8 @@ msgstr[1] "" #. ~ Description for yukata #: lang/json/ARMOR_from_json.py msgid "" -"An easy to wear, breezy robe secured with a sash. Essentially Japanese " -"pajamas. Great for summer nights." +"An easy to wear, breezy robe secured with a sash. Essentially Japanese " +"pajamas. Great for summer nights." msgstr "" #: lang/json/ARMOR_from_json.py @@ -8984,7 +9196,7 @@ msgstr[1] "" #. ~ Description for haori #: lang/json/ARMOR_from_json.py msgid "" -"A loose coat with wide sleeves that is worn unfastened over a kimono. It is " +"A loose coat with wide sleeves that is worn unfastened over a kimono. It is " "jet black with sparse, tasteful golden embroidery." msgstr "" @@ -9219,6 +9431,20 @@ msgstr[1] "" msgid "Leg guards made of stacked paper sheets held together with duct tape." msgstr "" +#: lang/json/ARMOR_from_json.py +msgid "pair of scrap leg guards" +msgid_plural "pairs of scrap leg guards" +msgstr[0] "" +msgstr[1] "" + +#. ~ Description for pair of scrap leg guards +#: lang/json/ARMOR_from_json.py +msgid "" +"A pair of leg guards made from scraps of metal secured by simple strings; " +"the loose collection of plates provides decent but not the most convenient " +"protection." +msgstr "" + #: lang/json/ARMOR_from_json.py msgid "pair of drop leg pouches" msgid_plural "pairs of drop leg pouches" @@ -11378,6 +11604,7 @@ msgstr[0] "" msgstr[1] "" #. ~ Description for t-shirt +#. ~ Description for tour t-shirt #: lang/json/ARMOR_from_json.py msgid "A short-sleeved cotton shirt." msgstr "" @@ -11388,6 +11615,37 @@ msgid "" "printed on the front." msgstr "" +#: lang/json/ARMOR_from_json.py +msgid "tour t-shirt" +msgid_plural "tour t-shirts" +msgstr[0] "" +msgstr[1] "" + +#: lang/json/ARMOR_from_json.py +msgid "" +"A short-sleeved cotton shirt with a death metal band's spidery, " +"indecipherable logo printed on the front." +msgstr "" + +#: lang/json/ARMOR_from_json.py +msgid "" +"A short-sleeved cotton shirt with a muscle-bound, long-haired man printed on " +"the front. He is riding a red dragon and wielding a flaming sword with " +"malicious glee." +msgstr "" + +#: lang/json/ARMOR_from_json.py +msgid "" +"A short-sleeved cotton shirt with a gore-spattered, guitar-playing zombie " +"printed on the front. It's rather tasteless in light of current events." +msgstr "" + +#: lang/json/ARMOR_from_json.py +msgid "" +"A short-sleeved cotton shirt with a pattern of complex geometric shapes and " +"transcendental imagery printed on the front." +msgstr "" + #: lang/json/ARMOR_from_json.py msgid "tunic" msgid_plural "tunics" @@ -12449,6 +12707,17 @@ msgid "" "A pair of rubber boots, often used while cleaning with caustic materials." msgstr "" +#: lang/json/ARMOR_from_json.py +msgid "pair of scrap boots" +msgid_plural "pairs of scrap boots" +msgstr[0] "" +msgstr[1] "" + +#. ~ Description for pair of scrap boots +#: lang/json/ARMOR_from_json.py +msgid "Boots made of random scraps." +msgstr "" + #: lang/json/ARMOR_from_json.py msgid "pair of steeltoed boots" msgid_plural "pairs of steeltoed boots" @@ -12971,7 +13240,7 @@ msgstr[1] "" #: lang/json/ARMOR_from_json.py msgid "" "An elastic band with numerous provisions for concealing a very small pistol " -"close to the body. It is awkward to use without practice. Activate to " +"close to the body. It is awkward to use without practice. Activate to " "holster/draw a gun." msgstr "" @@ -13004,6 +13273,18 @@ msgid "" "straps that hold it flat against your leg, Activate to holster/draw a gun." msgstr "" +#: lang/json/ARMOR_from_json.py +msgid "saddle bags" +msgid_plural "saddle bagss" +msgstr[0] "" +msgstr[1] "" + +#. ~ Description for saddle bags +#: lang/json/ARMOR_from_json.py +msgid "" +"A pair of covered pouches laid across the back of a horse behind the saddle." +msgstr "" + #: lang/json/ARMOR_from_json.py msgid "helmet netting" msgid_plural "helmet nettings" @@ -14086,7 +14367,7 @@ msgstr[1] "" #: lang/json/BIONIC_ITEM_from_json.py msgid "" "Concealed in your left arm is a surgically integrated one-shot sawn-off " -"shotgun barrel, that pops-up upon activation. Perfect in a pinch." +"shotgun barrel, that pops-up upon activation. Perfect in a pinch." msgstr "" #: lang/json/BIONIC_ITEM_from_json.py @@ -16365,7 +16646,8 @@ msgstr[1] "" #: lang/json/BOOK_from_json.py lang/json/GENERIC_from_json.py #: lang/json/GENERIC_from_json.py #: lang/json/GENERIC_from_json.py lang/json/TOOL_from_json.py -#: lang/json/TOOL_from_json.py lang/json/skill_from_json.py +#: lang/json/TOOL_from_json.py lang/json/furniture_from_json.py +#: lang/json/skill_from_json.py msgid "seeing this is a bug" msgid_plural "seeing this is a bugs" msgstr[0] "" @@ -16381,7 +16663,7 @@ msgstr[1] "" #: lang/json/BOOK_from_json.py msgid "" "Bearing the logo of Uncanny, those are assembly plans, design specs, and " -"technical drawings for the nurse bot. Most of this is useless to you, but " +"technical drawings for the nurse bot. Most of this is useless to you, but " "you could use the assembly plans to re-assemble the robot from salvaged " "parts." msgstr "" @@ -16395,7 +16677,7 @@ msgstr[1] "" #. ~ Description for police bot schematics #: lang/json/BOOK_from_json.py msgid "" -"Assembly plans, design specs, and technical drawings for the police bot. " +"Assembly plans, design specs, and technical drawings for the police bot. " "Most of this is useless to you, but you could use the assembly plans to re-" "assemble the robot from salvaged parts." msgstr "" @@ -16409,9 +16691,9 @@ msgstr[1] "" #. ~ Description for eyebot schematics #: lang/json/BOOK_from_json.py msgid "" -"Assembly plans, design specs, and technical drawings for the eyebot. Most of " -"this is useless to you, but you could use the assembly plans to re-assemble " -"the robot from salvaged parts." +"Assembly plans, design specs, and technical drawings for the eyebot. Most " +"of this is useless to you, but you could use the assembly plans to re-" +"assemble the robot from salvaged parts." msgstr "" #: lang/json/BOOK_from_json.py @@ -16423,7 +16705,7 @@ msgstr[1] "" #. ~ Description for security bot schematics #: lang/json/BOOK_from_json.py msgid "" -"Assembly plans, design specs, and technical drawings for the security bot. " +"Assembly plans, design specs, and technical drawings for the security bot. " "Most of this is useless to you, but you could use the assembly plans to re-" "assemble the robot from salvaged parts." msgstr "" @@ -16437,7 +16719,7 @@ msgstr[1] "" #. ~ Description for skitterbot schematics #: lang/json/BOOK_from_json.py msgid "" -"Assembly plans, design specs, and technical drawings for the skitterbot. " +"Assembly plans, design specs, and technical drawings for the skitterbot. " "Most of this is useless to you, but you could use the assembly plans to re-" "assemble the robot from salvaged parts." msgstr "" @@ -16452,7 +16734,7 @@ msgstr[1] "" #: lang/json/BOOK_from_json.py msgid "" "Bearing the logo of Northrop, those are assembly plans, design specs, and " -"technical drawings for the chicken walker. Most of this is useless to you, " +"technical drawings for the chicken walker. Most of this is useless to you, " "but you could use the assembly plans to re-assemble the robot from salvaged " "parts." msgstr "" @@ -16466,7 +16748,7 @@ msgstr[1] "" #. ~ Description for cleaner bot schematics #: lang/json/BOOK_from_json.py msgid "" -"Assembly plans, design specs, and technical drawings for the cleaner bot. " +"Assembly plans, design specs, and technical drawings for the cleaner bot. " "Most of this is useless to you, but you could use the assembly plans to re-" "assemble the robot from salvaged parts." msgstr "" @@ -16480,8 +16762,8 @@ msgstr[1] "" #. ~ Description for miner bot schematics #: lang/json/BOOK_from_json.py msgid "" -"Assembly plans, design specs, and technical drawings for the miner bot. Most " -"of this is useless to you, but you could use the assembly plans to re-" +"Assembly plans, design specs, and technical drawings for the miner bot. " +"Most of this is useless to you, but you could use the assembly plans to re-" "assemble the robot from salvaged parts." msgstr "" @@ -16495,8 +16777,8 @@ msgstr[1] "" #: lang/json/BOOK_from_json.py msgid "" "Assembly plans, design specs, and technical drawings for the riot control " -"bot. Most of this is useless to you, but you could use the assembly plans to " -"re-assemble the robot from salvaged parts." +"bot. Most of this is useless to you, but you could use the assembly plans " +"to re-assemble the robot from salvaged parts." msgstr "" #: lang/json/BOOK_from_json.py @@ -16509,8 +16791,8 @@ msgstr[1] "" #: lang/json/BOOK_from_json.py msgid "" "Assembly plans, design specs, and technical drawings for the lab defense " -"bot. Most of this is useless to you, but you could use the assembly plans to " -"re-assemble the robot from salvaged parts." +"bot. Most of this is useless to you, but you could use the assembly plans " +"to re-assemble the robot from salvaged parts." msgstr "" #: lang/json/BOOK_from_json.py @@ -16523,7 +16805,7 @@ msgstr[1] "" #: lang/json/BOOK_from_json.py msgid "" "Bearing the logo of Northrop, those are assembly plans, design specs, and " -"technical drawings for the tank drone. Most of this is useless to you, but " +"technical drawings for the tank drone. Most of this is useless to you, but " "you could use the assembly plans to re-assemble the robot from salvaged " "parts." msgstr "" @@ -16538,7 +16820,7 @@ msgstr[1] "" #: lang/json/BOOK_from_json.py msgid "" "Bearing the logo of Honda, those are assembly plans, design specs, and " -"technical drawings for the tripod. Most of this is useless to you, but you " +"technical drawings for the tripod. Most of this is useless to you, but you " "could use the assembly plans to re-assemble the robot from salvaged parts." msgstr "" @@ -16552,8 +16834,9 @@ msgstr[1] "" #: lang/json/BOOK_from_json.py msgid "" "Bearing the logo of Northrop, those are assembly plans, design specs, and " -"technical drawings for the dispatch. Most of this is useless to you, but you " -"could use the assembly plans to re-assemble the robot from salvaged parts." +"technical drawings for the dispatch. Most of this is useless to you, but " +"you could use the assembly plans to re-assemble the robot from salvaged " +"parts." msgstr "" #: lang/json/BOOK_from_json.py @@ -16566,7 +16849,7 @@ msgstr[1] "" #: lang/json/BOOK_from_json.py msgid "" "Bearing the logo of Northrop, those are assembly plans, design specs, and " -"technical drawings for the military dispatch. Most of this is useless to " +"technical drawings for the military dispatch. Most of this is useless to " "you, but you could use the assembly plans to re-assemble the robot from " "salvaged parts." msgstr "" @@ -16581,8 +16864,8 @@ msgstr[1] "" #: lang/json/BOOK_from_json.py msgid "" "Assembly plans, design specs, and technical drawings for the anti-materiel " -"turret. Most of this is useless to you, but you could use the assembly plans " -"to re-assemble the robot from salvaged parts." +"turret. Most of this is useless to you, but you could use the assembly " +"plans to re-assemble the robot from salvaged parts." msgstr "" #: lang/json/BOOK_from_json.py @@ -16595,7 +16878,7 @@ msgstr[1] "" #: lang/json/BOOK_from_json.py msgid "" "Assembly plans, design specs, and technical drawings for the milspec " -"searchlight. Most of this is useless to you, but you could use the assembly " +"searchlight. Most of this is useless to you, but you could use the assembly " "plans to re-assemble the robot from salvaged parts." msgstr "" @@ -20976,6 +21259,60 @@ msgid "" "looks *disgusting*." msgstr "" +#: lang/json/COMESTIBLE_from_json.py +msgid "raw milk" +msgid_plural "raw milk" +msgstr[0] "" +msgstr[1] "" + +#. ~ Description for raw milk +#: lang/json/COMESTIBLE_from_json.py +msgid "" +"This is raw, unhomogenized and unpasteurized milk from a cow. It couldn't " +"be any fresher unless you drank it straight from the cow, which might upset " +"it. Depending on your dietary sensibilities, you might want to pasteurize " +"or even boil this before drinking." +msgstr "" + +#: lang/json/COMESTIBLE_from_json.py +msgid "shelf stable milk" +msgid_plural "shelf stable milk" +msgstr[0] "" +msgstr[1] "" + +#. ~ Description for shelf stable milk +#: lang/json/COMESTIBLE_from_json.py +msgid "" +"This is milk that has been pasteurized at much higher temperatures than " +"normal. It tastes slightly different, but, unopened, will last far longer " +"than regular milk." +msgstr "" + +#: lang/json/COMESTIBLE_from_json.py +msgid "evaporated milk" +msgid_plural "evaporated milk" +msgstr[0] "" +msgstr[1] "" + +#. ~ Description for evaporated milk +#: lang/json/COMESTIBLE_from_json.py +#, no-python-format +msgid "Milk that's had about 60% of its water removed prior to canning." +msgstr "" + +#: lang/json/COMESTIBLE_from_json.py +msgid "buttermilk" +msgid_plural "buttermilk" +msgstr[0] "" +msgstr[1] "" + +#. ~ Description for buttermilk +#: lang/json/COMESTIBLE_from_json.py +msgid "" +"This is cultured milk defatted either due to churning or curdling. Spoils " +"quickly." +msgstr "" + #: lang/json/COMESTIBLE_from_json.py msgid "yogurt" msgstr "" @@ -20985,6 +21322,31 @@ msgstr "" msgid "Delicious fermented dairy. It tastes of vanilla." msgstr "" +#: lang/json/COMESTIBLE_from_json.py +msgid "butter" +msgid_plural "butter" +msgstr[0] "" +msgstr[1] "" + +#. ~ Description for butter +#: lang/json/COMESTIBLE_from_json.py +msgid "" +"A yellow stick of milkfat and milk solids, usually made from cow's milk." +msgstr "" + +#: lang/json/COMESTIBLE_from_json.py +msgid "ghee" +msgid_plural "ghee" +msgstr[0] "" +msgstr[1] "" + +#. ~ Description for ghee +#: lang/json/COMESTIBLE_from_json.py +msgid "" +"Clarified butter, free from milk solids and water. Will last a very long " +"time." +msgstr "" + #: lang/json/COMESTIBLE_from_json.py msgid "pudding" msgstr "" @@ -21049,6 +21411,19 @@ msgstr[1] "" msgid "Dehydrated milk powder. Mix with water to make drinkable milk." msgstr "" +#: lang/json/COMESTIBLE_from_json.py +msgid "condensed milk" +msgid_plural "condensed milk" +msgstr[0] "" +msgstr[1] "" + +#. ~ Description for condensed milk +#: lang/json/COMESTIBLE_from_json.py +msgid "" +"Cow's milk that has been partly dehydrated to vastly increase its shelf " +"life, and also sweetened." +msgstr "" + #: lang/json/COMESTIBLE_from_json.py msgid "apple cider" msgid_plural "apple cider" @@ -21201,12 +21576,6 @@ msgid "" "with sugar and caffeine." msgstr "" -#: lang/json/COMESTIBLE_from_json.py -msgid "condensed milk" -msgid_plural "condensed milk" -msgstr[0] "" -msgstr[1] "" - #. ~ Description for condensed milk #: lang/json/COMESTIBLE_from_json.py msgid "" @@ -23093,25 +23462,14 @@ msgid "Salty dried pork. Tastes good, but it will make you thirsty." msgstr "" #: lang/json/COMESTIBLE_from_json.py -msgid "uncooked burrito" +msgid "microwave burrito" msgstr "" -#. ~ Description for uncooked burrito +#. ~ Description for microwave burrito #: lang/json/COMESTIBLE_from_json.py msgid "" "A small, microwaveable steak & cheese burrito, like those found at gas " -"stations. Not as appetizing or nutritious as it would be if heated up." -msgstr "" - -#: lang/json/COMESTIBLE_from_json.py -msgid "cooked burrito" -msgstr "" - -#. ~ Description for cooked burrito -#: lang/json/COMESTIBLE_from_json.py -msgid "" -"A small, microwaveable steak & cheese burrito, like those found at gas " -"stations. It's tastier and more filling, but will also spoil quickly." +"stations." msgstr "" #: lang/json/COMESTIBLE_from_json.py @@ -23958,6 +24316,18 @@ msgid "" "dough." msgstr "" +#: lang/json/COMESTIBLE_from_json.py +msgid "homemade burrito" +msgstr "" + +#. ~ Description for homemade burrito +#: lang/json/COMESTIBLE_from_json.py +msgid "" +"A traditional Mexican dish of meat and vegetable stuffing put on a corn " +"tortilla and rolled into a tube shape, like those you find in gas stations " +"but homemade and delicious!" +msgstr "" + #: lang/json/COMESTIBLE_from_json.py msgid "dehydrated human flesh" msgid_plural "dehydrated human flesh" @@ -26017,7 +26387,7 @@ msgstr[1] "" #. ~ Description for handful of junipers #: lang/json/COMESTIBLE_from_json.py msgid "" -"Junipers, for making gin and earthy flavors. Spicy, tastes similar to " +"Junipers, for making gin and earthy flavors. Spicy, tastes similar to " "rosemary." msgstr "" @@ -26171,13 +26541,13 @@ msgstr[1] "" msgid "A handful of roasted nuts from a chestnut tree." msgstr "" -#: lang/json/COMESTIBLE_from_json.py lang/json/GENERIC_from_json.py -msgid "handful of hazelnuts" +#: lang/json/COMESTIBLE_from_json.py +msgid "handful of shelled hazelnuts" msgid_plural "handfuls of shelled hazelnuts" msgstr[0] "" msgstr[1] "" -#. ~ Description for handful of hazelnuts +#. ~ Description for handful of shelled hazelnuts #: lang/json/COMESTIBLE_from_json.py msgid "" "A handful of raw hard nuts from a hazelnut tree, their shells have been " @@ -26338,7 +26708,7 @@ msgstr "" #. ~ Description for stewed tripe #: lang/json/COMESTIBLE_from_json.py msgid "" -"Stomach lining, cut up and stewed for an hour in broth. Better than it " +"Stomach lining, cut up and stewed for an hour in broth. Better than it " "sounds." msgstr "" @@ -26643,7 +27013,7 @@ msgstr[1] "" #. ~ Description for dried lentils #: lang/json/COMESTIBLE_from_json.py msgid "" -"A humble but nutrient-rich legume. Should be cooked prior to consumption." +"A humble but nutrient-rich legume. Should be cooked prior to consumption." msgstr "" #: lang/json/COMESTIBLE_from_json.py @@ -26654,7 +27024,7 @@ msgstr[1] "" #. ~ Description for cooked lentils #: lang/json/COMESTIBLE_from_json.py -msgid "Some delicious cooked lentils. Humble but nutrient-rich." +msgid "Some delicious cooked lentils. Humble but nutrient-rich." msgstr "" #: lang/json/COMESTIBLE_from_json.py @@ -30713,6 +31083,32 @@ msgid "" "easily sealed." msgstr "" +#: lang/json/CONTAINER_from_json.py +msgid "paper carton" +msgid_plural "paper cartons" +msgstr[0] "" +msgstr[1] "" + +#. ~ Description for paper carton +#: lang/json/CONTAINER_from_json.py +msgid "" +"A half gallon carton constructed of a paper, aluminum and plastic laminate. " +"It has a threaded cap for easy resealing." +msgstr "" + +#: lang/json/CONTAINER_from_json.py +msgid "opened paper carton" +msgid_plural "opened paper cartons" +msgstr[0] "" +msgstr[1] "" + +#. ~ Description for opened paper carton +#: lang/json/CONTAINER_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/CONTAINER_from_json.py msgid "vacuum-packed bag" msgid_plural "vacuum-packed bags" @@ -30863,7 +31259,7 @@ msgstr[1] "" #. ~ Description for beaker #: lang/json/CONTAINER_from_json.py -msgid "A 250ml laboratory beaker. Basically a cup with delusions of grandeur." +msgid "A 250ml laboratory beaker. Basically a cup with delusions of grandeur." msgstr "" #: lang/json/CONTAINER_from_json.py @@ -30876,7 +31272,7 @@ msgstr[1] "" #: lang/json/CONTAINER_from_json.py msgid "" "A tall, narrow glass cylinder with precise markings for measuring fluid " -"quantities. An important science tool, it is also useful for anal retentive " +"quantities. An important science tool, it is also useful for anal retentive " "chefs." msgstr "" @@ -30890,8 +31286,8 @@ msgstr[1] "" #: lang/json/CONTAINER_from_json.py msgid "" "These plastic tubes, with little built in snap-caps, are a great way to " -"store a tiny amount of liquid. Great for jello shooters if 1mL is enough for " -"a shot for you. Cool people call these \"eppies\"." +"store a tiny amount of liquid. Great for jello shooters if 1mL is enough " +"for a shot for you. Cool people call these \"eppies\"." msgstr "" #: lang/json/CONTAINER_from_json.py @@ -31171,8 +31567,8 @@ msgstr[1] "" #. ~ Description for condom #: lang/json/CONTAINER_from_json.py msgid "" -"A gentleman's balloon. A single use life preventer. A thumbless latex " -"mitten. This could be used as a makeshift water container, but otherwise " +"A gentleman's balloon. A single use life preventer. A thumbless latex " +"mitten. This could be used as a makeshift water container, but otherwise " "it's anyone's guess what it's for." msgstr "" @@ -31712,6 +32108,12 @@ msgstr[1] "" msgid "A handful of hard nuts from a peanut bush, still in their shell." msgstr "" +#: lang/json/GENERIC_from_json.py +msgid "handful of hazelnuts" +msgid_plural "handfuls of hazelnuts" +msgstr[0] "" +msgstr[1] "" + #. ~ Description for handful of hazelnuts #: lang/json/GENERIC_from_json.py msgid "A handful of hard nuts from a hazelnut tree, still in their shell." @@ -31774,7 +32176,7 @@ msgstr[1] "" #. ~ Description for sandbag #: lang/json/GENERIC_from_json.py msgid "" -"This is a canvas sack filled with sand. It can be used to construct simple " +"This is a canvas sack filled with sand. It can be used to construct simple " "barricades." msgstr "" @@ -31787,7 +32189,7 @@ msgstr[1] "" #. ~ Description for earthbag #: lang/json/GENERIC_from_json.py msgid "" -"This is a canvas sack filled with soil. It can be used to construct simple " +"This is a canvas sack filled with soil. It can be used to construct simple " "barricades." msgstr "" @@ -31909,6 +32311,19 @@ msgid "" "kept together, pretty useless now though." msgstr "" +#: lang/json/GENERIC_from_json.py +msgid "foodplace loyalty card" +msgid_plural "foodplace loyalty cards" +msgstr[0] "" +msgstr[1] "" + +#. ~ Description for foodplace loyalty card +#: lang/json/GENERIC_from_json.py +msgid "" +"A bright pink loyalty card, all the points are stamped. This would " +"definitely prove your fidelity to Foodplace, if it still meant anything..." +msgstr "" + #: lang/json/GENERIC_from_json.py msgid "withered plant" msgid_plural "withered plants" @@ -33013,6 +33428,20 @@ msgid "" "A large rag, drenched in blood. It could be cleaned with boiling water." msgstr "" +#: lang/json/GENERIC_from_json.py +msgid "pipe cleaner" +msgid_plural "pipe cleaners" +msgstr[0] "" +msgstr[1] "" + +#. ~ Description for pipe cleaner +#: lang/json/GENERIC_from_json.py +msgid "" +"This is a tool designed to clean interior surface of pipes, bottles, and " +"similar objects. This one is thin enough to be used for cleaning firearm " +"barrels from dirt and fouling." +msgstr "" + #: lang/json/GENERIC_from_json.py lang/json/vehicle_part_from_json.py msgid "clock" msgid_plural "clocks" @@ -33199,26 +33628,6 @@ msgstr[1] "" msgid "A small chunk of copper, usable for crafting or repairs." msgstr "" -#: lang/json/GENERIC_from_json.py -msgid "glass shard" -msgid_plural "glass shards" -msgstr[0] "" -msgstr[1] "" - -#. ~ Use action done_message for glass shard. -#: lang/json/GENERIC_from_json.py -msgid "" -"You carefuly place the shards on the ground, ready to be cracked by " -"something passing by." -msgstr "" - -#. ~ Description for glass shard -#: lang/json/GENERIC_from_json.py -msgid "" -"A broken shard of glass covered in sharp edges. You could use it as a " -"weapon, but you might want to wear gloves." -msgstr "" - #: lang/json/GENERIC_from_json.py msgid "hand mirror" msgid_plural "hand mirrors" @@ -34201,6 +34610,19 @@ msgid "" "complete with soldering capability." msgstr "" +#: lang/json/GENERIC_from_json.py +msgid "amplifier head" +msgid_plural "amplifier heads" +msgstr[0] "" +msgstr[1] "" + +#. ~ Description for amplifier head +#: lang/json/GENERIC_from_json.py +msgid "" +"An amplifier head. Typically paired with a speaker cabinet for amplifying " +"musical instruments. Basically only good for spare parts now." +msgstr "" + #: lang/json/GENERIC_from_json.py msgid "canister grenade" msgid_plural "canister grenades" @@ -34295,7 +34717,7 @@ msgstr[1] "" #. ~ Description for war scythe #: lang/json/GENERIC_from_json.py msgid "" -"A pole weapon with a curving single-edged blade. Its blade bears some " +"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." msgstr "" @@ -34846,7 +35268,7 @@ msgstr "" #: lang/json/GENERIC_from_json.py msgid "" "This is a dull, slightly floppy replica of a Japanese polearm with a curved " -"blade. With a little difficulty, you could use it administer a solid slap " +"blade. With a little difficulty, you could use it administer a solid slap " "from a distance." msgstr "" @@ -35673,6 +36095,47 @@ msgid "" "well-balanced" msgstr "" +#: lang/json/GENERIC_from_json.py +msgid "war flail" +msgid_plural "war flails" +msgstr[0] "" +msgstr[1] "" + +#. ~ Description for war flail +#: lang/json/GENERIC_from_json.py +msgid "" +"This is a stout pole with a large steel flanged mace head on a short chain " +"attached to it, based on the peasant flail agricultural tool except now with " +"a metal head and made to thresh people in metal armor rather than grain." +msgstr "" + +#: lang/json/GENERIC_from_json.py +msgid "peasant flail" +msgid_plural "peasant flails" +msgstr[0] "" +msgstr[1] "" + +#. ~ Description for peasant flail +#: lang/json/GENERIC_from_json.py +msgid "" +"This is a stout pole with a wooden club on a leather cord attached to it, " +"this is a tool used to thresh wheat and occasionally people when the " +"peasants got angry at their feudal lords." +msgstr "" + +#: lang/json/GENERIC_from_json.py +msgid "long pole" +msgid_plural "long poles" +msgstr[0] "" +msgstr[1] "" + +#. ~ Description for 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 "" + #: lang/json/GENERIC_from_json.py msgid "flyer" msgid_plural "flyers" @@ -37299,6 +37762,19 @@ msgstr[1] "" msgid "A complete guide to Sōjutsu." msgstr "" +#: lang/json/GENERIC_from_json.py +msgid "Beautiful Springtime" +msgid_plural "Beautiful Springtime" +msgstr[0] "" +msgstr[1] "" + +#. ~ Description for Beautiful Springtime +#: lang/json/GENERIC_from_json.py +msgid "" +"A complete guide to Wing Chun Kung-fu. Includes a section on butterfly " +"swords and the use of long poles at the end." +msgstr "" + #: lang/json/GENERIC_from_json.py msgid "Martial art manual" msgid_plural "Martial art manuals" @@ -37924,6 +38400,17 @@ msgstr[1] "" msgid "An empty casing from a .38 Special round." msgstr "" +#: lang/json/GENERIC_from_json.py +msgid ".38 Super casing" +msgid_plural ".38 Super casings" +msgstr[0] "" +msgstr[1] "" + +#. ~ Description for .38 Super casing +#: lang/json/GENERIC_from_json.py +msgid "An empty casing from a .38 Super round." +msgstr "" + #: lang/json/GENERIC_from_json.py msgid ".40 S&W casing" msgid_plural ".40 S&W casings" @@ -37935,6 +38422,17 @@ msgstr[1] "" msgid "An empty casing from a .40 S&W round." msgstr "" +#: lang/json/GENERIC_from_json.py +msgid "10mm Auto casing" +msgid_plural "10mm Auto casings" +msgstr[0] "" +msgstr[1] "" + +#. ~ Description for 10mm Auto casing +#: lang/json/GENERIC_from_json.py +msgid "An empty casing from a 10mm Auto round." +msgstr "" + #: lang/json/GENERIC_from_json.py msgid "40mm canister" msgid_plural "40mm canisters" @@ -37980,6 +38478,17 @@ msgstr[1] "" msgid "An empty casing from a .45 ACP round." msgstr "" +#: lang/json/GENERIC_from_json.py +msgid ".45 Colt casing" +msgid_plural ".45 Colt casings" +msgstr[0] "" +msgstr[1] "" + +#. ~ Description for .45 Colt casing +#: lang/json/GENERIC_from_json.py +msgid "An empty casing from a .45 Colt round." +msgstr "" + #: lang/json/GENERIC_from_json.py msgid ".45-70 casing" msgid_plural ".45-70 casings" @@ -38184,6 +38693,17 @@ msgstr[1] "" msgid "An empty hull from a shotgun shell." msgstr "" +#: lang/json/GENERIC_from_json.py +msgid ".410 hull" +msgid_plural ".410 hulls" +msgstr[0] "" +msgstr[1] "" + +#. ~ Description for .410 hull +#: lang/json/GENERIC_from_json.py +msgid "An empty hull from a .410 shotgun shell." +msgstr "" + #: lang/json/GENERIC_from_json.py msgid "Merch" msgid_plural "Merchs" @@ -39172,7 +39692,7 @@ msgstr[1] "" #: lang/json/GENERIC_from_json.py msgid "" "A sturdy 30-foot long vine. Could easily be used as a rope, but can't be " -"disassembled. Strong enough to suspend a large corpse for butchering." +"disassembled. Strong enough to suspend a large corpse for butchering." msgstr "" #: lang/json/GENERIC_from_json.py @@ -42193,6 +42713,73 @@ msgid "" "effects." msgstr "" +#: lang/json/GENERIC_from_json.py +msgid "The Tome of The Battle Mage" +msgid_plural "The Tome of The Battle Mages" +msgstr[0] "" +msgstr[1] "" + +#. ~ Description for The Tome of The Battle Mage +#: lang/json/GENERIC_from_json.py +msgid "" +"Your standard wizardy looking spellbook, filled with Magus combat spells. " +"You sure lucked out!" +msgstr "" + +#: lang/json/GENERIC_from_json.py +msgid "The Tome of the Hollow Earth" +msgid_plural "The Tome of the Hollow Earths" +msgstr[0] "" +msgstr[1] "" + +#. ~ Description for The Tome of the Hollow Earth +#: lang/json/GENERIC_from_json.py +msgid "" +"This large dusty spellbook seems perpetually, well, dusty. It contains the " +"power of the earth." +msgstr "" + +#: lang/json/GENERIC_from_json.py +msgid "The Tome of Magical Movement" +msgid_plural "The Tome of Magical Movements" +msgstr[0] "" +msgstr[1] "" + +#. ~ Description for The Tome of Magical Movement +#: lang/json/GENERIC_from_json.py +#, no-python-format +msgid "" +"This small lightweight book seems to almost not entirely exist, let's say it " +"97% does. It contains Magus spells focused on movement." +msgstr "" + +#: lang/json/GENERIC_from_json.py +msgid "Smudged Scroll" +msgid_plural "Smudged Scrolls" +msgstr[0] "" +msgstr[1] "" + +#. ~ Description for Smudged Scroll +#: lang/json/GENERIC_from_json.py +msgid "" +"This looks like someone was designing a new spell, but spilled a mug of " +"coffee on it and crumpled it up in anger. You can tell that it will " +"definitely cast something, but you can't be sure that it will work very well." +msgstr "" + +#: lang/json/GENERIC_from_json.py +msgid "Necromantic Minions for Dummies" +msgid_plural "Necromantic Minions for Dummiess" +msgstr[0] "" +msgstr[1] "" + +#. ~ Description for Necromantic Minions for Dummies +#: lang/json/GENERIC_from_json.py +msgid "" +"This book details various ways of summoning an undead minion to fight for " +"you. They all appear to disappear after a short time, crumbling to dust." +msgstr "" + #: lang/json/GENERIC_from_json.py msgid "The Medieval Warrior" msgid_plural "The Medieval Warrior" @@ -43668,12 +44255,6 @@ msgid_plural ".45 Long Colt casings" msgstr[0] "" msgstr[1] "" -#: lang/json/GENERIC_from_json.py -msgid ".410 hull" -msgid_plural ".410 hulls" -msgstr[0] "" -msgstr[1] "" - #. ~ Description for .410 hull #: lang/json/GENERIC_from_json.py msgid "An empty hull from a .410 bore shotgun shell." @@ -43869,7 +44450,7 @@ msgstr[1] "" #. ~ Description for light plutonium fuel battery #: lang/json/MAGAZINE_from_json.py msgid "" -"This battery uses a thin plutonium-244 rod to stablize an exotic " +"This battery uses a thin plutonium-244 rod to stabilize an exotic " "nanocompound. It is universally compatible with all kinds of personal " "electronic devices. Although it stores a huge amount of power, it cannot be " "recharged." @@ -44485,6 +45066,15 @@ msgid "" "rounds." msgstr "" +#: lang/json/MAGAZINE_from_json.py +msgid "P320 magazine .357 SIG" +msgstr "" + +#. ~ Description for P320 magazine .357 SIG +#: lang/json/MAGAZINE_from_json.py +msgid "A 14 round double stack box magazine for the SIG Sauer P320." +msgstr "" + #: lang/json/MAGAZINE_from_json.py msgid "makeshift .38 25-round magazine" msgstr "" @@ -44507,25 +45097,25 @@ msgid "A compact steel box magazine for use with the Taurus Pro .38 pistol." msgstr "" #: lang/json/MAGAZINE_from_json.py -msgid ".38 7-round speedloader" +msgid ".38/.357 7-round speedloader" msgstr "" -#. ~ Description for .38 7-round speedloader +#. ~ Description for .38/.357 7-round speedloader #: lang/json/MAGAZINE_from_json.py msgid "" -"This speedloader can hold 7 rounds of .38 and quickly reload a compatible " -"revolver." +"This speedloader can hold 7 rounds of .357 Magnum or .38 Special and quickly " +"reload a compatible revolver." msgstr "" #: lang/json/MAGAZINE_from_json.py -msgid ".38 5-round speedloader" +msgid ".38/.357 5-round speedloader" msgstr "" -#. ~ Description for .38 5-round speedloader +#. ~ Description for .38/.357 5-round speedloader #: lang/json/MAGAZINE_from_json.py msgid "" -"This speedloader can hold 5 rounds of .38 and quickly reload a compatible " -"revolver." +"This speedloader can hold 5 rounds of .357 Magnum or .38 Special and quickly " +"reload a compatible revolver." msgstr "" #: lang/json/MAGAZINE_from_json.py @@ -44565,6 +45155,15 @@ msgstr "" msgid "A cheap 32-round steel box magazine for use with the MAC-11 SMG." msgstr "" +#: lang/json/MAGAZINE_from_json.py +msgid "M1911 .38 Super magazine" +msgstr "" + +#. ~ Description for M1911 .38 Super magazine +#: lang/json/MAGAZINE_from_json.py +msgid "A compact single stack box magazine for the M1911." +msgstr "" + #: lang/json/MAGAZINE_from_json.py msgid ".40 6-round speedloader" msgstr "" @@ -44631,6 +45230,27 @@ msgid "" "belts." msgstr "" +#: lang/json/MAGAZINE_from_json.py +msgid "Saiga-410 box magazine" +msgstr "" + +#. ~ Description for Saiga-410 box magazine +#: lang/json/MAGAZINE_from_json.py +msgid "" +"A removable plastic box magazine for the Saiga-410 shotgun. Holds 10 shells." +msgstr "" + +#: lang/json/MAGAZINE_from_json.py +msgid "Saiga-410 drum magazine" +msgstr "" + +#. ~ Description for Saiga-410 drum magazine +#: lang/json/MAGAZINE_from_json.py +msgid "" +"A removable plastic drum magazine for the Saiga-410 shotgun. Holds 30 " +"shells." +msgstr "" + #: lang/json/MAGAZINE_from_json.py msgid ".44 6-round speedloader" msgstr "" @@ -45207,6 +45827,15 @@ msgstr "" msgid "A standard 7-round steel box magazine for the Kel-Tec PF-9." msgstr "" +#: lang/json/MAGAZINE_from_json.py +msgid "P320 magazine 9x19mm" +msgstr "" + +#. ~ Description for P320 magazine 9x19mm +#: lang/json/MAGAZINE_from_json.py +msgid "A 17 round double stack box magazine for the SIG Sauer P320." +msgstr "" + #: lang/json/MAGAZINE_from_json.py msgid "Makarov PM magazine" msgstr "" @@ -45840,10 +46469,6 @@ msgstr "" msgid "A 9-round magazine for the M1991A1 .38 Super pistol." msgstr "" -#: lang/json/MAGAZINE_from_json.py -msgid "Saiga-410 box magazine" -msgstr "" - #. ~ Description for Saiga-410 box magazine #: lang/json/MAGAZINE_from_json.py msgid "" @@ -45851,10 +46476,6 @@ msgid "" "of .410 bore shotshells." msgstr "" -#: lang/json/MAGAZINE_from_json.py -msgid "Saiga-410 drum magazine" -msgstr "" - #. ~ Description for Saiga-410 drum magazine #: lang/json/MAGAZINE_from_json.py msgid "" @@ -46372,6 +46993,15 @@ msgstr "" msgid "Removes all black powder and pre-Cold War firearms." msgstr "" +#: lang/json/MOD_INFO_from_json.py +msgid "No Rail Stations" +msgstr "" + +#. ~ Description for No Rail Stations +#: lang/json/MOD_INFO_from_json.py +msgid "Removes above-ground rail stations from the game." +msgstr "" + #: lang/json/MOD_INFO_from_json.py msgid "Disable Religious Texts" msgstr "" @@ -46741,3612 +47371,3612 @@ msgid "Higher dex increases your speed." msgstr "" #: lang/json/MONSTER_from_json.py -msgid "debug monster" +msgid "chicken" msgstr "" -#. ~ Description for debug monster +#. ~ Description for chicken #: lang/json/MONSTER_from_json.py -msgid "This monster exists only for testing purposes." +msgid "" +"A domesticated descendant of junglefowl, it may still be the most numerous " +"bird in the world. Before the Cataclysm, it was raised by humans as a " +"source of meat, eggs, and early morning wakeup calls." msgstr "" #: lang/json/MONSTER_from_json.py -msgid "albino penguin" +msgid "grouse" msgstr "" -#. ~ Description for albino penguin +#. ~ Description for grouse #: lang/json/MONSTER_from_json.py msgid "" -"Eight-feet-tall ghastly white penguins. Placid unless otherwise provoked." +"A very common game bird, these creatures remind you of what a wild chicken " +"must have been like." msgstr "" #: lang/json/MONSTER_from_json.py -msgid "alpha razorclaw" +msgid "crow" msgstr "" -#. ~ Description for alpha razorclaw +#. ~ Description for crow #: lang/json/MONSTER_from_json.py msgid "" -"A blood red, gigantic razorclaw. Its sword like pincers serve as the " -"keepers of the nest." +"A small, elegant black bird, famous for its distinctive call. An " +"intelligent bird, there is a glitter of mischief behind its eyes." msgstr "" #: lang/json/MONSTER_from_json.py -msgid "amigara horror" +msgid "duck" msgstr "" -#. ~ Description for amigara horror +#. ~ Description for duck #: lang/json/MONSTER_from_json.py msgid "" -"A hellish, vaguely humanoid horror, two stories tall. Its face is " -"grotesquely stretched out, its limbs deformed to unrecognizable outgrowths." +"A mallard duck, often seen around rivers and other bodies of water. It " +"feeds primarily on insects, seeds, roots, and, pre-cataclysm, bread scraps." msgstr "" #: lang/json/MONSTER_from_json.py -msgid "bat" +msgid "goose" msgstr "" -#. ~ Description for bat +#. ~ Description for goose #: lang/json/MONSTER_from_json.py -msgid "" -"One of the vesper bats, a family of winged insect-eating mammals. It roosts " -"in caves and other hollows, and uses a form of echolocation to aerially " -"navigate through tricky terrain at rapid speeds." +msgid "A Canadian goose, a common waterfowl that regrets leaving Canada." msgstr "" #: lang/json/MONSTER_from_json.py -msgid "scarred zombie" +msgid "turkey" msgstr "" -#. ~ Description for scarred zombie +#. ~ Description for turkey #: lang/json/MONSTER_from_json.py msgid "" -"A deformed human body, its skin transformed into one thick, calloused " -"envelope of scar tissue." +"A large and colorful game bird native to the forests of North America. Its " +"head and beak are covered in fleshy protuberances." msgstr "" #: lang/json/MONSTER_from_json.py -msgid "blank body" -msgid_plural "blank bodies" -msgstr[0] "" -msgstr[1] "" +msgid "pheasant" +msgstr "" -#. ~ Description for blank body +#. ~ Description for pheasant #: lang/json/MONSTER_from_json.py msgid "" -"This is some form of unnatural changeling creature; its appearance is a " -"bland mockery of the human form. Featureless and pale, its repugnant " -"countenance is all the more unsettling due to its lack of eyes and " -"distinguishing features except for a perfectly round mouth. Naked and " -"trembling, it almost seems pitiful but for the way that its unearthly " -"presence makes the hair on the back of your neck stand up in nameless horror." +"A medium sized game bird that can have bright feathers depending on the sex " +"and species." msgstr "" #: lang/json/MONSTER_from_json.py -msgid "blob" +msgid "cockatrice" msgstr "" -#. ~ Description for blob +#. ~ Description for cockatrice #: lang/json/MONSTER_from_json.py msgid "" -"A black blob of viscous goo, oozing across the ground like a glob of living " -"oil." +"This strange mutant bird gains its name from its odd appearance. Although " +"its features seem to be becoming more reptilian, it doesn't appear dangerous." msgstr "" #: lang/json/MONSTER_from_json.py -msgid "brain blob" +msgid "yellow chick" msgstr "" -#. ~ Description for brain blob +#. ~ Description for yellow chick #: lang/json/MONSTER_from_json.py msgid "" -"A gigantic black blob of viscous goo, oozing across the ground like a glob " -"of living oil. Other blobs seem to swarm around it." +"A tiny yellow and brown chick, it could be from a number of different " +"species." msgstr "" #: lang/json/MONSTER_from_json.py -msgid "big blob" +msgid "brown chick" msgstr "" -#. ~ Description for big blob #: lang/json/MONSTER_from_json.py -msgid "" -"A large black blob of viscous goo, oozing across the ground like a glob of " -"living oil." +msgid "strange chick" msgstr "" +#. ~ Description for strange chick #: lang/json/MONSTER_from_json.py -msgid "small blob" +msgid "A strange tiny chick, it could be from a number of different species." msgstr "" -#. ~ Description for small blob +#: lang/json/MONSTER_from_json.py +msgid "waterfowl chick" +msgstr "" + +#. ~ Description for waterfowl chick #: lang/json/MONSTER_from_json.py msgid "" -"A small black blob of viscous goo, oozing across the ground like a glob of " -"living oil." +"A tiny yellow and brown waterfowl chick, it could be from a number of " +"different species." msgstr "" #: lang/json/MONSTER_from_json.py -msgid "blood sacrifice" +msgid "security bot" msgstr "" -#. ~ Description for blood sacrifice +#. ~ Description for security bot #: lang/json/MONSTER_from_json.py msgid "" -"A defiled human body, once living. Tortured to death long ago, it remains " -"chained to the altar, the putrescent flays of its peeled skin quivering like " -"so much flotsam upon a murky pond." +"The Northrop Watchman X-1 is a production series of heavily armored combat " +"robots. Initially designed for military patrol and escort service, it rolls " +"on a set of hydraulic treads and is armed with a 9x19mm SMG." msgstr "" #: lang/json/MONSTER_from_json.py -msgid "boomer" +msgid "turret" msgstr "" -#. ~ Description for boomer +#. ~ Description for turret #: lang/json/MONSTER_from_json.py msgid "" -"A rotund human body, bloated beyond belief and layered in rolls of fat. It " -"emits a horrible odor, and a putrid pink sludge dribbles from its mouth." +"The General Atomics TX-1 Guardian, a small, pill-shaped automated gun turret " +"using state of the art ATR systems to dynamically reorient itself to new " +"friends and enemies alike. The two SMG barrels can swivel a full 360 " +"degrees." msgstr "" #: lang/json/MONSTER_from_json.py -msgid "gasoline zombie" +msgid "skitterbot" msgstr "" -#. ~ Description for gasoline zombie +#. ~ Description for skitterbot #: lang/json/MONSTER_from_json.py msgid "" -"A huge bloated zombie that appears to have fed upon gasoline; fumes and " -"flames escape from its mouth and fuel leaks from its waddling form." +"A insectoid robot the size of a small dog, designed for home security. " +"Armed with two close-range tazers, it can skate across the ground with great " +"speed." msgstr "" #: lang/json/MONSTER_from_json.py -msgid "fungal boomer" +msgid "experimental lab bot" msgstr "" -#. ~ Description for fungal boomer +#. ~ Description for experimental lab bot #: lang/json/MONSTER_from_json.py msgid "" -"A rotund and bloated human body with pasty, fungus-ridden flesh. Its mouth " -"drips with a frothing gray sludge." +"This robot looks like a large metal spider, a bit bigger than a person, with " +"its thorax covered in tiny holes. An ominous buzzing emanates from it." msgstr "" #: lang/json/MONSTER_from_json.py -msgid "huge boomer" +msgid "prototype robot" msgstr "" -#. ~ Description for huge boomer +#. ~ Description for prototype robot #: lang/json/MONSTER_from_json.py msgid "" -"This boomer, normally swollen and ready to burst, has strengthened and " -"solidified. The bile dribbling from its mouth also appears to have " -"changed..." +"The single glowing eye of this robot surveys the landscape periodically, as " +"it performs the endless slaughter dictated by a misinterpreted and cruel " +"routine. Between half-built plates, you can see the machinery and cables " +"that animate it, and yet it moves deftly as it switches between one target " +"and the next." msgstr "" #: lang/json/MONSTER_from_json.py -msgid "breather" +msgid "NR-031 Dispatch" msgstr "" -#. ~ Description for breather +#. ~ Description for NR-031 Dispatch #: lang/json/MONSTER_from_json.py msgid "" -"This is some sort of unearthly pink flesh sac; moist and ridged with veins, " -"it is otherwise without discernible exterior features. Seemingly immobile " -"and defenseless, it sits in place, swelling and collapsing upon itself as it " -"breathes." +"The Northrop Dispatch, designed for crowd control situations, carries and " +"deploys kamikaze drones of various types, with a small onboard EMP emitter " +"frying them in the event of its destruction. The bright green-and-yellow " +"paint marks a low-force variant - *comparatively* low-force, anyways - " +"typically deployed as guards after an area has been cleared." msgstr "" -#. ~ Description for breather #: lang/json/MONSTER_from_json.py -msgid "A weird mass of immobile pink goo. It seems to breathe." +msgid "NR-V05-M Dispatch" msgstr "" +#. ~ Description for NR-V05-M Dispatch #: lang/json/MONSTER_from_json.py -msgid "broken cyborg" +msgid "" +"The Northrop Dispatch, designed for crowd control situations, carries and " +"deployes kamikaze drones of various types, with a small onboard EMP emitter " +"frying them in the event of its destruction. The dark green paint job marks " +"the lethal and feared military variant, carrying extreme and deadly " +"firepower." msgstr "" -#. ~ Description for broken cyborg #: lang/json/MONSTER_from_json.py -msgid "" -"A robot body with the head of a human. All kinds of electronic wires and " -"devices are implanted in its head. Patches of skin look diseased or " -"rotting. This cyborg moves erratically and has a confused and deranged look " -"in its eyes." +msgid "autonomous drone" msgstr "" #: lang/json/MONSTER_from_json.py -msgid "prototype cyborg" +msgid "EMP hack" msgstr "" -#. ~ Description for prototype cyborg +#. ~ Description for EMP hack #: lang/json/MONSTER_from_json.py msgid "" -"A human fused with a mess of metal parts and wires. While its eyes are " -"empty, flashes of pain pass across its face reminiscent of the person " -"trapped in this grotesque body. With enough surgical skills one might be " -"able to give them back some humanity. If only they cared..." +"An automated kamikaze drone, this small quadcopter robot appears to have an " +"EMP grenade inside." msgstr "" #: lang/json/MONSTER_from_json.py -msgid "charred nightmare" +msgid "C-4 hack" msgstr "" -#. ~ Description for charred nightmare +#. ~ Description for C-4 hack #: lang/json/MONSTER_from_json.py msgid "" -"Intense radiation has spurred a unique form of necrosis and regeneration, it " -"is impossible to tell if this creature was ever human." +"An automated kamikaze drone, this small quadcopter robot appears to have " +"some C-4 inside." msgstr "" #: lang/json/MONSTER_from_json.py -msgid "chicken walker" +msgid "flashbang hack" msgstr "" -#. ~ Description for chicken walker +#. ~ Description for flashbang hack #: lang/json/MONSTER_from_json.py msgid "" -"The Northrop ATSV, a massive, heavily-armed and armored robot walking on a " -"pair of reverse-jointed legs. Armed with a 40mm anti-vehicle grenade " -"launcher, 5.56 anti-personnel gun, and the ability to electrify itself " -"against attackers, it is an effective automated sentry, though production " -"was limited due to a legal dispute." +"An automated kamikaze drone, this small quadcopter robot appears to have a " +"flashbang inside." msgstr "" #: lang/json/MONSTER_from_json.py -msgid "C.H.U.D." +msgid "tear gas hack" msgstr "" -#. ~ Description for C.H.U.D. +#. ~ Description for tear gas hack #: lang/json/MONSTER_from_json.py msgid "" -"The C.H.U.D. or Cannibalistic Humanoid Underground Dweller. A human being " -"turned pale and mad from years of underground isolation." +"An automated kamikaze drone, this small quadcopter robot appears to have a " +"tear gas canister inside." msgstr "" #: lang/json/MONSTER_from_json.py -msgid "police bot" +msgid "grenade hack" msgstr "" -#. ~ Description for police bot +#. ~ Description for grenade hack #: lang/json/MONSTER_from_json.py msgid "" -"One of the many models of armored law enforcement robots employed shortly " -"before the collapse of civilization. Solar powered like many other robots, " -"it maintains its programmed pursuit of law and order, propelled on a trio of " -"omni wheels." +"An automated kamikaze drone, this small quadcopter robot appears to have a " +"grenade inside." msgstr "" #: lang/json/MONSTER_from_json.py -msgid "crawler" +msgid "manhack" msgstr "" -#. ~ Description for crawler +#. ~ Description for manhack #: lang/json/MONSTER_from_json.py msgid "" -"A conglomeration of human parts fused together in a horrible mishmash of " -"function, slowly dragging its eldritch body across the ground." +"An automated anti-personnel drone, a small quadcopter robot surrounded by " +"whirring blades." msgstr "" #: lang/json/MONSTER_from_json.py -msgid "dark wyrm" +msgid "mininuke hack" msgstr "" -#. ~ Description for dark wyrm +#. ~ Description for mininuke hack #: lang/json/MONSTER_from_json.py msgid "" -"A huge mutated worm found deep underground. It has a gaping round mouth " -"lined with dagger-like teeth, and its flesh is slick with bubbling blue " -"slime." +"Many times as large as a normal manhack, this flying quadcopter drone " +"appears to have a mininuke inside. If this is targeting you... Run." msgstr "" #: lang/json/MONSTER_from_json.py -msgid "wraith" +msgid "tiny fish" msgstr "" -#. ~ Description for wraith +#. ~ Description for tiny fish #: lang/json/MONSTER_from_json.py -msgid "" -"A gigantic shadow, chaotically changing in shape and volume. Two piercing " -"orbs of light dominate what can only be described as its head." +msgid "A tiny fish." msgstr "" #: lang/json/MONSTER_from_json.py -msgid "dementia" +msgid "small fish" msgstr "" -#. ~ Description for dementia +#. ~ Description for small fish #: lang/json/MONSTER_from_json.py -msgid "" -"A crazed individual, the bloody scars on the side of its shaved head suggest " -"some sort of partial lobotomy" +msgid "A small fish." msgstr "" #: lang/json/MONSTER_from_json.py -msgid "skeletal dog" +msgid "medium fish" msgstr "" -#. ~ Description for skeletal dog +#. ~ Description for medium fish #: 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." +msgid "A medium fish." msgstr "" #: lang/json/MONSTER_from_json.py -msgid "dog" +msgid "large fish" msgstr "" -#. ~ Description for dog +#. ~ Description for large fish #: lang/json/MONSTER_from_json.py -msgid "" -"A domesticated mongrel of the canine persuasion. In the absence of human " -"society, it has turned feral. You feel a sudden urge to destroy it." +msgid "A large fish." msgstr "" #: lang/json/MONSTER_from_json.py -msgid "Z-9" +msgid "huge fish" msgstr "" -#. ~ Description for Z-9 +#. ~ Description for huge fish #: lang/json/MONSTER_from_json.py -msgid "" -"A zombified version of one of the German shepherd dogs used in law " -"enforcement. Its deformed body is encased in a protective Kevlar harness." +msgid "A huge fish." msgstr "" #: lang/json/MONSTER_from_json.py -msgid "rot-weiler" +msgid "trout" msgstr "" -#. ~ Description for rot-weiler +#. ~ Description for trout #: lang/json/MONSTER_from_json.py msgid "" -"Acrid smell accompanies this corpse of canine. Its whole body is covered in " -"chains of pulsing cysts and slime-dribbling ulcers." +"A Trout. A fish made popular by father-son fishing trips, Except for the " +"part where you have to gut it." msgstr "" #: lang/json/MONSTER_from_json.py -msgid "eyebot" +msgid "brown trout" msgstr "" -#. ~ Description for eyebot +#. ~ Description for brown trout #: lang/json/MONSTER_from_json.py msgid "" -"A quadcopter drone largely comprised of a high-resolution camera lens and a " -"speaker, this robot hovers above the ground, documenting the carnage and " -"mayhem around it. While it is no longer able to report to a central " -"authority, it's likely that some of its automated alert systems are still " -"functional, given that the thing seems to have an operational charging " -"station somewhere." +"A Brown Trout. A fish made popular by father-son fishing trips, Except for " +"the part where you have to gut it." msgstr "" #: lang/json/MONSTER_from_json.py -msgid "nurse bot" +msgid "brook trout" msgstr "" -#. ~ Description for nurse bot +#. ~ Description for brook trout #: lang/json/MONSTER_from_json.py msgid "" -"The first product from Uncanny, a towering four-armed humanoid with a gentle " -"face. The details of its visage are striking, but the stiffness of it makes " -"you really uncomfortable. The end of the world did not stop it from looking " -"for patient to assist." +"A Brook Trout. A fish made popular by father-son fishing trips, Except for " +"the part where you have to gut it." msgstr "" #: lang/json/MONSTER_from_json.py -msgid "flaming eye" +msgid "lake trout" msgstr "" -#. ~ Description for flaming eye +#. ~ Description for lake trout #: lang/json/MONSTER_from_json.py msgid "" -"An enormous disembodied eyeball the size of a person, flying through the air " -"through some unknown agency. Wreathed in unnatural flickering blue flame, " -"it possesses a blazing yellow iris with a slitted pupil like that of a cat " -"and trails a set of flailing black tendrils as it slowly drifts about; its " -"unearthly presence filling you with dread at the prospect of falling under " -"its baleful gaze." +"A Lake trout. A fish made popular by father-son fishing trips, Except for " +"the part where you have to gut it." msgstr "" #: lang/json/MONSTER_from_json.py -msgid "flesh angel" +msgid "rainbow trout" msgstr "" -#. ~ Description for flesh angel +#. ~ Description for rainbow trout #: lang/json/MONSTER_from_json.py msgid "" -"A tall and slender man lacking skin and any normalcy of countenance. Wings " -"of muscle curl forth from its back and a third eye dominates the forehead." +"A Rainbow Trout. A fish made popular by father-son fishing trips, Except " +"for the part where you have to gut it." msgstr "" #: lang/json/MONSTER_from_json.py -msgid "flying polyp" +msgid "steelhead trout" msgstr "" -#. ~ Description for flying polyp +#. ~ Description for steelhead trout #: lang/json/MONSTER_from_json.py msgid "" -"A half polypous, utterly alien creature. It's only partly material and has " -"the ability to fly, despite the absence of wings. It produces strange " -"whistling noises which send cold shivers of primal terror down your spine" +"A Steelhead Trout. A fish made popular by father-son fishing trips, Except " +"for the part where you have to gut it." msgstr "" #: lang/json/MONSTER_from_json.py -msgid "fungal blossom" +msgid "salmon" msgstr "" -#. ~ Description for fungal blossom +#. ~ Description for salmon #: lang/json/MONSTER_from_json.py msgid "" -"A broad fungus, looking much like a glowing blue sunflower. It appears to " -"emit finer spores than the typical fungal emission." +"An Atlantic Salmon. A very fatty, nutritious fish. Tastes great smoked." msgstr "" #: lang/json/MONSTER_from_json.py -msgid "fungal hedgerow" +msgid "kokanee salmon" msgstr "" -#. ~ Description for fungal hedgerow +#. ~ Description for kokanee salmon #: lang/json/MONSTER_from_json.py -msgid "" -"Looking at first glance like a dull gray privet, this \"hedge\" is really a " -"mass of barbed fungal tendrils, defending the fungal tower." +msgid "A Kokanee Salmon. A very fatty, nutritious fish. Tastes great smoked." msgstr "" #: lang/json/MONSTER_from_json.py -msgid "fungal tendril" +msgid "chinook salmon" msgstr "" -#. ~ Description for fungal tendril +#. ~ Description for chinook salmon #: lang/json/MONSTER_from_json.py -msgid "A long and delicate-looking tendril with a sharp tip." +msgid "A Chinook Salmon. A very fatty, nutritious fish. Tastes great smoked." msgstr "" -#: lang/json/MONSTER_from_json.py lang/json/terrain_from_json.py -#: lang/json/terrain_from_json.py -msgid "fungal wall" +#: lang/json/MONSTER_from_json.py +msgid "coho salmon" msgstr "" -#. ~ Description for fungal wall +#. ~ Description for coho salmon #: lang/json/MONSTER_from_json.py -msgid "" -"A veritable wall of fungus, grown as a natural defense by the fungal spire. " -"New spores erupt from the surface every few seconds." +msgid "A Coho Salmon. A very fatty, nutritious fish. Tastes great smoked." msgstr "" #: lang/json/MONSTER_from_json.py -msgid "fungaloid" +msgid "whitefish" msgstr "" -#. ~ Description for fungaloid +#. ~ Description for whitefish #: lang/json/MONSTER_from_json.py msgid "" -"A pale white fungus, one meaty gray stalk supporting a bloom at the top. " -"Spores are periodically expelled from its gills, and a few tendrils extend " -"from the base, allowing mobility and some basic means of defense." +"A whitefish, closely related to salmon. One can assume they are just as " +"nice when cooked with smoke." msgstr "" #: lang/json/MONSTER_from_json.py -msgid "fungal spire" +msgid "largemouth bass" msgstr "" -#. ~ Description for fungal spire +#. ~ Description for largemouth bass #: lang/json/MONSTER_from_json.py -msgid "" -"An enormous fungal spire, towering over the ground. It pulsates slowly, " -"continuously growing new defenses." +msgid "A Largemouth Bass. Very popular with sports fishermen." msgstr "" #: lang/json/MONSTER_from_json.py -msgid "giant fungal blossom" +msgid "smallmouth bass" msgstr "" -#. ~ Description for giant fungal blossom +#. ~ Description for smallmouth bass #: lang/json/MONSTER_from_json.py msgid "" -"An immense fungal blossom, towering over its surroundings. It pulses with a " -"soft blue glow, continuously pumping its spores into the air." +"A Smallmouth Bass. Being intolerant to pollution in the water, smallmouth " +"bass are a good indicator of how clean it is." msgstr "" #: lang/json/MONSTER_from_json.py -#: lang/json/overmap_terrain_from_json.py -msgid "fungal tower" +msgid "striped bass" msgstr "" -#. ~ Description for fungal tower +#. ~ Description for striped bass #: lang/json/MONSTER_from_json.py msgid "" -"An enormous fungal tower. On closer inspection, its cap is supported by " -"LOTS of fungal tendrils of various thicknesses, emerging from yet more " -"bristling tendrils at ground level. Between this redundancy and their " -"noticeable movement creating frequent gaps, it's tough to get a solid shot " -"on the thing." +"A Striped Bass. Mostly a salt water fish, they migrate to fresher water to " +"spawn." msgstr "" #: lang/json/MONSTER_from_json.py -msgid "fungal sporeling" +msgid "white bass" msgstr "" -#. ~ Description for fungal sporeling +#. ~ Description for white bass #: lang/json/MONSTER_from_json.py msgid "" -"A fungal stalk several feet in height. Two vicious looking tendrils extend " -"from its thorned and leathery exterior, and it moves about faster than the " -"larger fungaloids." +"A White Bass. Common to the region, a slab-sided and spiny-rayed little " +"fish." msgstr "" #: lang/json/MONSTER_from_json.py -msgid "amoebic mold" +msgid "perch" msgstr "" -#. ~ Description for amoebic mold +#. ~ Description for perch #: lang/json/MONSTER_from_json.py msgid "" -"A formless slime mold the size of a cow. Crusty bits of cytoplasm fall away " -"as it oozes across the ground." +"A small spritely Perch. A very bony fish, still got some tasty meat on it " +"though." msgstr "" #: lang/json/MONSTER_from_json.py -msgid "generator" +msgid "walleye" msgstr "" -#. ~ Description for generator +#. ~ Description for walleye #: lang/json/MONSTER_from_json.py -msgid "Your precious generator, noisily humming away. Defend it at all costs!" +msgid "A Walleye, a green-brown medium-sized fish with a white belly." msgstr "" #: lang/json/MONSTER_from_json.py -msgid "giant crayfish" +msgid "sunfish" msgstr "" -#. ~ Description for giant crayfish +#. ~ Description for sunfish #: lang/json/MONSTER_from_json.py -msgid "" -"A mutant, terrestrial variety of the signal crayfish, this massive " -"crustacean resembles a humongous lobster." +msgid "A Sunfish. A small fish related to bass or bluegill." msgstr "" #: lang/json/MONSTER_from_json.py -msgid "gozu" +msgid "pumpkinseed sunfish" msgstr "" -#. ~ Description for gozu +#. ~ Description for pumpkinseed sunfish #: lang/json/MONSTER_from_json.py -msgid "" -"This is some sort of unnatural cross between a bull and a man. Quite " -"different from the minotaur of legend, it possesses a shaggy white bull’s " -"head on an otherwise unremarkable human body. Clad in sagging socks and " -"stained jockey shorts, it grunts and snuffles, drooling ropey strands of " -"white slobber down its chest. Its mere presence fills you with an " -"unfathomable dread." +msgid "A Pumpkinseed Sunfish. A small fish related to bass or bluegill." msgstr "" #: lang/json/MONSTER_from_json.py -msgid "graboid" +msgid "bluegill" msgstr "" -#. ~ Description for graboid +#. ~ Description for bluegill #: lang/json/MONSTER_from_json.py msgid "" -"A monstrous beast the size of a semi truck with a tripartite mouth that " -"opens to reveal hundreds of writhing tongues with razor sharp edges. It " -"keeps most of its enormous body hidden underground." +"A Bluegill, an invasive species in Japan. Commonly gutted and cooked whole." msgstr "" #: lang/json/MONSTER_from_json.py -msgid "gracken" +msgid "redbreast sunfish" msgstr "" -#. ~ Description for gracken +#. ~ Description for redbreast sunfish #: lang/json/MONSTER_from_json.py -msgid "" -"This is some form of eldritch monstrosity; an uncouth black being with " -"smooth, oily, skin and unpleasant horns that curve inward toward each " -"other. Tall and thin, the shadows cling unnaturally to its vaguely defined " -"humanoid form as it shuffles along, its hands twitching and spasming so " -"rapidly as to appear a little more than a black blur of claws. Gazing upon " -"its disturbing form fills you with an unspeakable terror." +msgid "A Redbreast Sunfish. A small fish related to bass or bluegill." msgstr "" #: lang/json/MONSTER_from_json.py -msgid "half worm" +msgid "green sunfish" msgstr "" -#. ~ Description for half worm +#. ~ Description for green sunfish #: lang/json/MONSTER_from_json.py -msgid "A squiggling severed portion of a wounded giant worm." +msgid "A Green Sunfish. A small fish related to bass or bluegill." msgstr "" #: lang/json/MONSTER_from_json.py -msgid "your mother" +msgid "longear sunfish" msgstr "" -#. ~ Description for your mother +#. ~ Description for longear sunfish #: lang/json/MONSTER_from_json.py -msgid "Mom?" +msgid "A Longear Sunfish. A small fish related to bass or bluegill." msgstr "" #: lang/json/MONSTER_from_json.py -msgid "evil multi-cooker" +msgid "redear sunfish" msgstr "" -#. ~ Description for evil multi-cooker +#. ~ Description for redear sunfish #: lang/json/MONSTER_from_json.py -msgid "The multi-cooker's got a mind of its own! Look out!" +msgid "A Redear Sunfish. A small fish related to bass or bluegill." msgstr "" #: lang/json/MONSTER_from_json.py -msgid "cleaner bot" +msgid "rock bass" msgstr "" -#. ~ Description for cleaner bot +#. ~ Description for rock bass #: lang/json/MONSTER_from_json.py msgid "" -"The Ford Sanitron, a utility robot designed for cleaning up waste material " -"in hazardous conditions." +"A Rock Bass. Related to sunfish, this tiny fish has a camoflauge-like " +"patterning and a red eye." msgstr "" #: lang/json/MONSTER_from_json.py -msgid "tentacle dog" +msgid "calico bass" msgstr "" -#. ~ Description for tentacle dog +#. ~ Description for calico bass #: lang/json/MONSTER_from_json.py -msgid "" -"A dog's body with a mass of ropey, black tentacles reaching out from its " -"head." +msgid "A Calico Bass. A medium-sized fish also known as a 'Crappie'." msgstr "" #: lang/json/MONSTER_from_json.py -msgid "hologram" +msgid "warmouth" msgstr "" -#. ~ Description for hologram +#. ~ Description for warmouth #: lang/json/MONSTER_from_json.py -msgid "An image made from light, nearly identical to the real deal." +msgid "" +"A Warmouth, similar to a rock bass, this small fish is related to the " +"sunfish." msgstr "" #: lang/json/MONSTER_from_json.py -msgid "homunculus" -msgid_plural "homunculuses" -msgstr[0] "" -msgstr[1] "" - -#. ~ Description for homunculus -#: lang/json/MONSTER_from_json.py -msgid "" -"A pale hairless man with an impressive athletic physique. Its lidless eyes " -"are totally black, and seeping with blood." +msgid "bullhead" msgstr "" +#. ~ Description for bullhead #: lang/json/MONSTER_from_json.py -msgid "human snail" +msgid "A Bullhead, a type of catfish. Delicious battered and fried." msgstr "" -#. ~ Description for human snail #: lang/json/MONSTER_from_json.py -msgid "" -"An enormous fleshy snail, with an oddly human face. Eyestalks protrude from " -"where the eyes should be." +msgid "channel catfish" msgstr "" +#. ~ Description for channel catfish #: lang/json/MONSTER_from_json.py -msgid "hunting horror" +msgid "A Channel Catfish, they have a forked tail and long whiskers." msgstr "" -#. ~ Description for hunting horror #: lang/json/MONSTER_from_json.py -msgid "" -"This is some sort of great viperine creature, possessed of a curiously " -"distorted head and massive clawed appendages. It partially supports itself " -"with the aid of black rubbery wings of monstrous dimensions. Its form " -"writhes and changes before your eyes, filling you with unnameable horror." +msgid "white catfish" msgstr "" +#. ~ Description for white catfish #: lang/json/MONSTER_from_json.py -msgid "irradiated wanderer" +msgid "A White Catfish, a small whiskered fish with a broad head." msgstr "" -#. ~ Description for irradiated wanderer +#. ~ Description for pike #: lang/json/MONSTER_from_json.py msgid "" -"This rotting corpse seeps a glowing ooze from its lesions. A strange " -"tattered jumpsuit marks it as an oddity across the wasteland." +"A Northern Pike. Pike can be a pretty aggressive fish, careful around those " +"teeth." msgstr "" #: lang/json/MONSTER_from_json.py -msgid "fleshy shambler" +msgid "pickerel" msgstr "" -#. ~ Description for fleshy shambler +#. ~ Description for pickerel #: lang/json/MONSTER_from_json.py -msgid "" -"An amalgamation of throbbing organs from various creatures have fused " -"together into this lurching, vaguely humanoid shape. It's myriad roughly " -"formed mouths sussurate in a chorus of sibilant groans and whispers." +msgid "A Pickerel. It looks like a pike, but much smaller." msgstr "" #: lang/json/MONSTER_from_json.py -msgid "flesh golem" +msgid "muskellunge" msgstr "" -#. ~ Description for flesh golem +#. ~ Description for muskellunge #: lang/json/MONSTER_from_json.py msgid "" -"A seeping conglomeration of spasming muscle and organs have fused together " -"into this towering caricature of the human form. Various organs fall off of " -"it's hulking body only to be reabsorbed moments later." +"A Muskellunge. Closely related to pike, it shares the same aggression and " +"sharp teeth." msgstr "" #: lang/json/MONSTER_from_json.py -msgid "jabberwock" +msgid "white sucker" msgstr "" -#. ~ Description for jabberwock +#. ~ Description for white sucker #: lang/json/MONSTER_from_json.py -msgid "" -"A putrid amalgamation of body parts from humans and other creatures have " -"fused together in this aberration of flesh. The eyes of all the heads dart " -"about rapidly and the mouths form a chorus of groaning screams." +msgid "A White Sucker. It has a streamlined body with a round mouth." msgstr "" #: lang/json/MONSTER_from_json.py -msgid "kreck" +msgid "carp" msgstr "" -#. ~ Description for kreck +#. ~ Description for carp #: lang/json/MONSTER_from_json.py msgid "" -"This is some form of otherworldly hound. Lean and hungry looking, its " -"twisted red flesh is stretched tightly across its misshapen, angular frame. " -"Loping grotesquely along, its unusually long neck stretches forward, its " -"skull-like head near the ground as it sniffs out its prey. Its foulness " -"partially veiled by some arcane force, it seems to almost flicker in and out " -"of your perceptions in a fashion that awakens ancient nameless terrors in " -"the back of your mind" +"A golden-yellow Common Carp. Some people think they don't taste great, but " +"you can't afford to be choosy in the cataclysm." msgstr "" #: lang/json/MONSTER_from_json.py -msgid "mi-go" +msgid "grass carp" msgstr "" -#. ~ Description for mi-go +#. ~ Description for grass carp #: lang/json/MONSTER_from_json.py -msgid "" -"This is an alien creature of uncertain origin. Its shapeless pink body " -"bears numerous sets of paired appendages of unknown function, and a pair of " -"ribbed, membranous wings which seem to be quite useless. Its odd, vaguely " -"pyramid-shaped head bristles with numerous wavering antennae, and simply " -"gazing upon the unnatural beast fills you with primordial dread." +msgid "A huge Grass Carp. A golden, herbivorous fish." msgstr "" #: lang/json/MONSTER_from_json.py -msgid "miner bot" +msgid "bowfin" msgstr "" -#. ~ Description for miner bot +#. ~ Description for bowfin #: lang/json/MONSTER_from_json.py msgid "" -"A snake-like, segmented robot built to tunnel into the ground and detonate " -"landmines." +"A Bowfin. These fish are related to gar but without the huge teeth, skin " +"rending scales, and aggression." msgstr "" #: lang/json/MONSTER_from_json.py -msgid "cyclopean" +msgid "fallfish" msgstr "" -#. ~ Description for cyclopean +#. ~ Description for fallfish #: lang/json/MONSTER_from_json.py msgid "" -"A relatively humanoid mutant with purple hair and a grapefruit-sized " -"bloodshot eye." +"A Fallfish. These fish are related to gar but without the huge teeth, skin " +"rending scales, and aggression." msgstr "" #: lang/json/MONSTER_from_json.py -msgid "slimespring" +msgid "lobster" msgstr "" -#. ~ Description for slimespring +#. ~ Description for lobster #: lang/json/MONSTER_from_json.py -msgid "A familiar-looking blob of goo. It sprouts the occasional eyestalk." +msgid "" +"These things were once considered pests not worth eating, then some " +"marketing genius started selling them to people as a delicacy and they took " +"off in popularity... and price." msgstr "" #: lang/json/MONSTER_from_json.py -msgid "razorclaw" +msgid "crayfish" msgstr "" -#. ~ Description for razorclaw +#. ~ Description for crayfish #: lang/json/MONSTER_from_json.py msgid "" -"A man-sized crustacean clad in an iron-like chitin, capable of emitting the " -"most horrible of shrieks. Often spotted near shipwrecks or other dark damp " -"places, which it uses as nesting grounds." +"If you could get ahold of a bunch more of these, a hefty pot of boiling " +"water, and some spicy seasonings..." msgstr "" #: lang/json/MONSTER_from_json.py -msgid "riot control bot" -msgstr "" +msgid "Blinky" +msgid_plural "Blinkies" +msgstr[0] "" +msgstr[1] "" -#. ~ Description for riot control bot +#. ~ Description for Blinky #: lang/json/MONSTER_from_json.py -msgid "" -"Nonviolent riot-control bot. Designed to suppress riots and make mass " -"arrests of those participating. Though its relaxation gas is by far its " -"best-known weapon, it carries a blinding flash and a low-powered stungun for " -"self-defense--in addition to its supply of electronic handcuffs." +msgid "A strange three-eyed fish." msgstr "" #: lang/json/MONSTER_from_json.py -msgid "shadow" +msgid "freshwater eel" msgstr "" -#. ~ Description for shadow +#. ~ Description for freshwater eel #: lang/json/MONSTER_from_json.py msgid "" -"This is an animate shadow. Looking like nothing more than an errant patch " -"of normal shadow, it draws your attention by the way it moves subtly and " -"whispers softly in the back of your mind. Strange intrusive thoughts " -"accompany the quiet murmur, awakening your most horrific memories and fears." +"An American eel. Used to be quite common in these parts until the dams were " +"built. Guess they'll get a second chance now that they aren't running." msgstr "" #: lang/json/MONSTER_from_json.py -msgid "shadow snake" +msgid "jawed terror" msgstr "" -#. ~ Description for shadow snake +#. ~ Description for jawed terror #: lang/json/MONSTER_from_json.py msgid "" -"This is an animate shadow in the form of a long and sinuous snake. " -"Translucent and dark, it glides silently across the floor, wriggling and " -"flexing as it moves." +"A once aggressive and hungry bull shark, this jawed terror is now even more " +"aggressive, possibly thanks to its lack of a functioning brain." msgstr "" #: lang/json/MONSTER_from_json.py -msgid "Shia LaBeouf" -msgid_plural "Shia LaBeouf" -msgstr[0] "" -msgstr[1] "" +msgid "giant carp" +msgstr "" -#. ~ Description for Shia LaBeouf +#. ~ Description for giant carp #: lang/json/MONSTER_from_json.py msgid "" -"Living in the woods, \n" -"killing for sport, \n" -"eating all the bodies, \n" -"actual cannibal Shia LaBeouf." +"This thing seems like a carp, only swollen and very very angry. Death is " +"the gift of the carp god." msgstr "" #: lang/json/MONSTER_from_json.py -msgid "shoggoth" +msgid "giant salmon" msgstr "" -#. ~ Description for shoggoth +#. ~ Description for giant salmon #: lang/json/MONSTER_from_json.py msgid "" -"A gargantuan protoplasmic blob, constantly reshaping, forming new pseudopods " -"seemingly at will. All over its body are eyes that form and disappear. It " -"looks at you with malice." +"A mutated salmon, the same size as a large dog and quite dangerous to the " +"inexperienced angler." msgstr "" #: lang/json/MONSTER_from_json.py -msgid "skeleton" +msgid "seweranha" msgstr "" -#. ~ Description for skeleton +#. ~ Description for seweranha #: lang/json/MONSTER_from_json.py msgid "" -"A monstrous overgrowth of ossified tissue has replaced this zombie'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." +"A large mutant variety of carp. It has shimmering green scales and a mouth " +"lined with three jagged rows of razor-sharp teeth." msgstr "" #: lang/json/MONSTER_from_json.py -msgid "skeletal brute" +msgid "skittering plague" msgstr "" -#. ~ Description for skeletal brute +#. ~ Description for skittering plague #: lang/json/MONSTER_from_json.py -msgid "" -"Distorted outgrowths of calcified bone plates cover this zombie's rotten " -"skin. Joints and cracks around its body ooze with black goo." +msgid "A giant infected roach, it has been feeding on the undead." msgstr "" #: lang/json/MONSTER_from_json.py -msgid "sludge crawler" +msgid "plague nymph" msgstr "" -#. ~ Description for sludge crawler +#. ~ Description for plague nymph #: lang/json/MONSTER_from_json.py -msgid "" -"A sluglike creature, eight feet long and the width of a refrigerator. Its " -"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." +msgid "An infected mutant cockroach about the size of a rat." msgstr "" #: lang/json/MONSTER_from_json.py -msgid "giant slug" +msgid "plague vector" msgstr "" -#. ~ Description for giant slug +#. ~ Description for plague vector #: lang/json/MONSTER_from_json.py 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." +"This infected roach has been feeding on the undead and started to mutate " +"chaotically. Extra limbs and growths sprout from its thorax." msgstr "" #: lang/json/MONSTER_from_json.py -msgid "spore cloud" +msgid "giant cockroach" msgstr "" -#. ~ Description for spore cloud +#. ~ Description for giant cockroach #: lang/json/MONSTER_from_json.py -msgid "A mass of spores the size of a balled fist, wafting around in the air." +msgid "A mutant cockroach the size of a small dog." msgstr "" #: lang/json/MONSTER_from_json.py -msgid "Beagle Mini-Tank UGV" +msgid "giant cockroach nymph" msgstr "" -#. ~ Description for Beagle Mini-Tank UGV +#. ~ Description for giant cockroach nymph #: lang/json/MONSTER_from_json.py -msgid "" -"The Northrop Beagle is a refrigerator-sized urban warfare UGV. Sporting an " -"anti-tank missile launcher, 40mm grenade launcher, and numerous anti-" -"infantry weapons, it's designed for high-risk urban fighting." +msgid "A baby mutant cockroach about the size of a rat." msgstr "" #: lang/json/MONSTER_from_json.py -msgid "thing" +msgid "pregnant giant cockroach" msgstr "" -#. ~ Description for thing +#. ~ Description for pregnant giant cockroach #: lang/json/MONSTER_from_json.py msgid "" -"An amorphous black creature, detaching and sprouting tentacles without any " -"apparent pause." +"A mutant cockroach the size of a small dog. Its abdomen is heavily swollen." msgstr "" #: lang/json/MONSTER_from_json.py -msgid "tripod" +msgid "giant bee" msgstr "" -#. ~ Description for tripod +#. ~ Description for giant bee #: lang/json/MONSTER_from_json.py msgid "" -"The Honda Regnal, a tall robot walking on three spidery legs. For weapons, " -"it has a trio of spiked retractable cables and a flamethrower mounted on its " -"head." +"With a stinger the size of a kitchen knife, this dog-sized insect's black " +"and yellow markings warn you to leave it undisturbed." msgstr "" #: lang/json/MONSTER_from_json.py -msgid "milspec searchlight" +msgid "giant centipede" msgstr "" -#. ~ Description for milspec searchlight +#. ~ Description for giant centipede #: lang/json/MONSTER_from_json.py msgid "" -"Three high-powered searchlights with automated search AI and mounting, " -"continually seeking targets." +"A meter-long centipede with a menacing pair of pincers, moving swiftly on " +"dozens of spindly legs." msgstr "" #: lang/json/MONSTER_from_json.py -msgid "twisted body" -msgid_plural "twisted bodies" +msgid "giant dragonfly" +msgid_plural "giant dragonflies" msgstr[0] "" msgstr[1] "" -#. ~ Description for twisted body +#. ~ Description for giant dragonfly #: lang/json/MONSTER_from_json.py msgid "" -"A human body, but with its limbs, neck, and hair impossibly twisted. It " -"clambers around swiftly, making awful screeching sounds." +"A ferocious mutant dragonfly as big as a cat, darting through the air with a " +"cluster of fangs for a mouth." msgstr "" #: lang/json/MONSTER_from_json.py -msgid "vortex" -msgid_plural "vortexes" +msgid "giant fly" +msgid_plural "giant flies" msgstr[0] "" msgstr[1] "" -#. ~ Description for vortex +#. ~ Description for giant fly #: lang/json/MONSTER_from_json.py msgid "" -"A twisting spot in the air, with some kind of morphing mass at its center." +"A tremendous housefly the size of a small dog, predictably accompanied by a " +"loud, incessant buzzing sound." msgstr "" #: lang/json/MONSTER_from_json.py -msgid "giant worm" +msgid "giant mosquito" msgstr "" -#. ~ Description for giant worm +#. ~ Description for giant mosquito #: lang/json/MONSTER_from_json.py msgid "" -"An enormous, mutated creature that might once have been a nightcrawler. It " -"possesses a large fanged mouth and a long slender body that comes up to your " -"shoulder, with even more surely hiding underground." +"An enormous mutant mosquito, fluttering erratically. Its face is dominated " +"by a long, spear-tipped proboscis." msgstr "" #: lang/json/MONSTER_from_json.py -msgid "yugg" +msgid "giant cellar spider" msgstr "" -#. ~ Description for yugg +#. ~ Description for giant cellar spider #: lang/json/MONSTER_from_json.py msgid "" -"This is a huge, slimy worm-like creature. Its pale, flattened head drips an " -"oily mucus as it breaches the ground, searching for prey. Its pinkish mouth " -"opens and closes, revealing long fangs glistening with ropey strands of " -"saliva, which leave smoldering stains wherever they drip. The mere sight of " -"its putrid whitish visage is enough to loose prehistoric terrors within the " -"darkest recesses of your mind." +"A twitchy mutant brown spider, with a relatively small body and spindly long " +"legs. Its smaller brethren are known for being agile, and for preying upon " +"other spiders." msgstr "" #: lang/json/MONSTER_from_json.py -msgid "grim howler" +msgid "immature giant cellar spider" msgstr "" -#. ~ Description for grim howler +#. ~ Description for immature giant cellar spider #: lang/json/MONSTER_from_json.py msgid "" -"A zombified wolf. Its mouth oozes with a black substance, coating the " -"vicious-looking white fangs." +"A newly-hatched giant cellar spider. Too small to possess much venom, but " +"still quick and agile like an adult." msgstr "" #: lang/json/MONSTER_from_json.py -msgid "zombear" +msgid "giant jumping spider" msgstr "" -#. ~ Description for zombear +#. ~ Description for giant jumping spider #: lang/json/MONSTER_from_json.py msgid "" -"This black bear's eyes ooze with dark, oily fluid, and its flesh is torn and " -"scarred. It shuffles as it walks." +"A giant spider with big forelegs and two pairs of inquisitive-looking eyes. " +"It can leap quite quickly, even into the treetops." msgstr "" -#: lang/json/MONSTER_from_json.py lang/json/snippet_from_json.py -msgid "zombie" +#: lang/json/MONSTER_from_json.py +msgid "giant trapdoor spider" msgstr "" -#. ~ Description for zombie +#. ~ Description for giant trapdoor spider #: lang/json/MONSTER_from_json.py msgid "" -"A human body, swaying as it moves, an unstoppable rage visible in its oily " -"black eyes." +"A gigantic spider with a bulbous thorax. It digs a deep underground burrow " +"that serves as a pit to trap unwary prey." msgstr "" #: lang/json/MONSTER_from_json.py -msgid "acidic zombie" +msgid "giant web spider" msgstr "" -#. ~ Description for acidic zombie +#. ~ Description for giant web spider #: lang/json/MONSTER_from_json.py msgid "" -"A sickly-looking dead one. Its skin looks especially thin, with a sticky, " -"yellow fluid flowing through the clearly visible veins." +"A giant mutated grass spider, it waits for prey to become ensnared in the " +"vast webs that it weaves between the trees." msgstr "" #: lang/json/MONSTER_from_json.py -msgid "slavering biter" +msgid "immature giant web spider" msgstr "" -#. ~ Description for slavering biter +#. ~ Description for immature giant web spider #: lang/json/MONSTER_from_json.py msgid "" -"A distorted and swollen human body. Its jaws have elongated into a " -"crocodile like snout, dripping with foul smelling saliva." +"A still immature giant grass spider. Too young to be venomous, or to walk " +"proficiently for that matter" msgstr "" #: lang/json/MONSTER_from_json.py -msgid "brainless zombie" +msgid "giant black widow" msgstr "" -#. ~ Description for brainless zombie +#. ~ Description for giant black widow #: lang/json/MONSTER_from_json.py msgid "" -"A zombie like any other, except that its features and skull have been " -"devastated. It's unclear what caused the damage, but between the scraps of " -"flesh you can see that its face and brain are gone, though its ears are " -"intact." +"A giant mutated black widow spider. A highly venomous nightmare come to " +"life." msgstr "" #: lang/json/MONSTER_from_json.py -msgid "zombie brute" +msgid "giant black widow spiderling" msgstr "" -#. ~ Description for zombie brute +#. ~ Description for giant black widow spiderling #: lang/json/MONSTER_from_json.py msgid "" -"Its entire body bulges with distended muscles and swollen, festering wounds." +"The horrid spawn of a giant black widow spider. Even as a newborn, this " +"foul creature knows only how to kill." msgstr "" #: lang/json/MONSTER_from_json.py -msgid "zombie wrestler" +msgid "giant wolf spider" msgstr "" -#. ~ Description for zombie wrestler +#. ~ Description for giant wolf spider #: lang/json/MONSTER_from_json.py msgid "" -"A slab of festering muscle the size of a well-toned bodybuilder. Seems " -"eager to strangle the life from you." +"A wolf spider mutated to about thirty times its normal size, it moves " +"quickly and aggressively to catch and consume prey." msgstr "" #: lang/json/MONSTER_from_json.py -msgid "zombie nightstalker" +msgid "giant wasp" msgstr "" -#. ~ Description for zombie nightstalker +#. ~ Description for giant wasp #: lang/json/MONSTER_from_json.py msgid "" -"Somehow this brute hides in the dark like some kind of boogeyman. Very " -"agile for such a large zombie." +"A gigantic slender-bodied wasp with an evil-looking stinger protruding from " +"its abdomen. Its exoskeleton glowers with ominous red markings." msgstr "" #: lang/json/MONSTER_from_json.py -msgid "shocker brute" +msgid "dermatik" msgstr "" -#. ~ Description for shocker brute +#. ~ Description for dermatik #: lang/json/MONSTER_from_json.py msgid "" -"A huge beast covered in visible scarring from what you can only guess was " -"'research'. Being near it, you can hear a slight humming, like that of an " -"electrical transformer." +"A mutated wasp nearly the size of a cat, with a barbed ovipositor extruding " +"from the abdomen." msgstr "" #: lang/json/MONSTER_from_json.py -msgid "incandescent husk" +msgid "dermatik larva" msgstr "" -#. ~ Description for incandescent husk +#. ~ Description for dermatik larva #: lang/json/MONSTER_from_json.py msgid "" -"This once-human is visible only as a glowing white silhouette that you have " -"to squint to see, cloaked in a crackling field of lightning that pulses like " -"a beating heart. It walks slowly and deliberately, the thunderstorm " -"surrounding it eagerly jumping to anything conductive within its grasp." +"A fat white grub as big as a squirrel, with a pair of large, spadelike " +"mandibles." msgstr "" #: lang/json/MONSTER_from_json.py -msgid "zombie cop" +msgid "giant ant" msgstr "" -#. ~ Description for zombie cop +#. ~ Description for giant ant #: lang/json/MONSTER_from_json.py msgid "" -"A human body covered by a weather-beaten and badly damaged set of riot gear." +"An enormous red ant covered in chitinous plates. It possesses a pair of " +"wriggling antennae and vicious-looking mandibles." msgstr "" #: lang/json/MONSTER_from_json.py -msgid "corrosive zombie" +msgid "giant acidic ant" msgstr "" -#. ~ Description for corrosive zombie +#. ~ Description for giant acidic ant #: lang/json/MONSTER_from_json.py msgid "" -"This body has swollen to immense proportions, but still manages to hold " -"itself together with semi-congealed acid all over its bloated body. It " -"clumsily moves around, but attacks with a large reserve of acid." -msgstr "" - -#: lang/json/MONSTER_from_json.py -msgid "The corrosive zombie spits a glob of acid!" +"A monstrous brown ant with a swollen abdomen, that ends with a small orifice " +"at the tip. Glistening liquid seems to drip out periodically." msgstr "" #: lang/json/MONSTER_from_json.py -msgid "crawling zombie" +msgid "acidic ant larva" msgstr "" -#. ~ Description for crawling zombie +#. ~ Description for acidic ant larva #: lang/json/MONSTER_from_json.py msgid "" -"This human corpse drags itself along slowly with its arms. Its legs are " -"damaged beyond repair." +"A squirming yellow grub that seems to be oozing liquid from both ends of its " +"body. It appears its chitin hasn't developed enough to resist acid." msgstr "" #: lang/json/MONSTER_from_json.py -msgid "zombie dancer" +msgid "acidic queen ant" msgstr "" -#. ~ Description for zombie dancer +#. ~ Description for acidic queen ant #: lang/json/MONSTER_from_json.py msgid "" -"The foulest stench is in the air, \n" -"The funk of forty thousand years, \n" -"And grisly ghouls from every tomb, \n" -"Are closing in to seal your doom!\n" -"\n" -"The dancer doesn't even notice you, it seems like something nearby is " -"controlling it." +"An enormous brown ant with an elongated, pulsating abdomen. Its orifice " +"seems developed only for egg-laying rather than spraying acid like the rest " +"of the colony, but it doesn't seem affected by the acrid liquid either." msgstr "" #: lang/json/MONSTER_from_json.py -msgid "zombie dog" +msgid "acidic soldier ant" msgstr "" -#. ~ Description for zombie dog +#. ~ Description for acidic soldier ant #: lang/json/MONSTER_from_json.py msgid "" -"The deformed, animated corpse of a canine, a sinewy beast which can easily " -"outpace its two-legged friends." +"A massive woolly brown ant that towers over the worker ants with a giant " +"head crest. Along with its huge mandibles, a corrosive liquid seeps from " +"the end of its bloated abdomen." msgstr "" #: lang/json/MONSTER_from_json.py -msgid "listener zombie" +msgid "fungal ant" msgstr "" -#. ~ Description for listener zombie +#. ~ Description for fungal ant #: lang/json/MONSTER_from_json.py msgid "" -"The head of this zombie was once obviously destroyed, the gaps in its scraps " -"of face now filling with a peculiar gray goo. Human ears hang from the " -"sides, enormous and unsettling. Thin slits at the front suggest it may be " -"able to see." +"Pale, sickly gray in color, this giant ant's cracked exoskeleton is barely " +"held together by coils of fungus erupting from every joint in its body." msgstr "" #: lang/json/MONSTER_from_json.py -msgid "shocker zombie" +msgid "ant larva" msgstr "" -#. ~ Description for shocker zombie +#. ~ Description for ant larva #: lang/json/MONSTER_from_json.py -msgid "A human body with pale blue flesh, crackling with electrical energy." +msgid "" +"A pulsating sausage of glistening white flesh, the size of a large cat. On " +"one end is a set of squirming mouth parts." msgstr "" #: lang/json/MONSTER_from_json.py -msgid "fat zombie" +msgid "queen ant" msgstr "" -#. ~ Description for fat zombie +#. ~ Description for queen ant #: lang/json/MONSTER_from_json.py msgid "" -"Stumbling as it moves, this corpse of an overweight human regards its " -"surroundings with an empty black gaze." +"A colossal red ant with a bulging, bloated thorax. It moves slowly and " +"deliberately, tending to nearby eggs and continually laying more." msgstr "" #: lang/json/MONSTER_from_json.py -msgid "fiend" +msgid "soldier ant" msgstr "" -#. ~ Description for fiend +#. ~ Description for soldier ant #: lang/json/MONSTER_from_json.py msgid "" -"Charred zombie with bony plates, spikes and protrusions. Moves stiffly, but " -"swiftly." +"A huge and hairy red ant almost twice the size of other giant ants. Bulging " +"pincers extend from its jaws." msgstr "" #: lang/json/MONSTER_from_json.py -msgid "firefighter zombie" +msgid "giant locust" msgstr "" -#. ~ Description for firefighter zombie +#. ~ Description for giant locust #: lang/json/MONSTER_from_json.py msgid "" -"A decaying human body clad in tattered firefighting gear. It staggers " -"aimlessly, reeking of smoke and decay." +"An overgrown locust. You don't think it'll eat you but it could cause " +"massive damage to nearby plants." msgstr "" #: lang/json/MONSTER_from_json.py -msgid "fungal zombie" +msgid "locust nymph" msgstr "" -#. ~ Description for fungal zombie +#. ~ Description for locust nymph #: lang/json/MONSTER_from_json.py msgid "" -"Once human, fungal tendrils now sprout from its mouth, eyes, and other " -"orifices, holding together a shambling mass of mold-covered flesh." +"A locust the size of a rabbit. You'd hate to think what a swarm of these " +"could do." msgstr "" #: lang/json/MONSTER_from_json.py -msgid "bloated zombie" +msgid "black bear cub" msgstr "" -#. ~ Description for bloated zombie +#. ~ Description for black bear cub #: lang/json/MONSTER_from_json.py msgid "" -"With its gray skin swollen to near rupture with putrid gas, this cyst " -"covered zombie looks like it could violently burst under the slightest of " -"disturbances." +"A juvenile American black bear. This one isn't much of a threat, but be " +"wary of its parent; black bears are known for their protectiveness." msgstr "" #: lang/json/MONSTER_from_json.py -msgid "grabber zombie" +msgid "black bear" msgstr "" -#. ~ Description for grabber zombie +#. ~ Description for black bear #: lang/json/MONSTER_from_json.py msgid "" -"A deformed human body, once living. Its arms dangle from its sides like the " -"limbs of some skinless ape, mindlessly groping at their surroundings." +"The American black bear. A large omnivorous scavenger, it has powerful " +"claws and jaws, and is an effective ambush hunter. Most individuals are shy " +"around humans, but they're fiercely protective of their cubs." msgstr "" #: lang/json/MONSTER_from_json.py -msgid "grappler zombie" +msgid "beaver" msgstr "" -#. ~ Description for grappler zombie +#. ~ Description for beaver #: lang/json/MONSTER_from_json.py msgid "" -"An undead humanoid, its elongated arms drag along the ground as it moves. " -"It looks to almost have a hunch from the swollen back and shoulder muscles " -"tearing though its skin." +"The North American beaver, the continent's largest rodent. Its paddle-" +"shaped tail helps ferry it through the water, and its prominent teeth can " +"chew through wood, which it uses to build dam-like nests in lakes and " +"streams." msgstr "" #: lang/json/MONSTER_from_json.py -msgid "hazmat zombie" +msgid "black rat" msgstr "" -#. ~ Description for hazmat zombie +#. ~ Description for black rat #: lang/json/MONSTER_from_json.py msgid "" -"This zombie's face and body is completely covered by a protective suit. It " -"wanders around, unsteadily." +"The black rat, an omnivorous rodent with sheer black fur and a long, rough " +"tail. Harbinger of pestilence, famine, and mange, it will sometimes swarm " +"over the dead or dying." msgstr "" #: lang/json/MONSTER_from_json.py -msgid "zombie hollow" +msgid "bobcat" msgstr "" -#. ~ Description for zombie hollow +#. ~ Description for bobcat #: lang/json/MONSTER_from_json.py msgid "" -"Black hollow eyes survey the surroundings as the zombie stretches and bends " -"in ways that whoever the original body belonged to never could. The only " -"thing that seems solid, on this flexible black-veined body, is the rows of " -"sharp black teeth. You get the feeling that the only human thing remaining " -"is the skin, worn as one would wear clothes." +"A spotted wild cat living across much of North America. It is not a serious " +"threat to humans, but it can be aggressive when threatened." msgstr "" #: lang/json/MONSTER_from_json.py -msgid "zombie hulk" +msgid "cat" msgstr "" -#. ~ Description for zombie hulk +#. ~ Description for cat #: lang/json/MONSTER_from_json.py msgid "" -"A human body now swollen to the size of six men, with arms as wide as a " -"trash can." +"A small domesticated predator gone feral in the absence of human " +"stewardship. Harried by the elements and the rigors of survival, it is " +"scruffy and skittish." msgstr "" #: lang/json/MONSTER_from_json.py -msgid "feral hunter" +msgid "chipmunk" msgstr "" -#. ~ Description for feral hunter +#. ~ Description for chipmunk #: lang/json/MONSTER_from_json.py msgid "" -"This once-human body is barely recognizable, scrambling about on all fours, " -"its nails and teeth both sharpened into dangerous looking spikes." +"The eastern chipmunk, a tiny omnivorous rodent with a characteristic striped " +"coat. It spends much of the day patrolling its elaborate burrow and the " +"precious stores of foraged food within." msgstr "" #: lang/json/MONSTER_from_json.py -msgid "Thriller" +msgid "cougar" msgstr "" -#. ~ Description for Thriller +#. ~ Description for cougar #: lang/json/MONSTER_from_json.py msgid "" -"And though you fight to stay alive, \n" -"Your body starts to shiver. \n" -"For no mere mortal can resist, \n" -"The evil of the thriller." +"The Eastern cougar, a large feline predator. Once thought extinct in this " +"region, conservation efforts were successful in restoring a thriving " +"population. Fast and silent, this predator can cover long distances with " +"powerful leaps and pounces, catching its prey with its deadly claws before " +"delivering the finishing blow with its enormous fangs." msgstr "" #: lang/json/MONSTER_from_json.py -msgid "zombie snapper" +msgid "calf" msgstr "" -#. ~ Description for zombie snapper +#. ~ Description for calf +#. ~ Description for cow #: lang/json/MONSTER_from_json.py msgid "" -"With a crocodile-like snout and rows of protruding teeth, this swimwear-clad " -"zombie lurks in the water." +"The domestic cow, a baleful, ruminating farm animal. It is quite muscular, " +"and the males can have a violent streak to accompany their nasty-looking " +"horns." msgstr "" #: lang/json/MONSTER_from_json.py -msgid "zombie master" +msgid "cow" msgstr "" -#. ~ Description for zombie master #: lang/json/MONSTER_from_json.py -msgid "" -"Once human, its features have tightened, its lips pulled back into an " -"unnatural grin, revealing rows of blackened teeth beneath its large, " -"piercing eyes. It stands tall and its movements are fluid and tightly " -"controlled. A feeling of danger permeates the air around it, and the light " -"that falls on it seems somehow harsher and more glaring." +msgid "coyote" msgstr "" +#. ~ Description for coyote #: lang/json/MONSTER_from_json.py -msgid "zombie necromancer" +msgid "" +"The Eastern coyote, also called the tweed wolf, is a territorial canine " +"descended from the offspring of gray wolves and true coyotes. It is " +"intimidated by humans and other predators, but it will still fight if " +"threatened, and the Cataclysm has made it more fearless than usual." msgstr "" -#. ~ Description for zombie necromancer +#. ~ Description for coyote #: lang/json/MONSTER_from_json.py msgid "" -"A twisted mockery of the human form, emaciated, with jet black skin and " -"glowing red eyes. It is somehow painful to look at, awakening fears deep " -"within your psyche, and even the air around it seems more sinister, somehow " -"darker and more dangerous." +"The Northeastern coyote, a widespread canine pack hunter. More timid than a " +"wolf, it is an opportunistic feeder and prefers to hunt smaller and weaker " +"prey, but is typically timid around humans." msgstr "" #: lang/json/MONSTER_from_json.py -msgid "festering boar" +msgid "fawn" msgstr "" -#. ~ Description for festering boar +#. ~ Description for fawn #: lang/json/MONSTER_from_json.py msgid "" -"A zombified omnivore descended from the wild boar. Now it's got black goo " -"all over it, instead of mud." +"A juvenile northern woodland white-tailed deer, a quick and strong grazing " +"animal. Favored prey of coyotes, wolves, and giant spider mutants." msgstr "" #: lang/json/MONSTER_from_json.py -msgid "feral predator" +msgid "deer" msgstr "" -#. ~ Description for feral predator +#. ~ Description for deer #: lang/json/MONSTER_from_json.py msgid "" -"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." +"The northern woodland white-tailed deer, a quick and strong grazing animal. " +"Favored prey of coyotes, wolves, and giant spider mutants." msgstr "" #: lang/json/MONSTER_from_json.py -msgid "decayed zombie" +msgid "Labrador mutt" msgstr "" -#. ~ Description for decayed zombie +#. ~ Description for Labrador mutt #: lang/json/MONSTER_from_json.py msgid "" -"A once-dead human corpse. Its discolored swollen flesh is riddled with " -"festering wounds and open sores." +"This once-average Labrador mixed breed dog has clearly gone feral. Though " +"it likely still instinctually trusts humans, it's probably far from domestic " +"by now." msgstr "" #: lang/json/MONSTER_from_json.py -msgid "feral runner" +msgid "Labrador puppy" msgstr "" -#. ~ Description for feral runner +#. ~ Description for Labrador puppy #: lang/json/MONSTER_from_json.py msgid "" -"This recently-risen body moves quickly, darting its head back and forth and " -"gnawing at its hands." +"An adorable, defenseless Labrador puppy. Much safer to tame than an adult " +"dog." msgstr "" #: lang/json/MONSTER_from_json.py -msgid "scorched zombie" +msgid "bulldog" msgstr "" -#. ~ Description for scorched zombie +#. ~ Description for bulldog #: lang/json/MONSTER_from_json.py msgid "" -"Heavily burned zombie that still reeks of charred flesh. Its flesh has " -"mended into a leathery shell." +"The American bulldog is a hardy, well built dog, that seems suited for " +"surviving the apocalypse." msgstr "" #: lang/json/MONSTER_from_json.py -msgid "screecher zombie" +msgid "bulldog puppy" msgstr "" -#. ~ Description for screecher zombie +#. ~ Description for bulldog puppy #: lang/json/MONSTER_from_json.py msgid "" -"A thin corpse, its chest is swollen in what appears to be preparation. A " -"thick black ooze drips from its open mouth." +"An adorable, defenseless American bulldog puppy. Much safer to tame than an " +"adult dog." msgstr "" #: lang/json/MONSTER_from_json.py -msgid "shady zombie" +msgid "pit bull mix" msgstr "" -#. ~ Description for shady zombie +#. ~ Description for pit bull mix #: 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 its shambling, human shaped " -"outline." +"The oft-misunderstood pit bull is not actually a single breed but a label " +"for several kinds of terriers. It has average abilities, and is well-known " +"for its 'lock jaw' - which isn't real, but their incredible determination is." msgstr "" #: lang/json/MONSTER_from_json.py -msgid "shrieker zombie" +msgid "pit bull puppy" msgstr "" -#. ~ Description for shrieker zombie +#. ~ Description for pit bull puppy #: lang/json/MONSTER_from_json.py msgid "" -"An elongated human body with a swollen chest and a gaping hole where its jaw " -"used to be." +"An adorable, defenseless pit bull puppy. Much safer to tame than an adult " +"dog." msgstr "" #: lang/json/MONSTER_from_json.py -msgid "skull zombie" +msgid "beagle" msgstr "" -#. ~ Description for skull zombie +#. ~ Description for beagle #: lang/json/MONSTER_from_json.py msgid "" -"This creature's head is a hideous gray skull, formed of human bone fragments " -"and some sort of goo. Jagged teeth are visible as the thing works its jaw " -"and disturbingly human, lidless eyes stare at you from their sockets. The " -"thing's fleshy ears are four sizes too large and droop under their own " -"weight." +"An adorable beagle that has managed to survive the apocalypse. Being agile " +"and small, they are difficult to shoot at. Generally attacks in packs." msgstr "" #: lang/json/MONSTER_from_json.py -msgid "smoker zombie" +msgid "beagle puppy" msgstr "" -#. ~ Description for smoker zombie +#. ~ Description for beagle puppy #: lang/json/MONSTER_from_json.py msgid "" -"A blackened and twisted naked human body, strips of flesh hang from its " -"body, and it emits a constant haze of thick black smoke." +"An adorable, defenseless beagle puppy. Much safer to tame than an adult dog." msgstr "" #: lang/json/MONSTER_from_json.py -msgid "spitter zombie" +msgid "border collie" msgstr "" -#. ~ Description for spitter zombie +#. ~ Description for border collie #: lang/json/MONSTER_from_json.py msgid "" -"A hunched human body with its eyes pushed up into its forehead and drooping " -"cheeks, most of its face is occupied by a puckered mouth. Its stomach is " -"swollen and nearly translucent, with a sickly yellow tint." +"An athletic and hyperactive dog that loves to herd animals and jump, the " +"Border Collie is an agile attacker. Although they can be easy to train, " +"they don't work well in packs." msgstr "" #: lang/json/MONSTER_from_json.py -msgid "survivor zombie" +msgid "border collie puppy" msgstr "" -#. ~ Description for survivor zombie +#. ~ Description for border collie puppy #: lang/json/MONSTER_from_json.py msgid "" -"Still wearing the tattered remnants of improvised armor and weaponry, it is " -"plain to see that this zombie was once a survivor like you." +"An adorable, defenseless Border Collie puppy. Much safer to tame than an " +"adult dog." msgstr "" #: lang/json/MONSTER_from_json.py -msgid "swimmer zombie" +msgid "boxer mastiff" msgstr "" -#. ~ Description for swimmer zombie +#. ~ Description for boxer mastiff #: lang/json/MONSTER_from_json.py msgid "" -"A slick and glistening human body. Its hands and feet are webbed, and it is " -"clad in swimwear." +"An ordinary breed full of affection, the boxer mastiff doesn't otherwise " +"stand out amongst other dogs with its capabilities." msgstr "" #: lang/json/MONSTER_from_json.py -msgid "zombie technician" +msgid "boxer puppy" msgstr "" -#. ~ Description for zombie technician +#. ~ Description for boxer puppy #: lang/json/MONSTER_from_json.py msgid "" -"Still wearing its work clothes and hardhat, this zombie likely used to work " -"on power lines or other electrical equipment." +"An adorable, defenseless boxer puppy. Much safer to tame than an adult dog." msgstr "" #: lang/json/MONSTER_from_json.py -msgid "thorny shambler" +msgid "Chihuahua" msgstr "" -#. ~ Description for thorny shambler +#. ~ Description for Chihuahua #: lang/json/MONSTER_from_json.py msgid "" -"A shambling undead humanoid, body overgrown with a tangled mass of " -"otherworldly vegetation. Hunched over and dragging its feet as it moves, " -"the bramble utterly enveloping its upper half twitches and moves with a life " -"of its own, tendrils tipped with a paralytic sting." +"It's a tiny Chihuahua. How it has managed to survive is a miracle, although " +"its small size and aggressive nature may have proven useful." msgstr "" #: lang/json/MONSTER_from_json.py -msgid "tough zombie" +msgid "Chihuahua puppy" msgstr "" -#. ~ Description for tough zombie +#. ~ Description for Chihuahua puppy #: lang/json/MONSTER_from_json.py msgid "" -"Once an athletic human, now a brutal monster. Its facial features are " -"twisted into an expression of pure rage." +"An adorable, defenseless Chihuahua puppy. Much safer to tame than an adult " +"dog." msgstr "" #: lang/json/MONSTER_from_json.py -msgid "zombeaver" +msgid "dachshund" msgstr "" -#. ~ Description for zombeaver +#. ~ Description for dachshund #: lang/json/MONSTER_from_json.py msgid "" -"This wall-eyed beast has a large wound on its side, and ribs with some flesh " -"on them are seen through it. The most prominent feature of this abomination " -"is large incisors in its ominously open mouth, strange black goo is oozing " -"out of it. Seems like it isn't interested in trees anymore and is looking " -"for some warm fresh to feed." +"A wiener dog! This awkward looking dog can be a useful watchdog, plus it " +"looks adorable as it bumbles around. Its tiny size also makes it hard to " +"shoot (you monster)." msgstr "" #: lang/json/MONSTER_from_json.py -msgid "antlered horror" +msgid "dachshund puppy" msgstr "" -#. ~ Description for antlered horror +#. ~ Description for dachshund puppy #: lang/json/MONSTER_from_json.py msgid "" -"This formerly-majestic moose has succumbed to the infection which is killing " -"the world. Shiny green blowflies swarm the vast suppurated patches of " -"purulent flesh where its skin has sloughed away, and its remaining fur is " -"black and matted with necrotic discharge." +"An adorable, defenseless dachshund puppy. Much safer to tame than an adult " +"dog." msgstr "" #: lang/json/MONSTER_from_json.py -msgid "decayed pouncer" +msgid "German shepherd" msgstr "" -#. ~ Description for decayed pouncer +#. ~ Description for German shepherd #: lang/json/MONSTER_from_json.py msgid "" -"An otherwise normal-looking cougar, except that its hind legs are swollen, " -"and its eyes bulge with black goo." +"The original K-9 breed. An easy to train and great attack dog that will " +"also defend its owner to the death, however they don't work well in packs." msgstr "" #: lang/json/MONSTER_from_json.py -msgid "skeletal juggernaut" +msgid "German shepherd puppy" msgstr "" -#. ~ Description for skeletal juggernaut +#. ~ Description for German shepherd puppy #: lang/json/MONSTER_from_json.py msgid "" -"This hideous golem of plated bones and misshapen flesh drags its heavy, " -"pointed limbs behind it like an unwanted burden. Formerly soft and " -"vulnerable, bones grew around its form to protect it - only, they kept " -"growing. And growing. And growing." +"An adorable, defenseless German shepherd puppy. Much safer to tame than an " +"adult dog." msgstr "" #: lang/json/MONSTER_from_json.py -msgid "ancient red dragon" +msgid "Great Pyrenees" msgstr "" -#. ~ Description for ancient red dragon +#. ~ Description for Great Pyrenees #: lang/json/MONSTER_from_json.py msgid "" -"A towering, hulking dragon, with tremendous, curving horns and shining red " -"scales, its glowing maw peeled back in a hateful grimace as its eyes bore " -"into yours." +"A large and powerful breed, the Great Pyrenees has a beautiful, thick white " +"coat. Originally bred to deter wolves and other predators, now faced with " +"protecting livestock from shambling hordes of undead." msgstr "" #: lang/json/MONSTER_from_json.py -msgid "chicken" +msgid "Great Pyrenees puppy" msgstr "" -#. ~ Description for chicken +#. ~ Description for Great Pyrenees puppy #: lang/json/MONSTER_from_json.py msgid "" -"A domesticated descendant of junglefowl, it may still be the most numerous " -"bird in the world. Before the Cataclysm, it was raised by humans as a " -"source of meat, eggs, and early morning wakeup calls." +"An adorable, defenseless Great Pyrenees puppy. Much safer to tame than an " +"adult dog." msgstr "" #: lang/json/MONSTER_from_json.py -msgid "grouse" +msgid "rottweiler" msgstr "" -#. ~ Description for grouse +#. ~ Description for rottweiler #: lang/json/MONSTER_from_json.py msgid "" -"A very common game bird, these creatures remind you of what a wild chicken " -"must have been like." +"A terrifying breed to face feral, Rottweilers are descended from Roman " +"legion mastiffs. It's robust, vicious, and quite capable of mauling a human " +"to death." msgstr "" #: lang/json/MONSTER_from_json.py -msgid "crow" +msgid "rottweiler puppy" msgstr "" -#. ~ Description for crow +#. ~ Description for rottweiler puppy #: lang/json/MONSTER_from_json.py msgid "" -"A small, elegant black bird, famous for its distinctive call. An " -"intelligent bird, there is a glitter of mischief behind its eyes." +"An adorable, defenseless Rottweiler puppy. Much safer to tame than an adult " +"dog." msgstr "" #: lang/json/MONSTER_from_json.py -msgid "duck" +msgid "cattle dog" msgstr "" -#. ~ Description for duck +#. ~ Description for cattle dog #: lang/json/MONSTER_from_json.py msgid "" -"A mallard duck, often seen around rivers and other bodies of water. It " -"feeds primarily on insects, seeds, roots, and, pre-cataclysm, bread scraps." +"An agile and sturdy breed that is welcome on any farm, the Australian cattle " +"dog is adept at leaping fences and herding livestock." msgstr "" #: lang/json/MONSTER_from_json.py -msgid "goose" +msgid "cattle dog puppy" msgstr "" -#. ~ Description for goose +#. ~ Description for cattle dog puppy #: lang/json/MONSTER_from_json.py -msgid "A Canadian goose, a common waterfowl that regrets leaving Canada." +msgid "" +"An adorable, defenseless Australian cattle dog puppy. Much safer to tame " +"than an adult dog." msgstr "" #: lang/json/MONSTER_from_json.py -msgid "turkey" -msgstr "" +msgid "fox" +msgid_plural "foxes" +msgstr[0] "" +msgstr[1] "" -#. ~ Description for turkey +#. ~ Description for fox #: lang/json/MONSTER_from_json.py msgid "" -"A large and colorful game bird native to the forests of North America. Its " -"head and beak are covered in fleshy protuberances." -msgstr "" - -#: lang/json/MONSTER_from_json.py -msgid "pheasant" +"A small omnivorous canine with an almost cat-like manner. It is a solitary " +"hunter, and one of the only canids able to climb trees." msgstr "" -#. ~ Description for pheasant +#. ~ Description for fox #: lang/json/MONSTER_from_json.py msgid "" -"A medium sized game bird that can have bright feathers depending on the sex " -"and species." +"The red fox, an omnivorous canine and largest of the true foxes, it is a " +"wily hunter with a combative, suspicious temperament." msgstr "" #: lang/json/MONSTER_from_json.py -msgid "cockatrice" +msgid "groundhog" msgstr "" -#. ~ Description for cockatrice +#. ~ Description for groundhog #: lang/json/MONSTER_from_json.py msgid "" -"This strange mutant bird gains its name from its odd appearance. Although " -"its features seem to be becoming more reptilian, it doesn't appear dangerous." +"Also known as the woodchuck, this ground squirrel has no actual talent for " +"chucking wood." msgstr "" #: lang/json/MONSTER_from_json.py -msgid "yellow chick" +msgid "jackrabbit" msgstr "" -#. ~ Description for yellow chick +#. ~ Description for jackrabbit #: lang/json/MONSTER_from_json.py msgid "" -"A tiny yellow and brown chick, it could be from a number of different " -"species." -msgstr "" - -#: lang/json/MONSTER_from_json.py -msgid "brown chick" +"The snowshoe hare, a small grass-eater with a brown fur coat that changes to " +"white in the wintertime." msgstr "" #: lang/json/MONSTER_from_json.py -msgid "strange chick" +msgid "horse" msgstr "" -#. ~ Description for strange chick +#. ~ Description for horse #: lang/json/MONSTER_from_json.py -msgid "A strange tiny chick, it could be from a number of different species." +msgid "" +"A hooved grazing mammal with a mane of hair, a sweeping tail, and powerful-" +"looking muscles." msgstr "" #: lang/json/MONSTER_from_json.py -msgid "waterfowl chick" +msgid "lemming" msgstr "" -#. ~ Description for waterfowl chick +#. ~ Description for lemming #: lang/json/MONSTER_from_json.py msgid "" -"A tiny yellow and brown waterfowl chick, it could be from a number of " -"different species." +"The Northern bog lemming, a small, predominantly vegetarian rodent that " +"spends its life in the murk of swamps and other wetlands. Contrary to " +"popular belief, these creatures are not particularly hapless or suicidal, " +"but they can eat themselves into scarcity within a few generations." msgstr "" #: lang/json/MONSTER_from_json.py -msgid "security bot" +msgid "mink" msgstr "" -#. ~ Description for security bot +#. ~ Description for mink #: lang/json/MONSTER_from_json.py msgid "" -"The Northrop Watchman X-1 is a production series of heavily armored combat " -"robots. Initially designed for military patrol and escort service, it rolls " -"on a set of hydraulic treads and is armed with a 9x19mm SMG." +"The American mink, a partially aquatic weasel, once factory-farmed for its " +"fur. It is a capable fisher, but the presence of otters in these parts " +"makes it rely more on food from the land." msgstr "" #: lang/json/MONSTER_from_json.py -msgid "turret" +msgid "moose" msgstr "" -#. ~ Description for turret +#. ~ Description for moose #: lang/json/MONSTER_from_json.py msgid "" -"The General Atomics TX-1 Guardian, a small, pill-shaped automated gun turret " -"using state of the art ATR systems to dynamically reorient itself to new " -"friends and enemies alike. The two SMG barrels can swivel a full 360 " -"degrees." +"The Eastern moose, the largest living species of deer. While they aren't " +"aggressive unless angered, the mating season can make the bulls quite ill-" +"tempered." msgstr "" #: lang/json/MONSTER_from_json.py -msgid "skitterbot" +msgid "muskrat" msgstr "" -#. ~ Description for skitterbot +#. ~ Description for muskrat #: lang/json/MONSTER_from_json.py msgid "" -"A insectoid robot the size of a small dog, designed for home security. " -"Armed with two close-range tazers, it can skate across the ground with great " -"speed." +"A large omnivorous rodent with a thick furry pelt, found in wetlands across " +"the northern hemisphere. It marks its territory with a musky odor for which " +"it is named." msgstr "" #: lang/json/MONSTER_from_json.py -msgid "experimental lab bot" +msgid "gigantic naked mole-rat" msgstr "" -#. ~ Description for experimental lab bot +#. ~ Description for gigantic naked mole-rat #: lang/json/MONSTER_from_json.py msgid "" -"This robot looks like a large metal spider, a bit bigger than a person, with " -"its thorax covered in tiny holes. An ominous buzzing emanates from it." +"A huge, rumbling mutated mass of wrinkly, nearly translucent skin that has " +"been toughened by constant tunneling. Its hide is riddled with giant scabs, " +"as a pair of incisors the size of an industrial excavator's buckets gnash " +"constantly and several car-length whiskers twitch in the air. It regularly " +"makes high-pitched chirps as it roams around." msgstr "" #: lang/json/MONSTER_from_json.py -msgid "prototype robot" +msgid "opossum" msgstr "" -#. ~ Description for prototype robot +#. ~ Description for opossum #: lang/json/MONSTER_from_json.py msgid "" -"The single glowing eye of this robot surveys the landscape periodically, as " -"it performs the endless slaughter dictated by a misinterpreted and cruel " -"routine. Between half-built plates, you can see the machinery and cables " -"that animate it, and yet it moves deftly as it switches between one target " -"and the next." +"The Virginia opossum, a small omnivorous marsupial native to North America. " +"About the size of a cat, it is hardy and adaptive, and a fairly common sight " +"in urban areas." msgstr "" #: lang/json/MONSTER_from_json.py -msgid "NR-031 Dispatch" +msgid "otter" msgstr "" -#. ~ Description for NR-031 Dispatch +#. ~ Description for otter #: lang/json/MONSTER_from_json.py msgid "" -"The Northrop Dispatch, designed for crowd control situations, carries and " -"deploys kamikaze drones of various types, with a small onboard EMP emitter " -"frying them in the event of its destruction. The bright green-and-yellow " -"paint marks a low-force variant - *comparatively* low-force, anyways - " -"typically deployed as guards after an area has been cleared." +"The North American river otter is a shy water dwelling relative of the " +"weasel, living in large families along the banks of streams. It is an " +"excellent fisher and a resourceful survivor, using the abandoned dens of " +"beavers and other animals to raise its own young." msgstr "" #: lang/json/MONSTER_from_json.py -msgid "NR-V05-M Dispatch" +msgid "piglet" msgstr "" -#. ~ Description for NR-V05-M Dispatch +#. ~ Description for piglet +#. ~ Description for pig #: lang/json/MONSTER_from_json.py msgid "" -"The Northrop Dispatch, designed for crowd control situations, carries and " -"deployes kamikaze drones of various types, with a small onboard EMP emitter " -"frying them in the event of its destruction. The dark green paint job marks " -"the lethal and feared military variant, carrying extreme and deadly " -"firepower." +"A domesticated omnivore descended from the wild boar, intelligent and " +"inquisitive. Left to its own devices, it has gone feral." msgstr "" #: lang/json/MONSTER_from_json.py -msgid "autonomous drone" +msgid "pig" msgstr "" #: lang/json/MONSTER_from_json.py -msgid "EMP hack" +msgid "rabbit" msgstr "" -#. ~ Description for EMP hack +#. ~ Description for rabbit #: lang/json/MONSTER_from_json.py msgid "" -"An automated kamikaze drone, this small quadcopter robot appears to have an " -"EMP grenade inside." +"A small mammal with a cute wiggling nose, cotton tail, and made of delicious " +"flesh." msgstr "" #: lang/json/MONSTER_from_json.py -msgid "C-4 hack" +msgid "raccoon" msgstr "" -#. ~ Description for C-4 hack +#. ~ Description for raccoon #: lang/json/MONSTER_from_json.py msgid "" -"An automated kamikaze drone, this small quadcopter robot appears to have " -"some C-4 inside." +"A small mammal native to North America, distinctive for its dexterous paws " +"and facial markings. It is resourceful and agile enough to open sealed " +"containers with its paws." msgstr "" #: lang/json/MONSTER_from_json.py -msgid "flashbang hack" +msgid "rat king" msgstr "" -#. ~ Description for flashbang hack +#. ~ Description for rat king #: lang/json/MONSTER_from_json.py msgid "" -"An automated kamikaze drone, this small quadcopter robot appears to have a " -"flashbang inside." +"A towering swarm of mutated rats, their tails knotted together in a filthy " +"mass. A fetid stench flows from its filthy presence." msgstr "" #: lang/json/MONSTER_from_json.py -msgid "tear gas hack" +msgid "sewer rat" msgstr "" -#. ~ Description for tear gas hack +#. ~ Description for sewer rat #: lang/json/MONSTER_from_json.py msgid "" -"An automated kamikaze drone, this small quadcopter robot appears to have a " -"tear gas canister inside." +"A worm-tailed rodent with long whiskers and beady eyes. The way it squeaks " +"makes it sound... hungry." msgstr "" #: lang/json/MONSTER_from_json.py -msgid "grenade hack" -msgstr "" +msgid "lamb" +msgid_plural "lambs" +msgstr[0] "" +msgstr[1] "" -#. ~ Description for grenade hack +#. ~ Description for lamb #: lang/json/MONSTER_from_json.py msgid "" -"An automated kamikaze drone, this small quadcopter robot appears to have a " -"grenade inside." +"A timid, hooved grazing mammal, and one of the first animals ever " +"domesticated. Its body is covered in a thick layer of wool, and the males " +"have long, spiraling horns." msgstr "" #: lang/json/MONSTER_from_json.py -msgid "manhack" -msgstr "" +msgid "sheep" +msgid_plural "sheep" +msgstr[0] "" +msgstr[1] "" -#. ~ Description for manhack +#. ~ Description for sheep #: lang/json/MONSTER_from_json.py msgid "" -"An automated anti-personnel drone, a small quadcopter robot surrounded by " -"whirring blades." +"A timid, hooved grazing mammal, and one of the first animals ever " +"domesticated. Its body is covered in a thick layer of wool, and the males " +"have long, spiralling horns." msgstr "" #: lang/json/MONSTER_from_json.py -msgid "mininuke hack" +msgid "squirrel" msgstr "" -#. ~ Description for mininuke hack +#. ~ Description for squirrel #: lang/json/MONSTER_from_json.py msgid "" -"Many times as large as a normal manhack, this flying quadcopter drone " -"appears to have a mininuke inside. If this is targeting you... Run." +"A small granivorous rodent with a long bushy tail, often seen darting amid " +"the branches of trees. A skittish varmint with an expression of unwavering " +"austerity, it is the mortal enemy of cat and dog alike." msgstr "" +#. ~ Description for squirrel #: lang/json/MONSTER_from_json.py -msgid "tiny fish" +msgid "" +"A tiny opportunistic rodent with a long bushy tail. The pine squirrel is " +"clever and cute, and hunted by nearly everything in the woods with a taste " +"for meat." msgstr "" -#. ~ Description for tiny fish #: lang/json/MONSTER_from_json.py -msgid "A tiny fish." +msgid "weasel" msgstr "" +#. ~ Description for weasel #: lang/json/MONSTER_from_json.py -msgid "small fish" +msgid "" +"The long-tailed weasel, a small but ubiquitous predator whose range extends " +"across the continent. It forms its den in small burrows, preferring to " +"occupy the nesting holes of its prey." msgstr "" -#. ~ Description for small fish #: lang/json/MONSTER_from_json.py -msgid "A small fish." -msgstr "" +msgid "wolf" +msgid_plural "wolves" +msgstr[0] "" +msgstr[1] "" +#. ~ Description for wolf #: lang/json/MONSTER_from_json.py -msgid "medium fish" +msgid "" +"A cunning pack predator, once extinct in the New England area, the wolf was " +"successfully reintroduced and their numbers reached record highs in the " +"decade before the Cataclysm. Lucky you." msgstr "" -#. ~ Description for medium fish #: lang/json/MONSTER_from_json.py -msgid "A medium fish." +msgid "marloss zealot" msgstr "" +#. ~ Description for marloss zealot #: lang/json/MONSTER_from_json.py -msgid "large fish" +msgid "" +"Her eyes lie vacant and spittle foams in her mouth, as she recites from the " +"hymns in rapturous ecstasy." msgstr "" -#. ~ Description for large fish +#. ~ Description for marloss zealot #: lang/json/MONSTER_from_json.py -msgid "A large fish." +msgid "" +"His eyes lie vacant and spittle foams in his mouth, as he recites from the " +"hymns in rapturous ecstasy." msgstr "" #: lang/json/MONSTER_from_json.py -msgid "huge fish" +msgid "laser turret" msgstr "" -#. ~ Description for huge fish +#. ~ Description for laser turret #: lang/json/MONSTER_from_json.py -msgid "A huge fish." +msgid "" +"The TX-5LR Cerberus is an upgrade to its predecessors. It features a state " +"of the art revolving laser cannon system with three barrels that charge from " +"solar cells embedded in its hull." msgstr "" #: lang/json/MONSTER_from_json.py -msgid "trout" +msgid "antimateriel turret" msgstr "" -#. ~ Description for trout +#. ~ Description for antimateriel turret #: lang/json/MONSTER_from_json.py msgid "" -"A Trout. A fish made popular by father-son fishing trips, Except for the " -"part where you have to gut it." +"Leadworks LLC's T-107A1 Interdictor, an automated .50BMG antimateriel " +"rifle. Credited with forestalling countless car-bombing attempts, it has " +"always been kept under extremely tight control, so as to itself maintain " +"extremely tight control of its area. And then the Cataclysm struck." msgstr "" #: lang/json/MONSTER_from_json.py -msgid "brown trout" +msgid "milspec turret" msgstr "" -#. ~ Description for brown trout +#. ~ Description for milspec turret #: lang/json/MONSTER_from_json.py msgid "" -"A Brown Trout. A fish made popular by father-son fishing trips, Except for " -"the part where you have to gut it." +"Leadworks LLC's T-4A1 Sentry. It features improved firmware over General " +"Atomics' TX-1 9x19mm model and an automated M4 carbine." msgstr "" #: lang/json/MONSTER_from_json.py -msgid "brook trout" +msgid "debug monster" msgstr "" -#. ~ Description for brook trout +#. ~ Description for debug monster #: lang/json/MONSTER_from_json.py -msgid "" -"A Brook Trout. A fish made popular by father-son fishing trips, Except for " -"the part where you have to gut it." +msgid "This monster exists only for testing purposes." msgstr "" #: lang/json/MONSTER_from_json.py -msgid "lake trout" +msgid "albino penguin" msgstr "" -#. ~ Description for lake trout +#. ~ Description for albino penguin #: lang/json/MONSTER_from_json.py msgid "" -"A Lake trout. A fish made popular by father-son fishing trips, Except for " -"the part where you have to gut it." +"Eight-feet-tall ghastly white penguins. Placid unless otherwise provoked." msgstr "" #: lang/json/MONSTER_from_json.py -msgid "rainbow trout" +msgid "alpha razorclaw" msgstr "" -#. ~ Description for rainbow trout +#. ~ Description for alpha razorclaw #: lang/json/MONSTER_from_json.py msgid "" -"A Rainbow Trout. A fish made popular by father-son fishing trips, Except " -"for the part where you have to gut it." +"A blood red, gigantic razorclaw. Its sword like pincers serve as the " +"keepers of the nest." msgstr "" #: lang/json/MONSTER_from_json.py -msgid "steelhead trout" +msgid "amigara horror" msgstr "" -#. ~ Description for steelhead trout +#. ~ Description for amigara horror #: lang/json/MONSTER_from_json.py msgid "" -"A Steelhead Trout. A fish made popular by father-son fishing trips, Except " -"for the part where you have to gut it." +"A hellish, vaguely humanoid horror, two stories tall. Its face is " +"grotesquely stretched out, its limbs deformed to unrecognizable outgrowths." msgstr "" #: lang/json/MONSTER_from_json.py -msgid "salmon" +msgid "bat" msgstr "" -#. ~ Description for salmon +#. ~ Description for bat #: lang/json/MONSTER_from_json.py msgid "" -"An Atlantic Salmon. A very fatty, nutritious fish. Tastes great smoked." +"One of the vesper bats, a family of winged insect-eating mammals. It roosts " +"in caves and other hollows, and uses a form of echolocation to aerially " +"navigate through tricky terrain at rapid speeds." msgstr "" #: lang/json/MONSTER_from_json.py -msgid "kokanee salmon" +msgid "scarred zombie" msgstr "" -#. ~ Description for kokanee salmon +#. ~ Description for scarred zombie #: lang/json/MONSTER_from_json.py -msgid "A Kokanee Salmon. A very fatty, nutritious fish. Tastes great smoked." +msgid "" +"A deformed human body, its skin transformed into one thick, calloused " +"envelope of scar tissue." msgstr "" #: lang/json/MONSTER_from_json.py -msgid "chinook salmon" -msgstr "" +msgid "blank body" +msgid_plural "blank bodies" +msgstr[0] "" +msgstr[1] "" -#. ~ Description for chinook salmon +#. ~ Description for blank body #: lang/json/MONSTER_from_json.py -msgid "A Chinook Salmon. A very fatty, nutritious fish. Tastes great smoked." +msgid "" +"This is some form of unnatural changeling creature; its appearance is a " +"bland mockery of the human form. Featureless and pale, its repugnant " +"countenance is all the more unsettling due to its lack of eyes and " +"distinguishing features except for a perfectly round mouth. Naked and " +"trembling, it almost seems pitiful but for the way that its unearthly " +"presence makes the hair on the back of your neck stand up in nameless horror." msgstr "" #: lang/json/MONSTER_from_json.py -msgid "coho salmon" +msgid "blob" msgstr "" -#. ~ Description for coho salmon +#. ~ Description for blob #: lang/json/MONSTER_from_json.py -msgid "A Coho Salmon. A very fatty, nutritious fish. Tastes great smoked." +msgid "" +"A black blob of viscous goo, oozing across the ground like a glob of living " +"oil." msgstr "" #: lang/json/MONSTER_from_json.py -msgid "whitefish" +msgid "brain blob" msgstr "" -#. ~ Description for whitefish +#. ~ Description for brain blob #: lang/json/MONSTER_from_json.py msgid "" -"A whitefish, closely related to salmon. One can assume they are just as " -"nice when cooked with smoke." +"A gigantic black blob of viscous goo, oozing across the ground like a glob " +"of living oil. Other blobs seem to swarm around it." msgstr "" #: lang/json/MONSTER_from_json.py -msgid "largemouth bass" +msgid "big blob" msgstr "" -#. ~ Description for largemouth bass +#. ~ Description for big blob #: lang/json/MONSTER_from_json.py -msgid "A Largemouth Bass. Very popular with sports fishermen." +msgid "" +"A large black blob of viscous goo, oozing across the ground like a glob of " +"living oil." msgstr "" #: lang/json/MONSTER_from_json.py -msgid "smallmouth bass" +msgid "small blob" msgstr "" -#. ~ Description for smallmouth bass +#. ~ Description for small blob #: lang/json/MONSTER_from_json.py msgid "" -"A Smallmouth Bass. Being intolerant to pollution in the water, smallmouth " -"bass are a good indicator of how clean it is." +"A small black blob of viscous goo, oozing across the ground like a glob of " +"living oil." msgstr "" #: lang/json/MONSTER_from_json.py -msgid "striped bass" +msgid "blood sacrifice" msgstr "" -#. ~ Description for striped bass +#. ~ Description for blood sacrifice #: lang/json/MONSTER_from_json.py msgid "" -"A Striped Bass. Mostly a salt water fish, they migrate to fresher water to " -"spawn." +"A defiled human body, once living. Tortured to death long ago, it remains " +"chained to the altar, the putrescent flays of its peeled skin quivering like " +"so much flotsam upon a murky pond." msgstr "" #: lang/json/MONSTER_from_json.py -msgid "white bass" +msgid "boomer" msgstr "" -#. ~ Description for white bass +#. ~ Description for boomer #: lang/json/MONSTER_from_json.py msgid "" -"A White Bass. Common to the region, a slab-sided and spiny-rayed little " -"fish." +"A rotund human body, bloated beyond belief and layered in rolls of fat. It " +"emits a horrible odor, and a putrid pink sludge dribbles from its mouth." msgstr "" #: lang/json/MONSTER_from_json.py -msgid "perch" +msgid "gasoline zombie" msgstr "" -#. ~ Description for perch +#. ~ Description for gasoline zombie #: lang/json/MONSTER_from_json.py msgid "" -"A small spritely Perch. A very bony fish, still got some tasty meat on it " -"though." +"A huge bloated zombie that appears to have fed upon gasoline; fumes and " +"flames escape from its mouth and fuel leaks from its waddling form." msgstr "" #: lang/json/MONSTER_from_json.py -msgid "walleye" +msgid "fungal boomer" msgstr "" -#. ~ Description for walleye +#. ~ Description for fungal boomer #: lang/json/MONSTER_from_json.py -msgid "A Walleye, a green-brown medium-sized fish with a white belly." +msgid "" +"A rotund and bloated human body with pasty, fungus-ridden flesh. Its mouth " +"drips with a frothing gray sludge." msgstr "" #: lang/json/MONSTER_from_json.py -msgid "sunfish" +msgid "huge boomer" msgstr "" -#. ~ Description for sunfish +#. ~ Description for huge boomer #: lang/json/MONSTER_from_json.py -msgid "A Sunfish. A small fish related to bass or bluegill." +msgid "" +"This boomer, normally swollen and ready to burst, has strengthened and " +"solidified. The bile dribbling from its mouth also appears to have " +"changed..." msgstr "" #: lang/json/MONSTER_from_json.py -msgid "pumpkinseed sunfish" +msgid "breather" msgstr "" -#. ~ Description for pumpkinseed sunfish +#. ~ Description for breather #: lang/json/MONSTER_from_json.py -msgid "A Pumpkinseed Sunfish. A small fish related to bass or bluegill." +msgid "" +"This is some sort of unearthly pink flesh sac; moist and ridged with veins, " +"it is otherwise without discernible exterior features. Seemingly immobile " +"and defenseless, it sits in place, swelling and collapsing upon itself as it " +"breathes." msgstr "" +#. ~ Description for breather #: lang/json/MONSTER_from_json.py -msgid "bluegill" +msgid "A weird mass of immobile pink goo. It seems to breathe." msgstr "" -#. ~ Description for bluegill #: lang/json/MONSTER_from_json.py -msgid "" -"A Bluegill, an invasive species in Japan. Commonly gutted and cooked whole." +msgid "broken cyborg" msgstr "" +#. ~ Description for broken cyborg #: lang/json/MONSTER_from_json.py -msgid "redbreast sunfish" +msgid "" +"A robot body with the head of a human. All kinds of electronic wires and " +"devices are implanted in its head. Patches of skin look diseased or " +"rotting. This cyborg moves erratically and has a confused and deranged look " +"in its eyes." msgstr "" -#. ~ Description for redbreast sunfish #: lang/json/MONSTER_from_json.py -msgid "A Redbreast Sunfish. A small fish related to bass or bluegill." +msgid "prototype cyborg" msgstr "" +#. ~ Description for prototype cyborg #: lang/json/MONSTER_from_json.py -msgid "green sunfish" +msgid "" +"A human fused with a mess of metal parts and wires. While its eyes are " +"empty, flashes of pain pass across its face reminiscent of the person " +"trapped in this grotesque body. With enough surgical skills one might be " +"able to give them back some humanity. If only they cared..." msgstr "" -#. ~ Description for green sunfish #: lang/json/MONSTER_from_json.py -msgid "A Green Sunfish. A small fish related to bass or bluegill." +msgid "charred nightmare" msgstr "" +#. ~ Description for charred nightmare #: lang/json/MONSTER_from_json.py -msgid "longear sunfish" +msgid "" +"Intense radiation has spurred a unique form of necrosis and regeneration, it " +"is impossible to tell if this creature was ever human." msgstr "" -#. ~ Description for longear sunfish #: lang/json/MONSTER_from_json.py -msgid "A Longear Sunfish. A small fish related to bass or bluegill." +msgid "chicken walker" msgstr "" +#. ~ Description for chicken walker #: lang/json/MONSTER_from_json.py -msgid "redear sunfish" +msgid "" +"The Northrop ATSV, a massive, heavily-armed and armored robot walking on a " +"pair of reverse-jointed legs. Armed with a 40mm anti-vehicle grenade " +"launcher, 5.56 anti-personnel gun, and the ability to electrify itself " +"against attackers, it is an effective automated sentry, though production " +"was limited due to a legal dispute." msgstr "" -#. ~ Description for redear sunfish #: lang/json/MONSTER_from_json.py -msgid "A Redear Sunfish. A small fish related to bass or bluegill." +msgid "C.H.U.D." msgstr "" +#. ~ Description for C.H.U.D. #: lang/json/MONSTER_from_json.py -msgid "rock bass" +msgid "" +"The C.H.U.D. or Cannibalistic Humanoid Underground Dweller. A human being " +"turned pale and mad from years of underground isolation." msgstr "" -#. ~ Description for rock bass #: lang/json/MONSTER_from_json.py -msgid "" -"A Rock Bass. Related to sunfish, this tiny fish has a camoflauge-like " -"patterning and a red eye." +msgid "police bot" msgstr "" +#. ~ Description for police bot #: lang/json/MONSTER_from_json.py -msgid "calico bass" +msgid "" +"One of the many models of armored law enforcement robots employed shortly " +"before the collapse of civilization. Solar powered like many other robots, " +"it maintains its programmed pursuit of law and order, propelled on a trio of " +"omni wheels." msgstr "" -#. ~ Description for calico bass #: lang/json/MONSTER_from_json.py -msgid "A Calico Bass. A medium-sized fish also known as a 'Crappie'." +msgid "crawler" msgstr "" +#. ~ Description for crawler #: lang/json/MONSTER_from_json.py -msgid "warmouth" +msgid "" +"A conglomeration of human parts fused together in a horrible mishmash of " +"function, slowly dragging its eldritch body across the ground." msgstr "" -#. ~ Description for warmouth #: lang/json/MONSTER_from_json.py -msgid "" -"A Warmouth, similar to a rock bass, this small fish is related to the " -"sunfish." +msgid "dark wyrm" msgstr "" +#. ~ Description for dark wyrm #: lang/json/MONSTER_from_json.py -msgid "bullhead" +msgid "" +"A huge mutated worm found deep underground. It has a gaping round mouth " +"lined with dagger-like teeth, and its flesh is slick with bubbling blue " +"slime." msgstr "" -#. ~ Description for bullhead #: lang/json/MONSTER_from_json.py -msgid "A Bullhead, a type of catfish. Delicious battered and fried." +msgid "wraith" msgstr "" +#. ~ Description for wraith #: lang/json/MONSTER_from_json.py -msgid "channel catfish" +msgid "" +"A gigantic shadow, chaotically changing in shape and volume. Two piercing " +"orbs of light dominate what can only be described as its head." msgstr "" -#. ~ Description for channel catfish #: lang/json/MONSTER_from_json.py -msgid "A Channel Catfish, they have a forked tail and long whiskers." +msgid "dementia" msgstr "" +#. ~ Description for dementia #: lang/json/MONSTER_from_json.py -msgid "white catfish" +msgid "" +"A crazed individual, the bloody scars on the side of its shaved head suggest " +"some sort of partial lobotomy" msgstr "" -#. ~ Description for white catfish #: lang/json/MONSTER_from_json.py -msgid "A White Catfish, a small whiskered fish with a broad head." +msgid "skeletal dog" msgstr "" -#. ~ Description for pike +#. ~ Description for skeletal dog #: lang/json/MONSTER_from_json.py msgid "" -"A Northern Pike. Pike can be a pretty aggressive fish, careful around those " -"teeth." +"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 "pickerel" +msgid "dog" msgstr "" -#. ~ Description for pickerel +#. ~ Description for dog #: lang/json/MONSTER_from_json.py -msgid "A Pickerel. It looks like a pike, but much smaller." +msgid "" +"A domesticated mongrel of the canine persuasion. In the absence of human " +"society, it has turned feral. You feel a sudden urge to destroy it." msgstr "" #: lang/json/MONSTER_from_json.py -msgid "muskellunge" +msgid "Z-9" msgstr "" -#. ~ Description for muskellunge +#. ~ Description for Z-9 #: lang/json/MONSTER_from_json.py msgid "" -"A Muskellunge. Closely related to pike, it shares the same aggression and " -"sharp teeth." +"A zombified version of one of the German shepherd dogs used in law " +"enforcement. Its deformed body is encased in a protective Kevlar harness." msgstr "" #: lang/json/MONSTER_from_json.py -msgid "white sucker" +msgid "rot-weiler" msgstr "" -#. ~ Description for white sucker +#. ~ Description for rot-weiler #: lang/json/MONSTER_from_json.py -msgid "A White Sucker. It has a streamlined body with a round mouth." +msgid "" +"Acrid smell accompanies this corpse of canine. Its whole body is covered in " +"chains of pulsing cysts and slime-dribbling ulcers." msgstr "" #: lang/json/MONSTER_from_json.py -msgid "carp" +msgid "eyebot" msgstr "" -#. ~ Description for carp +#. ~ Description for eyebot #: lang/json/MONSTER_from_json.py msgid "" -"A golden-yellow Common Carp. Some people think they don't taste great, but " -"you can't afford to be choosy in the cataclysm." +"A quadcopter drone largely comprised of a high-resolution camera lens and a " +"speaker, this robot hovers above the ground, documenting the carnage and " +"mayhem around it. While it is no longer able to report to a central " +"authority, it's likely that some of its automated alert systems are still " +"functional, given that the thing seems to have an operational charging " +"station somewhere." msgstr "" #: lang/json/MONSTER_from_json.py -msgid "grass carp" +msgid "nurse bot" msgstr "" -#. ~ Description for grass carp +#. ~ Description for nurse bot #: lang/json/MONSTER_from_json.py -msgid "A huge Grass Carp. A golden, herbivorous fish." +msgid "" +"The first product from Uncanny, a towering four-armed humanoid with a gentle " +"face. The details of its visage are striking, but the stiffness of it makes " +"you really uncomfortable. The end of the world did not stop it from looking " +"for patient to assist." msgstr "" #: lang/json/MONSTER_from_json.py -msgid "bowfin" +msgid "flaming eye" msgstr "" -#. ~ Description for bowfin +#. ~ Description for flaming eye #: lang/json/MONSTER_from_json.py msgid "" -"A Bowfin. These fish are related to gar but without the huge teeth, skin " -"rending scales, and aggression." +"An enormous disembodied eyeball the size of a person, flying through the air " +"through some unknown agency. Wreathed in unnatural flickering blue flame, " +"it possesses a blazing yellow iris with a slitted pupil like that of a cat " +"and trails a set of flailing black tendrils as it slowly drifts about; its " +"unearthly presence filling you with dread at the prospect of falling under " +"its baleful gaze." msgstr "" #: lang/json/MONSTER_from_json.py -msgid "fallfish" +msgid "flesh angel" msgstr "" -#. ~ Description for fallfish +#. ~ Description for flesh angel #: lang/json/MONSTER_from_json.py msgid "" -"A Fallfish. These fish are related to gar but without the huge teeth, skin " -"rending scales, and aggression." +"A tall and slender man lacking skin and any normalcy of countenance. Wings " +"of muscle curl forth from its back and a third eye dominates the forehead." msgstr "" #: lang/json/MONSTER_from_json.py -msgid "lobster" +msgid "flying polyp" msgstr "" -#. ~ Description for lobster +#. ~ Description for flying polyp #: lang/json/MONSTER_from_json.py msgid "" -"These things were once considered pests not worth eating, then some " -"marketing genius started selling them to people as a delicacy and they took " -"off in popularity... and price." +"A half polypous, utterly alien creature. It's only partly material and has " +"the ability to fly, despite the absence of wings. It produces strange " +"whistling noises which send cold shivers of primal terror down your spine" msgstr "" #: lang/json/MONSTER_from_json.py -msgid "crayfish" +msgid "fungal blossom" msgstr "" -#. ~ Description for crayfish +#. ~ Description for fungal blossom #: lang/json/MONSTER_from_json.py msgid "" -"If you could get ahold of a bunch more of these, a hefty pot of boiling " -"water, and some spicy seasonings..." +"A broad fungus, looking much like a glowing blue sunflower. It appears to " +"emit finer spores than the typical fungal emission." msgstr "" #: lang/json/MONSTER_from_json.py -msgid "Blinky" -msgid_plural "Blinkies" -msgstr[0] "" -msgstr[1] "" +msgid "fungal hedgerow" +msgstr "" -#. ~ Description for Blinky +#. ~ Description for fungal hedgerow #: lang/json/MONSTER_from_json.py -msgid "A strange three-eyed fish." +msgid "" +"Looking at first glance like a dull gray privet, this \"hedge\" is really a " +"mass of barbed fungal tendrils, defending the fungal tower." msgstr "" #: lang/json/MONSTER_from_json.py -msgid "freshwater eel" +msgid "fungal tendril" msgstr "" -#. ~ Description for freshwater eel +#. ~ Description for fungal tendril #: lang/json/MONSTER_from_json.py -msgid "" -"An American eel. Used to be quite common in these parts until the dams were " -"built. Guess they'll get a second chance now that they aren't running." +msgid "A long and delicate-looking tendril with a sharp tip." msgstr "" -#: lang/json/MONSTER_from_json.py -msgid "jawed terror" +#: lang/json/MONSTER_from_json.py lang/json/terrain_from_json.py +#: lang/json/terrain_from_json.py +msgid "fungal wall" msgstr "" -#. ~ Description for jawed terror +#. ~ Description for fungal wall #: lang/json/MONSTER_from_json.py msgid "" -"A once aggressive and hungry bull shark, this jawed terror is now even more " -"aggressive, possibly thanks to its lack of a functioning brain." +"A veritable wall of fungus, grown as a natural defense by the fungal spire. " +"New spores erupt from the surface every few seconds." msgstr "" #: lang/json/MONSTER_from_json.py -msgid "giant carp" +msgid "fungaloid" msgstr "" -#. ~ Description for giant carp +#. ~ Description for fungaloid #: lang/json/MONSTER_from_json.py msgid "" -"This thing seems like a carp, only swollen and very very angry. Death is " -"the gift of the carp god." +"A pale white fungus, one meaty gray stalk supporting a bloom at the top. " +"Spores are periodically expelled from its gills, and a few tendrils extend " +"from the base, allowing mobility and some basic means of defense." msgstr "" #: lang/json/MONSTER_from_json.py -msgid "giant salmon" +msgid "fungal spire" msgstr "" -#. ~ Description for giant salmon +#. ~ Description for fungal spire #: lang/json/MONSTER_from_json.py msgid "" -"A mutated salmon, the same size as a large dog and quite dangerous to the " -"inexperienced angler." +"An enormous fungal spire, towering over the ground. It pulsates slowly, " +"continuously growing new defenses." msgstr "" #: lang/json/MONSTER_from_json.py -msgid "seweranha" +msgid "giant fungal blossom" msgstr "" -#. ~ Description for seweranha +#. ~ Description for giant fungal blossom #: lang/json/MONSTER_from_json.py msgid "" -"A large mutant variety of carp. It has shimmering green scales and a mouth " -"lined with three jagged rows of razor-sharp teeth." +"An immense fungal blossom, towering over its surroundings. It pulses with a " +"soft blue glow, continuously pumping its spores into the air." msgstr "" #: lang/json/MONSTER_from_json.py -msgid "skittering plague" +#: lang/json/overmap_terrain_from_json.py +msgid "fungal tower" msgstr "" -#. ~ Description for skittering plague +#. ~ Description for fungal tower #: lang/json/MONSTER_from_json.py -msgid "A giant infected roach, it has been feeding on the undead." +msgid "" +"An enormous fungal tower. On closer inspection, its cap is supported by " +"LOTS of fungal tendrils of various thicknesses, emerging from yet more " +"bristling tendrils at ground level. Between this redundancy and their " +"noticeable movement creating frequent gaps, it's tough to get a solid shot " +"on the thing." msgstr "" #: lang/json/MONSTER_from_json.py -msgid "plague nymph" +msgid "fungal sporeling" msgstr "" -#. ~ Description for plague nymph +#. ~ Description for fungal sporeling #: lang/json/MONSTER_from_json.py -msgid "An infected mutant cockroach about the size of a rat." +msgid "" +"A fungal stalk several feet in height. Two vicious looking tendrils extend " +"from its thorned and leathery exterior, and it moves about faster than the " +"larger fungaloids." msgstr "" #: lang/json/MONSTER_from_json.py -msgid "plague vector" +msgid "amoebic mold" msgstr "" -#. ~ Description for plague vector +#. ~ Description for amoebic mold #: lang/json/MONSTER_from_json.py msgid "" -"This infected roach has been feeding on the undead and started to mutate " -"chaotically. Extra limbs and growths sprout from its thorax." +"A formless slime mold the size of a cow. Crusty bits of cytoplasm fall away " +"as it oozes across the ground." msgstr "" #: lang/json/MONSTER_from_json.py -msgid "giant cockroach" +msgid "generator" msgstr "" -#. ~ Description for giant cockroach +#. ~ Description for generator #: lang/json/MONSTER_from_json.py -msgid "A mutant cockroach the size of a small dog." +msgid "Your precious generator, noisily humming away. Defend it at all costs!" msgstr "" #: lang/json/MONSTER_from_json.py -msgid "giant cockroach nymph" +msgid "giant crayfish" msgstr "" -#. ~ Description for giant cockroach nymph +#. ~ Description for giant crayfish #: lang/json/MONSTER_from_json.py -msgid "A baby mutant cockroach about the size of a rat." +msgid "" +"A mutant, terrestrial variety of the signal crayfish, this massive " +"crustacean resembles a humongous lobster." msgstr "" #: lang/json/MONSTER_from_json.py -msgid "pregnant giant cockroach" +msgid "gozu" msgstr "" -#. ~ Description for pregnant giant cockroach +#. ~ Description for gozu #: lang/json/MONSTER_from_json.py msgid "" -"A mutant cockroach the size of a small dog. Its abdomen is heavily swollen." +"This is some sort of unnatural cross between a bull and a man. Quite " +"different from the minotaur of legend, it possesses a shaggy white bull’s " +"head on an otherwise unremarkable human body. Clad in sagging socks and " +"stained jockey shorts, it grunts and snuffles, drooling ropey strands of " +"white slobber down its chest. Its mere presence fills you with an " +"unfathomable dread." msgstr "" #: lang/json/MONSTER_from_json.py -msgid "giant bee" +msgid "graboid" msgstr "" -#. ~ Description for giant bee +#. ~ Description for graboid #: lang/json/MONSTER_from_json.py msgid "" -"With a stinger the size of a kitchen knife, this dog-sized insect's black " -"and yellow markings warn you to leave it undisturbed." +"A monstrous beast the size of a semi truck with a tripartite mouth that " +"opens to reveal hundreds of writhing tongues with razor sharp edges. It " +"keeps most of its enormous body hidden underground." msgstr "" #: lang/json/MONSTER_from_json.py -msgid "giant centipede" +msgid "gracken" msgstr "" -#. ~ Description for giant centipede +#. ~ Description for gracken #: lang/json/MONSTER_from_json.py msgid "" -"A meter-long centipede with a menacing pair of pincers, moving swiftly on " -"dozens of spindly legs." +"This is some form of eldritch monstrosity; an uncouth black being with " +"smooth, oily, skin and unpleasant horns that curve inward toward each " +"other. Tall and thin, the shadows cling unnaturally to its vaguely defined " +"humanoid form as it shuffles along, its hands twitching and spasming so " +"rapidly as to appear a little more than a black blur of claws. Gazing upon " +"its disturbing form fills you with an unspeakable terror." msgstr "" #: lang/json/MONSTER_from_json.py -msgid "giant dragonfly" -msgid_plural "giant dragonflies" -msgstr[0] "" -msgstr[1] "" +msgid "half worm" +msgstr "" -#. ~ Description for giant dragonfly +#. ~ Description for half worm #: lang/json/MONSTER_from_json.py -msgid "" -"A ferocious mutant dragonfly as big as a cat, darting through the air with a " -"cluster of fangs for a mouth." +msgid "A squiggling severed portion of a wounded giant worm." msgstr "" #: lang/json/MONSTER_from_json.py -msgid "giant fly" -msgid_plural "giant flies" -msgstr[0] "" -msgstr[1] "" +msgid "your mother" +msgstr "" -#. ~ Description for giant fly +#. ~ Description for your mother #: lang/json/MONSTER_from_json.py -msgid "" -"A tremendous housefly the size of a small dog, predictably accompanied by a " -"loud, incessant buzzing sound." +msgid "Mom?" msgstr "" #: lang/json/MONSTER_from_json.py -msgid "giant mosquito" +msgid "evil multi-cooker" msgstr "" -#. ~ Description for giant mosquito +#. ~ Description for evil multi-cooker #: lang/json/MONSTER_from_json.py -msgid "" -"An enormous mutant mosquito, fluttering erratically. Its face is dominated " -"by a long, spear-tipped proboscis." +msgid "The multi-cooker's got a mind of its own! Look out!" msgstr "" #: lang/json/MONSTER_from_json.py -msgid "giant cellar spider" +msgid "cleaner bot" msgstr "" -#. ~ Description for giant cellar spider +#. ~ Description for cleaner bot #: lang/json/MONSTER_from_json.py msgid "" -"A twitchy mutant brown spider, with a relatively small body and spindly long " -"legs. Its smaller brethren are known for being agile, and for preying upon " -"other spiders." +"The Ford Sanitron, a utility robot designed for cleaning up waste material " +"in hazardous conditions." msgstr "" #: lang/json/MONSTER_from_json.py -msgid "immature giant cellar spider" +msgid "tentacle dog" msgstr "" -#. ~ Description for immature giant cellar spider +#. ~ Description for tentacle dog #: lang/json/MONSTER_from_json.py msgid "" -"A newly-hatched giant cellar spider. Too small to possess much venom, but " -"still quick and agile like an adult." +"A dog's body with a mass of ropey, black tentacles reaching out from its " +"head." msgstr "" #: lang/json/MONSTER_from_json.py -msgid "giant jumping spider" +msgid "hologram" msgstr "" -#. ~ Description for giant jumping spider +#. ~ Description for hologram #: lang/json/MONSTER_from_json.py -msgid "" -"A giant spider with big forelegs and two pairs of inquisitive-looking eyes. " -"It can leap quite quickly, even into the treetops." +msgid "An image made from light, nearly identical to the real deal." msgstr "" #: lang/json/MONSTER_from_json.py -msgid "giant trapdoor spider" -msgstr "" +msgid "homunculus" +msgid_plural "homunculuses" +msgstr[0] "" +msgstr[1] "" -#. ~ Description for giant trapdoor spider +#. ~ Description for homunculus #: lang/json/MONSTER_from_json.py msgid "" -"A gigantic spider with a bulbous thorax. It digs a deep underground burrow " -"that serves as a pit to trap unwary prey." +"A pale hairless man with an impressive athletic physique. Its lidless eyes " +"are totally black, and seeping with blood." msgstr "" #: lang/json/MONSTER_from_json.py -msgid "giant web spider" +msgid "human snail" msgstr "" -#. ~ Description for giant web spider +#. ~ Description for human snail #: lang/json/MONSTER_from_json.py msgid "" -"A giant mutated grass spider, it waits for prey to become ensnared in the " -"vast webs that it weaves between the trees." +"An enormous fleshy snail, with an oddly human face. Eyestalks protrude from " +"where the eyes should be." msgstr "" #: lang/json/MONSTER_from_json.py -msgid "immature giant web spider" +msgid "hunting horror" msgstr "" -#. ~ Description for immature giant web spider +#. ~ Description for hunting horror #: lang/json/MONSTER_from_json.py msgid "" -"A still immature giant grass spider. Too young to be venomous, or to walk " -"proficiently for that matter" +"This is some sort of great viperine creature, possessed of a curiously " +"distorted head and massive clawed appendages. It partially supports itself " +"with the aid of black rubbery wings of monstrous dimensions. Its form " +"writhes and changes before your eyes, filling you with unnameable horror." msgstr "" #: lang/json/MONSTER_from_json.py -msgid "giant black widow" +msgid "irradiated wanderer" msgstr "" -#. ~ Description for giant black widow +#. ~ Description for irradiated wanderer #: lang/json/MONSTER_from_json.py msgid "" -"A giant mutated black widow spider. A highly venomous nightmare come to " -"life." +"This rotting corpse seeps a glowing ooze from its lesions. A strange " +"tattered jumpsuit marks it as an oddity across the wasteland." msgstr "" #: lang/json/MONSTER_from_json.py -msgid "giant black widow spiderling" +msgid "fleshy shambler" msgstr "" -#. ~ Description for giant black widow spiderling +#. ~ Description for fleshy shambler #: lang/json/MONSTER_from_json.py msgid "" -"The horrid spawn of a giant black widow spider. Even as a newborn, this " -"foul creature knows only how to kill." +"An amalgamation of throbbing organs from various creatures have fused " +"together into this lurching, vaguely humanoid shape. It's myriad roughly " +"formed mouths sussurate in a chorus of sibilant groans and whispers." msgstr "" #: lang/json/MONSTER_from_json.py -msgid "giant wolf spider" +msgid "flesh golem" msgstr "" -#. ~ Description for giant wolf spider +#. ~ Description for flesh golem #: lang/json/MONSTER_from_json.py msgid "" -"A wolf spider mutated to about thirty times its normal size, it moves " -"quickly and aggressively to catch and consume prey." +"A seeping conglomeration of spasming muscle and organs have fused together " +"into this towering caricature of the human form. Various organs fall off of " +"it's hulking body only to be reabsorbed moments later." msgstr "" #: lang/json/MONSTER_from_json.py -msgid "giant wasp" +msgid "jabberwock" msgstr "" -#. ~ Description for giant wasp +#. ~ Description for jabberwock #: lang/json/MONSTER_from_json.py msgid "" -"A gigantic slender-bodied wasp with an evil-looking stinger protruding from " -"its abdomen. Its exoskeleton glowers with ominous red markings." +"A putrid amalgamation of body parts from humans and other creatures have " +"fused together in this aberration of flesh. The eyes of all the heads dart " +"about rapidly and the mouths form a chorus of groaning screams." msgstr "" #: lang/json/MONSTER_from_json.py -msgid "dermatik" +msgid "kreck" msgstr "" -#. ~ Description for dermatik +#. ~ Description for kreck #: lang/json/MONSTER_from_json.py msgid "" -"A mutated wasp nearly the size of a cat, with a barbed ovipositor extruding " -"from the abdomen." +"This is some form of otherworldly hound. Lean and hungry looking, its " +"twisted red flesh is stretched tightly across its misshapen, angular frame. " +"Loping grotesquely along, its unusually long neck stretches forward, its " +"skull-like head near the ground as it sniffs out its prey. Its foulness " +"partially veiled by some arcane force, it seems to almost flicker in and out " +"of your perceptions in a fashion that awakens ancient nameless terrors in " +"the back of your mind" msgstr "" #: lang/json/MONSTER_from_json.py -msgid "dermatik larva" +msgid "mi-go" msgstr "" -#. ~ Description for dermatik larva +#. ~ Description for mi-go #: lang/json/MONSTER_from_json.py msgid "" -"A fat white grub as big as a squirrel, with a pair of large, spadelike " -"mandibles." +"This is an alien creature of uncertain origin. Its shapeless pink body " +"bears numerous sets of paired appendages of unknown function, and a pair of " +"ribbed, membranous wings which seem to be quite useless. Its odd, vaguely " +"pyramid-shaped head bristles with numerous wavering antennae, and simply " +"gazing upon the unnatural beast fills you with primordial dread." msgstr "" #: lang/json/MONSTER_from_json.py -msgid "giant ant" +msgid "miner bot" msgstr "" -#. ~ Description for giant ant +#. ~ Description for miner bot #: lang/json/MONSTER_from_json.py msgid "" -"An enormous red ant covered in chitinous plates. It possesses a pair of " -"wriggling antennae and vicious-looking mandibles." +"A snake-like, segmented robot built to tunnel into the ground and detonate " +"landmines." msgstr "" #: lang/json/MONSTER_from_json.py -msgid "giant acidic ant" +msgid "cyclopean" msgstr "" -#. ~ Description for giant acidic ant +#. ~ Description for cyclopean #: lang/json/MONSTER_from_json.py msgid "" -"A monstrous brown ant with a swollen abdomen, that ends with a small orifice " -"at the tip. Glistening liquid seems to drip out periodically." +"A relatively humanoid mutant with purple hair and a grapefruit-sized " +"bloodshot eye." msgstr "" #: lang/json/MONSTER_from_json.py -msgid "acidic ant larva" +msgid "slimespring" msgstr "" -#. ~ Description for acidic ant larva +#. ~ Description for slimespring #: lang/json/MONSTER_from_json.py -msgid "" -"A squirming yellow grub that seems to be oozing liquid from both ends of its " -"body. It appears its chitin hasn't developed enough to resist acid." +msgid "A familiar-looking blob of goo. It sprouts the occasional eyestalk." msgstr "" #: lang/json/MONSTER_from_json.py -msgid "acidic queen ant" +msgid "razorclaw" msgstr "" -#. ~ Description for acidic queen ant +#. ~ Description for razorclaw #: lang/json/MONSTER_from_json.py msgid "" -"An enormous brown ant with an elongated, pulsating abdomen. Its orifice " -"seems developed only for egg-laying rather than spraying acid like the rest " -"of the colony, but it doesn't seem affected by the acrid liquid either." +"A man-sized crustacean clad in an iron-like chitin, capable of emitting the " +"most horrible of shrieks. Often spotted near shipwrecks or other dark damp " +"places, which it uses as nesting grounds." msgstr "" #: lang/json/MONSTER_from_json.py -msgid "acidic soldier ant" +msgid "riot control bot" msgstr "" -#. ~ Description for acidic soldier ant +#. ~ Description for riot control bot #: lang/json/MONSTER_from_json.py msgid "" -"A massive woolly brown ant that towers over the worker ants with a giant " -"head crest. Along with its huge mandibles, a corrosive liquid seeps from " -"the end of its bloated abdomen." +"Nonviolent riot-control bot. Designed to suppress riots and make mass " +"arrests of those participating. Though its relaxation gas is by far its " +"best-known weapon, it carries a blinding flash and a low-powered stungun for " +"self-defense--in addition to its supply of electronic handcuffs." msgstr "" #: lang/json/MONSTER_from_json.py -msgid "fungal ant" +msgid "shadow" msgstr "" -#. ~ Description for fungal ant +#. ~ Description for shadow #: lang/json/MONSTER_from_json.py msgid "" -"Pale, sickly gray in color, this giant ant's cracked exoskeleton is barely " -"held together by coils of fungus erupting from every joint in its body." +"This is an animate shadow. Looking like nothing more than an errant patch " +"of normal shadow, it draws your attention by the way it moves subtly and " +"whispers softly in the back of your mind. Strange intrusive thoughts " +"accompany the quiet murmur, awakening your most horrific memories and fears." msgstr "" #: lang/json/MONSTER_from_json.py -msgid "ant larva" +msgid "shadow snake" msgstr "" -#. ~ Description for ant larva +#. ~ Description for shadow snake #: lang/json/MONSTER_from_json.py msgid "" -"A pulsating sausage of glistening white flesh, the size of a large cat. On " -"one end is a set of squirming mouth parts." +"This is an animate shadow in the form of a long and sinuous snake. " +"Translucent and dark, it glides silently across the floor, wriggling and " +"flexing as it moves." msgstr "" -#: lang/json/MONSTER_from_json.py -msgid "queen ant" -msgstr "" +#: lang/json/MONSTER_from_json.py lang/json/map_extra_from_json.py +msgid "Shia LaBeouf" +msgid_plural "Shia LaBeouf" +msgstr[0] "" +msgstr[1] "" -#. ~ Description for queen ant +#. ~ Description for Shia LaBeouf #: lang/json/MONSTER_from_json.py msgid "" -"A colossal red ant with a bulging, bloated thorax. It moves slowly and " -"deliberately, tending to nearby eggs and continually laying more." +"Living in the woods, \n" +"killing for sport, \n" +"eating all the bodies, \n" +"actual cannibal Shia LaBeouf." msgstr "" #: lang/json/MONSTER_from_json.py -msgid "soldier ant" +msgid "shoggoth" msgstr "" -#. ~ Description for soldier ant +#. ~ Description for shoggoth #: lang/json/MONSTER_from_json.py msgid "" -"A huge and hairy red ant almost twice the size of other giant ants. Bulging " -"pincers extend from its jaws." +"A gargantuan protoplasmic blob, constantly reshaping, forming new pseudopods " +"seemingly at will. All over its body are eyes that form and disappear. It " +"looks at you with malice." msgstr "" #: lang/json/MONSTER_from_json.py -msgid "giant locust" +msgid "skeleton" msgstr "" -#. ~ Description for giant locust +#. ~ Description for skeleton #: lang/json/MONSTER_from_json.py msgid "" -"An overgrown locust. You don't think it'll eat you but it could cause " -"massive damage to nearby plants." +"A monstrous overgrowth of ossified tissue has replaced this zombie'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 "locust nymph" +msgid "skeletal brute" msgstr "" -#. ~ Description for locust nymph +#. ~ Description for skeletal brute #: lang/json/MONSTER_from_json.py msgid "" -"A locust the size of a rabbit. You'd hate to think what a swarm of these " -"could do." +"Distorted outgrowths of calcified bone plates cover this zombie's rotten " +"skin. Joints and cracks around its body ooze with black goo." msgstr "" #: lang/json/MONSTER_from_json.py -msgid "black bear cub" +msgid "sludge crawler" msgstr "" -#. ~ Description for black bear cub +#. ~ Description for sludge crawler #: lang/json/MONSTER_from_json.py msgid "" -"A juvenile American black bear. This one isn't much of a threat, but be " -"wary of its parent; black bears are known for their protectiveness." +"A sluglike creature, eight feet long and the width of a refrigerator. Its " +"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 "" #: lang/json/MONSTER_from_json.py -msgid "black bear" +msgid "giant slug" msgstr "" -#. ~ Description for black bear +#. ~ Description for giant slug #: lang/json/MONSTER_from_json.py msgid "" -"The American black bear. A large omnivorous scavenger, it has powerful " -"claws and jaws, and is an effective ambush hunter. Most individuals are shy " -"around humans, but they're fiercely protective of their cubs." +"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 "" #: lang/json/MONSTER_from_json.py -msgid "beaver" +msgid "spore cloud" msgstr "" -#. ~ Description for beaver +#. ~ Description for spore cloud #: lang/json/MONSTER_from_json.py -msgid "" -"The North American beaver, the continent's largest rodent. Its paddle-" -"shaped tail helps ferry it through the water, and its prominent teeth can " -"chew through wood, which it uses to build dam-like nests in lakes and " -"streams." +msgid "A mass of spores the size of a balled fist, wafting around in the air." msgstr "" #: lang/json/MONSTER_from_json.py -msgid "black rat" +msgid "Beagle Mini-Tank UGV" msgstr "" -#. ~ Description for black rat +#. ~ Description for Beagle Mini-Tank UGV #: lang/json/MONSTER_from_json.py msgid "" -"The black rat, an omnivorous rodent with sheer black fur and a long, rough " -"tail. Harbinger of pestilence, famine, and mange, it will sometimes swarm " -"over the dead or dying." +"The Northrop Beagle is a refrigerator-sized urban warfare UGV. Sporting an " +"anti-tank missile launcher, 40mm grenade launcher, and numerous anti-" +"infantry weapons, it's designed for high-risk urban fighting." msgstr "" #: lang/json/MONSTER_from_json.py -msgid "bobcat" +msgid "thing" msgstr "" -#. ~ Description for bobcat +#. ~ Description for thing #: lang/json/MONSTER_from_json.py msgid "" -"A spotted wild cat living across much of North America. It is not a serious " -"threat to humans, but it can be aggressive when threatened." +"An amorphous black creature, detaching and sprouting tentacles without any " +"apparent pause." msgstr "" #: lang/json/MONSTER_from_json.py -msgid "cat" +msgid "tripod" msgstr "" -#. ~ Description for cat +#. ~ Description for tripod #: lang/json/MONSTER_from_json.py msgid "" -"A small domesticated predator gone feral in the absence of human " -"stewardship. Harried by the elements and the rigors of survival, it is " -"scruffy and skittish." +"The Honda Regnal, a tall robot walking on three spidery legs. For weapons, " +"it has a trio of spiked retractable cables and a flamethrower mounted on its " +"head." msgstr "" #: lang/json/MONSTER_from_json.py -msgid "chipmunk" +msgid "milspec searchlight" msgstr "" -#. ~ Description for chipmunk +#. ~ Description for milspec searchlight #: lang/json/MONSTER_from_json.py msgid "" -"The eastern chipmunk, a tiny omnivorous rodent with a characteristic striped " -"coat. It spends much of the day patrolling its elaborate burrow and the " -"precious stores of foraged food within." +"Three high-powered searchlights with automated search AI and mounting, " +"continually seeking targets." msgstr "" #: lang/json/MONSTER_from_json.py -msgid "cougar" -msgstr "" +msgid "twisted body" +msgid_plural "twisted bodies" +msgstr[0] "" +msgstr[1] "" -#. ~ Description for cougar +#. ~ Description for twisted body #: lang/json/MONSTER_from_json.py msgid "" -"The Eastern cougar, a large feline predator. Once thought extinct in this " -"region, conservation efforts were successful in restoring a thriving " -"population. Fast and silent, this predator can cover long distances with " -"powerful leaps and pounces, catching its prey with its deadly claws before " -"delivering the finishing blow with its enormous fangs." +"A human body, but with its limbs, neck, and hair impossibly twisted. It " +"clambers around swiftly, making awful screeching sounds." msgstr "" #: lang/json/MONSTER_from_json.py -msgid "calf" -msgstr "" +msgid "vortex" +msgid_plural "vortexes" +msgstr[0] "" +msgstr[1] "" -#. ~ Description for calf -#. ~ Description for cow +#. ~ Description for vortex #: lang/json/MONSTER_from_json.py msgid "" -"The domestic cow, a baleful, ruminating farm animal. It is quite muscular, " -"and the males can have a violent streak to accompany their nasty-looking " -"horns." +"A twisting spot in the air, with some kind of morphing mass at its center." msgstr "" #: lang/json/MONSTER_from_json.py -msgid "cow" +msgid "giant worm" msgstr "" +#. ~ Description for giant worm #: lang/json/MONSTER_from_json.py -msgid "coyote" +msgid "" +"An enormous, mutated creature that might once have been a nightcrawler. It " +"possesses a large fanged mouth and a long slender body that comes up to your " +"shoulder, with even more surely hiding underground." msgstr "" -#. ~ Description for coyote #: lang/json/MONSTER_from_json.py -msgid "" -"The Eastern coyote, also called the tweed wolf, is a territorial canine " -"descended from the offspring of gray wolves and true coyotes. It is " -"intimidated by humans and other predators, but it will still fight if " -"threatened, and the Cataclysm has made it more fearless than usual." +msgid "yugg" msgstr "" -#. ~ Description for coyote +#. ~ Description for yugg #: lang/json/MONSTER_from_json.py msgid "" -"The Northeastern coyote, a widespread canine pack hunter. More timid than a " -"wolf, it is an opportunistic feeder and prefers to hunt smaller and weaker " -"prey, but is typically timid around humans." +"This is a huge, slimy worm-like creature. Its pale, flattened head drips an " +"oily mucus as it breaches the ground, searching for prey. Its pinkish mouth " +"opens and closes, revealing long fangs glistening with ropey strands of " +"saliva, which leave smoldering stains wherever they drip. The mere sight of " +"its putrid whitish visage is enough to loose prehistoric terrors within the " +"darkest recesses of your mind." msgstr "" #: lang/json/MONSTER_from_json.py -msgid "fawn" +msgid "grim howler" msgstr "" -#. ~ Description for fawn +#. ~ Description for grim howler #: lang/json/MONSTER_from_json.py msgid "" -"A juvenile northern woodland white-tailed deer, a quick and strong grazing " -"animal. Favored prey of coyotes, wolves, and giant spider mutants." +"A zombified wolf. Its mouth oozes with a black substance, coating the " +"vicious-looking white fangs." msgstr "" #: lang/json/MONSTER_from_json.py -msgid "deer" +msgid "zombear" msgstr "" -#. ~ Description for deer +#. ~ Description for zombear #: lang/json/MONSTER_from_json.py msgid "" -"The northern woodland white-tailed deer, a quick and strong grazing animal. " -"Favored prey of coyotes, wolves, and giant spider mutants." +"This black bear's eyes ooze with dark, oily fluid, and its flesh is torn and " +"scarred. It shuffles as it walks." msgstr "" -#: lang/json/MONSTER_from_json.py -msgid "Labrador mutt" +#: lang/json/MONSTER_from_json.py lang/json/snippet_from_json.py +msgid "zombie" msgstr "" -#. ~ Description for Labrador mutt +#. ~ Description for zombie #: lang/json/MONSTER_from_json.py msgid "" -"This once-average Labrador mixed breed dog has clearly gone feral. Though " -"it likely still instinctually trusts humans, it's probably far from domestic " -"by now." +"A human body, swaying as it moves, an unstoppable rage visible in its oily " +"black eyes." msgstr "" #: lang/json/MONSTER_from_json.py -msgid "Labrador puppy" +msgid "acidic zombie" msgstr "" -#. ~ Description for Labrador puppy +#. ~ Description for acidic zombie #: lang/json/MONSTER_from_json.py msgid "" -"An adorable, defenseless Labrador puppy. Much safer to tame than an adult " -"dog." +"A sickly-looking dead one. Its skin looks especially thin, with a sticky, " +"yellow fluid flowing through the clearly visible veins." msgstr "" #: lang/json/MONSTER_from_json.py -msgid "bulldog" +msgid "slavering biter" msgstr "" -#. ~ Description for bulldog +#. ~ Description for slavering biter #: lang/json/MONSTER_from_json.py msgid "" -"The American bulldog is a hardy, well built dog, that seems suited for " -"surviving the apocalypse." +"A distorted and swollen human body. Its jaws have elongated into a " +"crocodile like snout, dripping with foul smelling saliva." msgstr "" #: lang/json/MONSTER_from_json.py -msgid "bulldog puppy" +msgid "brainless zombie" msgstr "" -#. ~ Description for bulldog puppy +#. ~ Description for brainless zombie #: lang/json/MONSTER_from_json.py msgid "" -"An adorable, defenseless American bulldog puppy. Much safer to tame than an " -"adult dog." +"A zombie like any other, except that its features and skull have been " +"devastated. It's unclear what caused the damage, but between the scraps of " +"flesh you can see that its face and brain are gone, though its ears are " +"intact." msgstr "" #: lang/json/MONSTER_from_json.py -msgid "pit bull mix" +msgid "zombie brute" msgstr "" -#. ~ Description for pit bull mix +#. ~ Description for zombie brute #: lang/json/MONSTER_from_json.py msgid "" -"The oft-misunderstood pit bull is not actually a single breed but a label " -"for several kinds of terriers. It has average abilities, and is well-known " -"for its 'lock jaw' - which isn't real, but their incredible determination is." +"Its entire body bulges with distended muscles and swollen, festering wounds." msgstr "" #: lang/json/MONSTER_from_json.py -msgid "pit bull puppy" +msgid "zombie wrestler" msgstr "" -#. ~ Description for pit bull puppy +#. ~ Description for zombie wrestler #: lang/json/MONSTER_from_json.py msgid "" -"An adorable, defenseless pit bull puppy. Much safer to tame than an adult " -"dog." +"A slab of festering muscle the size of a well-toned bodybuilder. Seems " +"eager to strangle the life from you." msgstr "" #: lang/json/MONSTER_from_json.py -msgid "beagle" +msgid "zombie nightstalker" msgstr "" -#. ~ Description for beagle +#. ~ Description for zombie nightstalker #: lang/json/MONSTER_from_json.py msgid "" -"An adorable beagle that has managed to survive the apocalypse. Being agile " -"and small, they are difficult to shoot at. Generally attacks in packs." +"Somehow this brute hides in the dark like some kind of boogeyman. Very " +"agile for such a large zombie." msgstr "" #: lang/json/MONSTER_from_json.py -msgid "beagle puppy" +msgid "shocker brute" msgstr "" -#. ~ Description for beagle puppy +#. ~ Description for shocker brute #: lang/json/MONSTER_from_json.py msgid "" -"An adorable, defenseless beagle puppy. Much safer to tame than an adult dog." +"A huge beast covered in visible scarring from what you can only guess was " +"'research'. Being near it, you can hear a slight humming, like that of an " +"electrical transformer." msgstr "" #: lang/json/MONSTER_from_json.py -msgid "border collie" +msgid "incandescent husk" msgstr "" -#. ~ Description for border collie +#. ~ Description for incandescent husk #: lang/json/MONSTER_from_json.py msgid "" -"An athletic and hyperactive dog that loves to herd animals and jump, the " -"Border Collie is an agile attacker. Although they can be easy to train, " -"they don't work well in packs." +"This once-human is visible only as a glowing white silhouette that you have " +"to squint to see, cloaked in a crackling field of lightning that pulses like " +"a beating heart. It walks slowly and deliberately, the thunderstorm " +"surrounding it eagerly jumping to anything conductive within its grasp." msgstr "" #: lang/json/MONSTER_from_json.py -msgid "border collie puppy" +msgid "zombie cop" msgstr "" -#. ~ Description for border collie puppy +#. ~ Description for zombie cop #: lang/json/MONSTER_from_json.py msgid "" -"An adorable, defenseless Border Collie puppy. Much safer to tame than an " -"adult dog." +"A human body covered by a weather-beaten and badly damaged set of riot gear." msgstr "" #: lang/json/MONSTER_from_json.py -msgid "boxer mastiff" +msgid "corrosive zombie" msgstr "" -#. ~ Description for boxer mastiff +#. ~ Description for corrosive zombie #: lang/json/MONSTER_from_json.py msgid "" -"An ordinary breed full of affection, the boxer mastiff doesn't otherwise " -"stand out amongst other dogs with its capabilities." +"This body has swollen to immense proportions, but still manages to hold " +"itself together with semi-congealed acid all over its bloated body. It " +"clumsily moves around, but attacks with a large reserve of acid." msgstr "" #: lang/json/MONSTER_from_json.py -msgid "boxer puppy" +msgid "The corrosive zombie spits a glob of acid!" msgstr "" -#. ~ Description for boxer puppy +#: lang/json/MONSTER_from_json.py +msgid "crawling zombie" +msgstr "" + +#. ~ Description for crawling zombie #: lang/json/MONSTER_from_json.py msgid "" -"An adorable, defenseless boxer puppy. Much safer to tame than an adult dog." +"This human corpse drags itself along slowly with its arms. Its legs are " +"damaged beyond repair." msgstr "" #: lang/json/MONSTER_from_json.py -msgid "Chihuahua" +msgid "zombie dancer" msgstr "" -#. ~ Description for Chihuahua +#. ~ Description for zombie dancer #: lang/json/MONSTER_from_json.py msgid "" -"It's a tiny Chihuahua. How it has managed to survive is a miracle, although " -"its small size and aggressive nature may have proven useful." +"The foulest stench is in the air, \n" +"The funk of forty thousand years, \n" +"And grisly ghouls from every tomb, \n" +"Are closing in to seal your doom!\n" +"\n" +"The dancer doesn't even notice you, it seems like something nearby is " +"controlling it." msgstr "" #: lang/json/MONSTER_from_json.py -msgid "Chihuahua puppy" +msgid "zombie dog" msgstr "" -#. ~ Description for Chihuahua puppy +#. ~ Description for zombie dog #: lang/json/MONSTER_from_json.py msgid "" -"An adorable, defenseless Chihuahua puppy. Much safer to tame than an adult " -"dog." +"The deformed, animated corpse of a canine, a sinewy beast which can easily " +"outpace its two-legged friends." msgstr "" #: lang/json/MONSTER_from_json.py -msgid "dachshund" +msgid "listener zombie" msgstr "" -#. ~ Description for dachshund +#. ~ Description for listener zombie #: lang/json/MONSTER_from_json.py msgid "" -"A wiener dog! This awkward looking dog can be a useful watchdog, plus it " -"looks adorable as it bumbles around. Its tiny size also makes it hard to " -"shoot (you monster)." +"The head of this zombie was once obviously destroyed, the gaps in its scraps " +"of face now filling with a peculiar gray goo. Human ears hang from the " +"sides, enormous and unsettling. Thin slits at the front suggest it may be " +"able to see." msgstr "" #: lang/json/MONSTER_from_json.py -msgid "dachshund puppy" +msgid "shocker zombie" msgstr "" -#. ~ Description for dachshund puppy +#. ~ Description for shocker zombie #: lang/json/MONSTER_from_json.py -msgid "" -"An adorable, defenseless dachshund puppy. Much safer to tame than an adult " -"dog." +msgid "A human body with pale blue flesh, crackling with electrical energy." msgstr "" #: lang/json/MONSTER_from_json.py -msgid "German shepherd" +msgid "fat zombie" msgstr "" -#. ~ Description for German shepherd +#. ~ Description for fat zombie #: lang/json/MONSTER_from_json.py msgid "" -"The original K-9 breed. An easy to train and great attack dog that will " -"also defend its owner to the death, however they don't work well in packs." +"Stumbling as it moves, this corpse of an overweight human regards its " +"surroundings with an empty black gaze." msgstr "" #: lang/json/MONSTER_from_json.py -msgid "German shepherd puppy" +msgid "fiend" msgstr "" -#. ~ Description for German shepherd puppy +#. ~ Description for fiend #: lang/json/MONSTER_from_json.py msgid "" -"An adorable, defenseless German shepherd puppy. Much safer to tame than an " -"adult dog." +"Charred zombie with bony plates, spikes and protrusions. Moves stiffly, but " +"swiftly." msgstr "" #: lang/json/MONSTER_from_json.py -msgid "Great Pyrenees" +msgid "firefighter zombie" msgstr "" -#. ~ Description for Great Pyrenees +#. ~ Description for firefighter zombie #: lang/json/MONSTER_from_json.py msgid "" -"A large and powerful breed, the Great Pyrenees has a beautiful, thick white " -"coat. Originally bred to deter wolves and other predators, now faced with " -"protecting livestock from shambling hordes of undead." +"A decaying human body clad in tattered firefighting gear. It staggers " +"aimlessly, reeking of smoke and decay." msgstr "" #: lang/json/MONSTER_from_json.py -msgid "Great Pyrenees puppy" +msgid "fungal zombie" msgstr "" -#. ~ Description for Great Pyrenees puppy +#. ~ Description for fungal zombie #: lang/json/MONSTER_from_json.py msgid "" -"An adorable, defenseless Great Pyrenees puppy. Much safer to tame than an " -"adult dog." +"Once human, fungal tendrils now sprout from its mouth, eyes, and other " +"orifices, holding together a shambling mass of mold-covered flesh." msgstr "" #: lang/json/MONSTER_from_json.py -msgid "rottweiler" +msgid "bloated zombie" msgstr "" -#. ~ Description for rottweiler +#. ~ Description for bloated zombie #: lang/json/MONSTER_from_json.py msgid "" -"A terrifying breed to face feral, Rottweilers are descended from Roman " -"legion mastiffs. It's robust, vicious, and quite capable of mauling a human " -"to death." +"With its gray skin swollen to near rupture with putrid gas, this cyst " +"covered zombie looks like it could violently burst under the slightest of " +"disturbances." msgstr "" #: lang/json/MONSTER_from_json.py -msgid "rottweiler puppy" +msgid "grabber zombie" msgstr "" -#. ~ Description for rottweiler puppy +#. ~ Description for grabber zombie #: lang/json/MONSTER_from_json.py msgid "" -"An adorable, defenseless Rottweiler puppy. Much safer to tame than an adult " -"dog." +"A deformed human body, once living. Its arms dangle from its sides like the " +"limbs of some skinless ape, mindlessly groping at their surroundings." msgstr "" #: lang/json/MONSTER_from_json.py -msgid "cattle dog" +msgid "grappler zombie" msgstr "" -#. ~ Description for cattle dog +#. ~ Description for grappler zombie #: lang/json/MONSTER_from_json.py msgid "" -"An agile and sturdy breed that is welcome on any farm, the Australian cattle " -"dog is adept at leaping fences and herding livestock." +"An undead humanoid, its elongated arms drag along the ground as it moves. " +"It looks to almost have a hunch from the swollen back and shoulder muscles " +"tearing though its skin." msgstr "" #: lang/json/MONSTER_from_json.py -msgid "cattle dog puppy" +msgid "hazmat zombie" msgstr "" -#. ~ Description for cattle dog puppy +#. ~ Description for hazmat zombie #: lang/json/MONSTER_from_json.py msgid "" -"An adorable, defenseless Australian cattle dog puppy. Much safer to tame " -"than an adult dog." +"This zombie's face and body is completely covered by a protective suit. It " +"wanders around, unsteadily." msgstr "" #: lang/json/MONSTER_from_json.py -msgid "fox" -msgid_plural "foxes" -msgstr[0] "" -msgstr[1] "" - -#. ~ Description for fox -#: lang/json/MONSTER_from_json.py -msgid "" -"A small omnivorous canine with an almost cat-like manner. It is a solitary " -"hunter, and one of the only canids able to climb trees." +msgid "zombie hollow" msgstr "" -#. ~ Description for fox +#. ~ Description for zombie hollow #: lang/json/MONSTER_from_json.py msgid "" -"The red fox, an omnivorous canine and largest of the true foxes, it is a " -"wily hunter with a combative, suspicious temperament." +"Black hollow eyes survey the surroundings as the zombie stretches and bends " +"in ways that whoever the original body belonged to never could. The only " +"thing that seems solid, on this flexible black-veined body, is the rows of " +"sharp black teeth. You get the feeling that the only human thing remaining " +"is the skin, worn as one would wear clothes." msgstr "" #: lang/json/MONSTER_from_json.py -msgid "groundhog" +msgid "zombie hulk" msgstr "" -#. ~ Description for groundhog +#. ~ Description for zombie hulk #: lang/json/MONSTER_from_json.py msgid "" -"Also known as the woodchuck, this ground squirrel has no actual talent for " -"chucking wood." +"A human body now swollen to the size of six men, with arms as wide as a " +"trash can." msgstr "" #: lang/json/MONSTER_from_json.py -msgid "jackrabbit" +msgid "feral hunter" msgstr "" -#. ~ Description for jackrabbit +#. ~ Description for feral hunter #: lang/json/MONSTER_from_json.py msgid "" -"The snowshoe hare, a small grass-eater with a brown fur coat that changes to " -"white in the wintertime." +"This once-human body is barely recognizable, scrambling about on all fours, " +"its nails and teeth both sharpened into dangerous looking spikes." msgstr "" #: lang/json/MONSTER_from_json.py -msgid "horse" +msgid "Thriller" msgstr "" -#. ~ Description for horse +#. ~ Description for Thriller #: lang/json/MONSTER_from_json.py msgid "" -"A hooved grazing mammal with a mane of hair, a sweeping tail, and powerful-" -"looking muscles." +"And though you fight to stay alive, \n" +"Your body starts to shiver. \n" +"For no mere mortal can resist, \n" +"The evil of the thriller." msgstr "" #: lang/json/MONSTER_from_json.py -msgid "lemming" +msgid "zombie snapper" msgstr "" -#. ~ Description for lemming +#. ~ Description for zombie snapper #: lang/json/MONSTER_from_json.py msgid "" -"The Northern bog lemming, a small, predominantly vegetarian rodent that " -"spends its life in the murk of swamps and other wetlands. Contrary to " -"popular belief, these creatures are not particularly hapless or suicidal, " -"but they can eat themselves into scarcity within a few generations." +"With a crocodile-like snout and rows of protruding teeth, this swimwear-clad " +"zombie lurks in the water." msgstr "" #: lang/json/MONSTER_from_json.py -msgid "mink" +msgid "zombie master" msgstr "" -#. ~ Description for mink +#. ~ Description for zombie master #: lang/json/MONSTER_from_json.py msgid "" -"The American mink, a partially aquatic weasel, once factory-farmed for its " -"fur. It is a capable fisher, but the presence of otters in these parts " -"makes it rely more on food from the land." +"Once human, its features have tightened, its lips pulled back into an " +"unnatural grin, revealing rows of blackened teeth beneath its large, " +"piercing eyes. It stands tall and its movements are fluid and tightly " +"controlled. A feeling of danger permeates the air around it, and the light " +"that falls on it seems somehow harsher and more glaring." msgstr "" #: lang/json/MONSTER_from_json.py -msgid "moose" +msgid "zombie necromancer" msgstr "" -#. ~ Description for moose +#. ~ Description for zombie necromancer #: lang/json/MONSTER_from_json.py msgid "" -"The Eastern moose, the largest living species of deer. While they aren't " -"aggressive unless angered, the mating season can make the bulls quite ill-" -"tempered." +"A twisted mockery of the human form, emaciated, with jet black skin and " +"glowing red eyes. It is somehow painful to look at, awakening fears deep " +"within your psyche, and even the air around it seems more sinister, somehow " +"darker and more dangerous." msgstr "" #: lang/json/MONSTER_from_json.py -msgid "muskrat" +msgid "festering boar" msgstr "" -#. ~ Description for muskrat +#. ~ Description for festering boar #: lang/json/MONSTER_from_json.py msgid "" -"A large omnivorous rodent with a thick furry pelt, found in wetlands across " -"the northern hemisphere. It marks its territory with a musky odor for which " -"it is named." +"A zombified omnivore descended from the wild boar. Now it's got black goo " +"all over it, instead of mud." msgstr "" #: lang/json/MONSTER_from_json.py -msgid "gigantic naked mole-rat" +msgid "feral predator" msgstr "" -#. ~ Description for gigantic naked mole-rat +#. ~ Description for feral predator #: lang/json/MONSTER_from_json.py msgid "" -"A huge, rumbling mutated mass of wrinkly, nearly translucent skin that has " -"been toughened by constant tunneling. Its hide is riddled with giant scabs, " -"as a pair of incisors the size of an industrial excavator's buckets gnash " -"constantly and several car-length whiskers twitch in the air. It regularly " -"makes high-pitched chirps as it roams around." +"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." msgstr "" #: lang/json/MONSTER_from_json.py -msgid "opossum" +msgid "decayed zombie" msgstr "" -#. ~ Description for opossum +#. ~ Description for decayed zombie #: lang/json/MONSTER_from_json.py msgid "" -"The Virginia opossum, a small omnivorous marsupial native to North America. " -"About the size of a cat, it is hardy and adaptive, and a fairly common sight " -"in urban areas." +"A once-dead human corpse. Its discolored swollen flesh is riddled with " +"festering wounds and open sores." msgstr "" #: lang/json/MONSTER_from_json.py -msgid "otter" +msgid "feral runner" msgstr "" -#. ~ Description for otter +#. ~ Description for feral runner #: lang/json/MONSTER_from_json.py msgid "" -"The North American river otter is a shy water dwelling relative of the " -"weasel, living in large families along the banks of streams. It is an " -"excellent fisher and a resourceful survivor, using the abandoned dens of " -"beavers and other animals to raise its own young." +"This recently-risen body moves quickly, darting its head back and forth and " +"gnawing at its hands." msgstr "" #: lang/json/MONSTER_from_json.py -msgid "piglet" +msgid "scorched zombie" msgstr "" -#. ~ Description for piglet -#. ~ Description for pig +#. ~ Description for scorched zombie #: lang/json/MONSTER_from_json.py msgid "" -"A domesticated omnivore descended from the wild boar, intelligent and " -"inquisitive. Left to its own devices, it has gone feral." +"Heavily burned zombie that still reeks of charred flesh. Its flesh has " +"mended into a leathery shell." msgstr "" #: lang/json/MONSTER_from_json.py -msgid "pig" +msgid "screecher zombie" msgstr "" +#. ~ Description for screecher zombie #: lang/json/MONSTER_from_json.py -msgid "rabbit" +msgid "" +"A thin corpse, its chest is swollen in what appears to be preparation. A " +"thick black ooze drips from its open mouth." msgstr "" -#. ~ Description for rabbit +#: lang/json/MONSTER_from_json.py +msgid "shady zombie" +msgstr "" + +#. ~ Description for shady zombie #: lang/json/MONSTER_from_json.py msgid "" -"A small mammal with a cute wiggling nose, cotton tail, and made of delicious " -"flesh." +"An uncanny shadow envelops this creature, as if light itself were too " +"repulsed to touch it. All you can make out is its shambling, human shaped " +"outline." msgstr "" #: lang/json/MONSTER_from_json.py -msgid "raccoon" +msgid "shrieker zombie" msgstr "" -#. ~ Description for raccoon +#. ~ Description for shrieker zombie #: lang/json/MONSTER_from_json.py msgid "" -"A small mammal native to North America, distinctive for its dexterous paws " -"and facial markings. It is resourceful and agile enough to open sealed " -"containers with its paws." +"An elongated human body with a swollen chest and a gaping hole where its jaw " +"used to be." msgstr "" #: lang/json/MONSTER_from_json.py -msgid "rat king" +msgid "skull zombie" msgstr "" -#. ~ Description for rat king +#. ~ Description for skull zombie #: lang/json/MONSTER_from_json.py msgid "" -"A towering swarm of mutated rats, their tails knotted together in a filthy " -"mass. A fetid stench flows from its filthy presence." +"This creature's head is a hideous gray skull, formed of human bone fragments " +"and some sort of goo. Jagged teeth are visible as the thing works its jaw " +"and disturbingly human, lidless eyes stare at you from their sockets. The " +"thing's fleshy ears are four sizes too large and droop under their own " +"weight." msgstr "" #: lang/json/MONSTER_from_json.py -msgid "sewer rat" +msgid "smoker zombie" msgstr "" -#. ~ Description for sewer rat +#. ~ Description for smoker zombie #: lang/json/MONSTER_from_json.py msgid "" -"A worm-tailed rodent with long whiskers and beady eyes. The way it squeaks " -"makes it sound... hungry." +"A blackened and twisted naked human body, strips of flesh hang from its " +"body, and it emits a constant haze of thick black smoke." msgstr "" #: lang/json/MONSTER_from_json.py -msgid "lamb" -msgid_plural "lambs" -msgstr[0] "" -msgstr[1] "" +msgid "spitter zombie" +msgstr "" -#. ~ Description for lamb +#. ~ Description for spitter zombie #: lang/json/MONSTER_from_json.py msgid "" -"A timid, hooved grazing mammal, and one of the first animals ever " -"domesticated. Its body is covered in a thick layer of wool, and the males " -"have long, spiraling horns." +"A hunched human body with its eyes pushed up into its forehead and drooping " +"cheeks, most of its face is occupied by a puckered mouth. Its stomach is " +"swollen and nearly translucent, with a sickly yellow tint." msgstr "" #: lang/json/MONSTER_from_json.py -msgid "sheep" -msgid_plural "sheep" -msgstr[0] "" -msgstr[1] "" +msgid "survivor zombie" +msgstr "" -#. ~ Description for sheep +#. ~ Description for survivor zombie #: lang/json/MONSTER_from_json.py msgid "" -"A timid, hooved grazing mammal, and one of the first animals ever " -"domesticated. Its body is covered in a thick layer of wool, and the males " -"have long, spiralling horns." +"Still wearing the tattered remnants of improvised armor and weaponry, it is " +"plain to see that this zombie was once a survivor like you." msgstr "" #: lang/json/MONSTER_from_json.py -msgid "squirrel" +msgid "swimmer zombie" msgstr "" -#. ~ Description for squirrel +#. ~ Description for swimmer zombie #: lang/json/MONSTER_from_json.py msgid "" -"A small granivorous rodent with a long bushy tail, often seen darting amid " -"the branches of trees. A skittish varmint with an expression of unwavering " -"austerity, it is the mortal enemy of cat and dog alike." +"A slick and glistening human body. Its hands and feet are webbed, and it is " +"clad in swimwear." msgstr "" -#. ~ Description for squirrel +#: lang/json/MONSTER_from_json.py +msgid "zombie technician" +msgstr "" + +#. ~ Description for zombie technician #: lang/json/MONSTER_from_json.py msgid "" -"A tiny opportunistic rodent with a long bushy tail. The pine squirrel is " -"clever and cute, and hunted by nearly everything in the woods with a taste " -"for meat." +"Still wearing its work clothes and hardhat, this zombie likely used to work " +"on power lines or other electrical equipment." msgstr "" #: lang/json/MONSTER_from_json.py -msgid "weasel" +msgid "thorny shambler" msgstr "" -#. ~ Description for weasel +#. ~ Description for thorny shambler #: lang/json/MONSTER_from_json.py msgid "" -"The long-tailed weasel, a small but ubiquitous predator whose range extends " -"across the continent. It forms its den in small burrows, preferring to " -"occupy the nesting holes of its prey." +"A shambling undead humanoid, body overgrown with a tangled mass of " +"otherworldly vegetation. Hunched over and dragging its feet as it moves, " +"the bramble utterly enveloping its upper half twitches and moves with a life " +"of its own, tendrils tipped with a paralytic sting." msgstr "" #: lang/json/MONSTER_from_json.py -msgid "wolf" -msgid_plural "wolves" -msgstr[0] "" -msgstr[1] "" +msgid "tough zombie" +msgstr "" -#. ~ Description for wolf +#. ~ Description for tough zombie #: lang/json/MONSTER_from_json.py msgid "" -"A cunning pack predator, once extinct in the New England area, the wolf was " -"successfully reintroduced and their numbers reached record highs in the " -"decade before the Cataclysm. Lucky you." +"Once an athletic human, now a brutal monster. Its facial features are " +"twisted into an expression of pure rage." msgstr "" #: lang/json/MONSTER_from_json.py -msgid "marloss zealot" +msgid "zombeaver" msgstr "" -#. ~ Description for marloss zealot +#. ~ Description for zombeaver #: lang/json/MONSTER_from_json.py msgid "" -"Her eyes lie vacant and spittle foams in her mouth, as she recites from the " -"hymns in rapturous ecstasy." +"This wall-eyed beast has a large wound on its side, and ribs with some flesh " +"on them are seen through it. The most prominent feature of this abomination " +"is large incisors in its ominously open mouth, strange black goo is oozing " +"out of it. Seems like it isn't interested in trees anymore and is looking " +"for some warm fresh to feed." msgstr "" -#. ~ Description for marloss zealot +#: lang/json/MONSTER_from_json.py +msgid "antlered horror" +msgstr "" + +#. ~ Description for antlered horror #: lang/json/MONSTER_from_json.py msgid "" -"His eyes lie vacant and spittle foams in his mouth, as he recites from the " -"hymns in rapturous ecstasy." +"This formerly-majestic moose has succumbed to the infection which is killing " +"the world. Shiny green blowflies swarm the vast suppurated patches of " +"purulent flesh where its skin has sloughed away, and its remaining fur is " +"black and matted with necrotic discharge." msgstr "" #: lang/json/MONSTER_from_json.py -msgid "laser turret" +msgid "decayed pouncer" msgstr "" -#. ~ Description for laser turret +#. ~ Description for decayed pouncer #: lang/json/MONSTER_from_json.py msgid "" -"The TX-5LR Cerberus is an upgrade to its predecessors. It features a state " -"of the art revolving laser cannon system with three barrels that charge from " -"solar cells embedded in its hull." +"An otherwise normal-looking cougar, except that its hind legs are swollen, " +"and its eyes bulge with black goo." msgstr "" #: lang/json/MONSTER_from_json.py -msgid "antimateriel turret" +msgid "skeletal juggernaut" msgstr "" -#. ~ Description for antimateriel turret +#. ~ Description for skeletal juggernaut #: lang/json/MONSTER_from_json.py msgid "" -"Leadworks LLC's T-107A1 Interdictor, an automated .50BMG antimateriel " -"rifle. Credited with forestalling countless car-bombing attempts, it has " -"always been kept under extremely tight control, so as to itself maintain " -"extremely tight control of its area. And then the Cataclysm struck." +"This hideous golem of plated bones and misshapen flesh drags its heavy, " +"pointed limbs behind it like an unwanted burden. Formerly soft and " +"vulnerable, bones grew around its form to protect it - only, they kept " +"growing. And growing. And growing." msgstr "" #: lang/json/MONSTER_from_json.py -msgid "milspec turret" +msgid "ancient red dragon" msgstr "" -#. ~ Description for milspec turret +#. ~ Description for ancient red dragon #: lang/json/MONSTER_from_json.py msgid "" -"Leadworks LLC's T-4A1 Sentry. It features improved firmware over General " -"Atomics' TX-1 9x19mm model and an automated M4 carbine." +"A towering, hulking dragon, with tremendous, curving horns and shining red " +"scales, its glowing maw peeled back in a hateful grimace as its eyes bore " +"into yours." msgstr "" #: lang/json/MONSTER_from_json.py @@ -50850,7 +51480,7 @@ msgstr "" #. ~ Description for zombie security guard #: lang/json/MONSTER_from_json.py msgid "" -"A shambling human corpse wearing a grey uniform and bulletproof vest with " +"A shambling human corpse wearing a gray uniform and bulletproof vest with " "\"SECURITY\" emblazoned across the front. It looks like the guard was quite " "physically fit before its death; it moves quickly and powerfully, albeit " "clumsily." @@ -52871,6 +53501,152 @@ msgid "" "You could put this on a friendly dog." msgstr "" +#: lang/json/PET_ARMOR_from_json.py +msgid "Kevlar-lined horse peto" +msgstr "" + +#. ~ Description for Kevlar-lined horse peto +#: lang/json/PET_ARMOR_from_json.py +msgid "" +"A heavy mattress-like armor of cloth, leather and thick linings of Kevlar, " +"originally used as protection in bullfighting. You could put this on a " +"friendly horse." +msgstr "" + +#: lang/json/PET_ARMOR_from_json.py +msgid "biosilicified chitin horse body armor" +msgstr "" + +#. ~ Description for biosilicified chitin horse body armor +#: lang/json/PET_ARMOR_from_json.py +msgid "" +"A makeshift assembly of criniere, peytral and croupiere made from " +"biosilicified chitin fitted to a thin mesh. You could put this on a " +"friendly horse." +msgstr "" + +#: lang/json/PET_ARMOR_from_json.py +msgid "chitin horse body armor" +msgstr "" + +#. ~ Description for chitin horse body armor +#: lang/json/PET_ARMOR_from_json.py +msgid "" +"A makeshift assembly of criniere, peytral and croupiere made from chitin " +"fitted to a thin mesh. You could put this on a friendly horse." +msgstr "" + +#: lang/json/PET_ARMOR_from_json.py +msgid "chainmail horse coat" +msgstr "" + +#. ~ Description for chainmail horse coat +#: lang/json/PET_ARMOR_from_json.py +msgid "" +"A heavy covering of chainmail, suitably made for horses as protection. You " +"could put this on a friendly horse." +msgstr "" + +#: lang/json/PET_ARMOR_from_json.py +msgid "boiled leather horse barding with caparison" +msgstr "" + +#. ~ Description for boiled leather horse barding with caparison +#: lang/json/PET_ARMOR_from_json.py +msgid "" +"A full barding for horses consisting of boiled leather and cloth " +"undercovering. This caparison is depicting a battle between a monstrous " +"dragon and regal griffin. You could put this on a friendly horse." +msgstr "" + +#: lang/json/PET_ARMOR_from_json.py +msgid "" +"A full barding for horses consisting of boiled leather and cloth " +"undercovering. This caparison is depicting a red dragon breathing fire on " +"cities. You could put this on a friendly horse." +msgstr "" + +#: lang/json/PET_ARMOR_from_json.py +msgid "" +"A full barding for horses consisting of boiled leather and cloth " +"undercovering. This caparison is depicting a bear on its hind legs and " +"forelegs outstretched in a menacing manner. You could put this on a " +"friendly horse." +msgstr "" + +#: lang/json/PET_ARMOR_from_json.py +msgid "" +"A full barding for horses consisting of boiled leather and cloth " +"undercovering. This caparison is depicting an assortment of fruits and " +"vegetables with a very large orange featured in the foreground. You could " +"put this on a friendly horse." +msgstr "" + +#: lang/json/PET_ARMOR_from_json.py +msgid "" +"A full barding for horses consisting of boiled leather and cloth " +"undercovering. This caparison is depicting a massive vulture perched on a " +"mountain. You could put this on a friendly horse." +msgstr "" + +#: lang/json/PET_ARMOR_from_json.py +msgid "" +"A full barding for horses consisting of boiled leather and cloth " +"undercovering. This caparison is depicting the mythical Erymanthian boar in " +"various artistic forms. You could put this on a friendly horse." +msgstr "" + +#: lang/json/PET_ARMOR_from_json.py +msgid "" +"A full barding for horses consisting of boiled leather and cloth " +"undercovering. This caparison seems to be sponsored by Rycon Construction, " +"with a tag line of \"From down under to your home, we play all the roles " +"from start to finish!\". You could put this on a friendly horse." +msgstr "" + +#: lang/json/PET_ARMOR_from_json.py +msgid "" +"A full barding for horses consisting of boiled leather and cloth " +"undercovering. This caparison seems to be sponsored by Core Generator Tech, " +"with a tag line of \"Providing power solutions from culinary to graphic " +"design, we have the magic touch for your problems!\". You could put this on " +"a friendly horse." +msgstr "" + +#: lang/json/PET_ARMOR_from_json.py +msgid "boiled leather horse barding with bones" +msgstr "" + +#. ~ Description for boiled leather horse barding with bones +#: lang/json/PET_ARMOR_from_json.py +msgid "" +"Decorative bones affixed to leather horse barding to invoke fear in bandits " +"and raiders and traders all! You could put this on a friendly horse." +msgstr "" + +#: lang/json/PET_ARMOR_from_json.py +msgid "horse rain sheet" +msgstr "" + +#. ~ Description for horse rain sheet +#: lang/json/PET_ARMOR_from_json.py +msgid "" +"A thin plastic covering adapted for horses to protect from acid rain and " +"other caustic sources. You could put this on a friendly horse." +msgstr "" + +#: lang/json/PET_ARMOR_from_json.py +msgid "superalloy crafted horse barding" +msgstr "" + +#. ~ Description for superalloy crafted horse barding +#: lang/json/PET_ARMOR_from_json.py +msgid "" +"The latest fashion statement and protection for polo equestrians and " +"ahistorical reenactor steeds alike, designed and manufactured by Land Dwarf " +"Industries. You could put this on a friendly horse." +msgstr "" + #: lang/json/SPELL_from_json.py msgid "Smite" msgstr "" @@ -52904,6 +53680,39 @@ msgid "" "your pain at bay." msgstr "" +#: lang/json/SPELL_from_json.py +msgid "Summon Zombie" +msgstr "" + +#. ~ Description for Summon Zombie +#: lang/json/SPELL_from_json.py +msgid "" +"An ethereal-looking zombie rises from the depths of the earth to fight for " +"you. You may be able to summon more with a higher level in this spell." +msgstr "" + +#: lang/json/SPELL_from_json.py +msgid "Summon Skeleton" +msgstr "" + +#. ~ Description for Summon Skeleton +#: lang/json/SPELL_from_json.py +msgid "" +"A ghostly skeleton rises from the depths of the earth to fight for you. You " +"may be able to summon more with a higher level in this spell." +msgstr "" + +#: lang/json/SPELL_from_json.py +msgid "Summon Decayed Pouncer" +msgstr "" + +#. ~ Description for Summon Decayed Pouncer +#: lang/json/SPELL_from_json.py +msgid "" +"A decrepit looking large cat rises from the depths of the earth to fight for " +"you. You may be able to summon more with a higher level in this spell." +msgstr "" + #: lang/json/SPELL_from_json.py msgid "Cure Light Wounds" msgstr "" @@ -53044,6 +53853,15 @@ msgstr "" msgid "This is a template to show off all the available values" msgstr "" +#: lang/json/SPELL_from_json.py +msgid "Spawn Debug Monsters" +msgstr "" + +#. ~ Description for Spawn Debug Monsters +#: lang/json/SPELL_from_json.py +msgid "Set level to number of monsters spawned." +msgstr "" + #: lang/json/SPELL_from_json.py msgid "Debug Stamina Spell" msgstr "" @@ -53053,6 +53871,15 @@ msgstr "" msgid "Uses a little stamina" msgstr "" +#: lang/json/SPELL_from_json.py +msgid "Debug Fatigue Spell" +msgstr "" + +#. ~ Description for Debug Fatigue Spell +#: lang/json/SPELL_from_json.py +msgid "Uses a little fatigue" +msgstr "" + #: lang/json/SPELL_from_json.py msgid "Debug HP Spell" msgstr "" @@ -53135,6 +53962,28 @@ msgid "" "This allows you to recover fatige quickly in exchange for mana." msgstr "" +#: lang/json/SPELL_from_json.py +msgid "Bag of Cats" +msgstr "" + +#. ~ Description for Bag of Cats +#: lang/json/SPELL_from_json.py +msgid "Are you the crazy cat lady?" +msgstr "" + +#: lang/json/SPELL_from_json.py +msgid "Cause Bear" +msgstr "" + +#. ~ Description for Cause Bear +#: lang/json/SPELL_from_json.py +msgid "" +"This spell appears to be very smudged. You're fairly sure the name should " +"be Cause Fear, but you're also fairly sure it won't have the desired effect " +"because the instructions are hardly legible. No time like the Cataclysm to " +"find out, though!" +msgstr "" + #: lang/json/SPELL_from_json.py msgid "Stonefist" msgstr "" @@ -53168,6 +54017,47 @@ msgid "" "mana is converted to stamina." msgstr "" +#: lang/json/SPELL_from_json.py +msgid "Shardspray" +msgstr "" + +#. ~ Description for Shardspray +#: lang/json/SPELL_from_json.py +msgid "" +"This spell projects a wide spray of sharp metal shards, cutting into your " +"foes and friends alike." +msgstr "" + +#: lang/json/SPELL_from_json.py +msgid "Piercing Bolt" +msgstr "" + +#. ~ Description for Piercing Bolt +#: lang/json/SPELL_from_json.py +msgid "" +"This spell projects a piercing rod of conjured iron at those that dare " +"oppose you." +msgstr "" + +#: lang/json/SPELL_from_json.py +msgid "Shardstorm" +msgstr "" + +#. ~ Description for Shardstorm +#: lang/json/SPELL_from_json.py +msgid "" +"Creates an omnidirectional spray of razor sharp metal shards all around you." +msgstr "" + +#: lang/json/SPELL_from_json.py +msgid "Rockbolt" +msgstr "" + +#. ~ Description for Rockbolt +#: lang/json/SPELL_from_json.py +msgid "Fires a conjured stone projectile at high velocity." +msgstr "" + #: lang/json/SPELL_from_json.py msgid "Point Flare" msgstr "" @@ -53318,6 +54208,55 @@ msgid "" "damage to all creatures in the affected area." msgstr "" +#: lang/json/SPELL_from_json.py +msgid "Mana Blast" +msgstr "" + +#. ~ Description for Mana Blast +#: lang/json/SPELL_from_json.py +msgid "A blast of concentrated magical power that obliterates a large area." +msgstr "" + +#: lang/json/SPELL_from_json.py +msgid "Mana Bolt" +msgstr "" + +#. ~ Description for Mana Bolt +#: lang/json/SPELL_from_json.py +msgid "A bolt of magical power that only damages your foes." +msgstr "" + +#: lang/json/SPELL_from_json.py +msgid "Haste" +msgstr "" + +#. ~ Description for Haste +#: lang/json/SPELL_from_json.py +msgid "" +"This spell gives you an enormous boost of speed lasting a short period of " +"time." +msgstr "" + +#: lang/json/SPELL_from_json.py +msgid "Mana Beam" +msgstr "" + +#. ~ Description for Mana Beam +#: lang/json/SPELL_from_json.py +msgid "A beam of focused magical power that damages any foes in its path." +msgstr "" + +#: lang/json/SPELL_from_json.py +msgid "Escape" +msgstr "" + +#. ~ Description for Escape +#: lang/json/SPELL_from_json.py +msgid "" +"Teleports you in a random direction a medium distance, to help escape your " +"foes in dangerous situations." +msgstr "" + #: lang/json/SPELL_from_json.py msgid "Jolt" msgstr "" @@ -53423,9 +54362,9 @@ msgstr[1] "" #. ~ Description for UPS conversion mod #: lang/json/TOOLMOD_from_json.py msgid "" -"This device replaces conventional battery connections with a rechargeable " -"power cell that runs off of a Unified Power System. Having the UPS on or " -"placing a tool in a special recharging station will slowly charge it." +"This device replaces conventional battery connections with a connector port " +"that can plug into a UPS. Any device modified with this can be used without " +"a battery as long as you have a charged UPS with you." msgstr "" #: lang/json/TOOLMOD_from_json.py @@ -54187,9 +55126,9 @@ msgstr[1] "" #. ~ Description for pair of light amp goggles (on) #: lang/json/TOOL_ARMOR_from_json.py msgid "" -"A pair of battery-powered goggles that amplify ambient light, allowing you " -"to see in the dark. It is turned on, and continually draining batteries. " -"Use it to turn them off." +"A pair of battery-powered light amplifying goggles with an infrared " +"illuminator, allowing you to see in the dark. It is turned on, and " +"continually draining batteries. Use it to turn them off." msgstr "" #: lang/json/TOOL_ARMOR_from_json.py @@ -54784,6 +55723,19 @@ msgid "" "when not playing." msgstr "" +#: lang/json/TOOL_ARMOR_from_json.py +msgid "electric guitar" +msgid_plural "electric guitars" +msgstr[0] "" +msgstr[1] "" + +#. ~ Description for electric guitar +#: lang/json/TOOL_ARMOR_from_json.py +msgid "" +"A standard factory-made electric guitar. It's probably better at smashing " +"heads than melting faces, these days. Has a strap." +msgstr "" + #: lang/json/TOOL_ARMOR_from_json.py msgid "bagpipes" msgid_plural "bagpipes" @@ -55040,6 +55992,35 @@ msgid "" "toasty while it lasts." msgstr "" +#: lang/json/TOOL_ARMOR_from_json.py +msgid "Foodperson mask" +msgid_plural "Foodperson masks" +msgstr[0] "" +msgstr[1] "" + +#. ~ Use action msg for Foodperson mask. +#: lang/json/TOOL_ARMOR_from_json.py +msgid "" +"Your HUD lights-up: \"Greetings Foodperson, your shift begins now. Good " +"luck!\"" +msgstr "" + +#. ~ Use action need_charges_msg for Foodperson mask. +#: lang/json/TOOL_ARMOR_from_json.py +msgid "The mask's batteries are dead." +msgstr "" + +#. ~ Description for Foodperson mask +#: lang/json/TOOL_ARMOR_from_json.py +msgid "Foodperson, the mascot your stomach deserves!" +msgstr "" + +#: lang/json/TOOL_ARMOR_from_json.py +msgid "Foodperson mask (on)" +msgid_plural "Foodperson masks (on)" +msgstr[0] "" +msgstr[1] "" + #: lang/json/TOOL_ARMOR_from_json.py msgid "hazardous environment helmet" msgid_plural "hazardous environment helmets" @@ -55415,6 +56396,26 @@ msgid_plural "bionic firestarters" msgstr[0] "" msgstr[1] "" +#: lang/json/TOOL_from_json.py +msgid "glass shard" +msgid_plural "glass shards" +msgstr[0] "" +msgstr[1] "" + +#. ~ Use action done_message for glass shard. +#: lang/json/TOOL_from_json.py +msgid "" +"You carefully place the shards on the ground, ready to be cracked by " +"something passing by." +msgstr "" + +#. ~ Description for glass shard +#: lang/json/TOOL_from_json.py +msgid "" +"A broken shard of glass covered in sharp edges. You could use it as a " +"weapon, but you might want to wear gloves." +msgstr "" + #: lang/json/TOOL_from_json.py msgid "cash card" msgid_plural "cash cards" @@ -55766,6 +56767,32 @@ msgid "" "made." msgstr "" +#: lang/json/TOOL_from_json.py +msgid "grip hook" +msgid_plural "grip hooks" +msgstr[0] "" +msgstr[1] "" + +#. ~ Description for grip hook +#: lang/json/TOOL_from_json.py +msgid "" +"A simple steel meathook with a circular steel handle. Makes a passable melee " +"weapon." +msgstr "" + +#: lang/json/TOOL_from_json.py +msgid "pair of butterfly swords" +msgid_plural "pairs of butterfly swords" +msgstr[0] "" +msgstr[1] "" + +#. ~ Description for pair of butterfly swords +#: lang/json/TOOL_from_json.py +msgid "" +"This is a matched pair of traditional Shaolin butterfly swords. They are " +"about the size of machetes but have hand guards and wider blades." +msgstr "" + #: lang/json/TOOL_from_json.py msgid "folded poncho" msgid_plural "folded ponchos" @@ -57260,18 +58287,18 @@ msgid "" msgstr "" #: lang/json/TOOL_from_json.py -msgid "smartphone - flashlight" -msgid_plural "smartphones - flashlight" +msgid "smartphone - Flashlight" +msgid_plural "smartphones - Flashlight" msgstr[0] "" msgstr[1] "" -#. ~ Use action menu_text for smartphone - flashlight. +#. ~ Use action menu_text for smartphone - Flashlight. #. ~ Use action menu_text for atomic smartphone - Flashlight. #: lang/json/TOOL_from_json.py msgid "Turn off flashlight" msgstr "" -#. ~ Use action msg for smartphone - flashlight. +#. ~ Use action msg for smartphone - Flashlight. #. ~ Use action msg for atomic smartphone - Flashlight. #: lang/json/TOOL_from_json.py msgid "You deactivate the flashlight app." @@ -59173,6 +60200,12 @@ msgid "" "You can also use a lighter to light nearby items on fire." msgstr "" +#: lang/json/TOOL_from_json.py +msgid "lightstrip_base" +msgid_plural "lightstrip_bases" +msgstr[0] "" +msgstr[1] "" + #: lang/json/TOOL_from_json.py msgid "lightstrip" msgid_plural "lightstrips" @@ -61993,6 +63026,56 @@ msgid "" "to a proper axe." msgstr "" +#: lang/json/TOOL_from_json.py +msgid "pin reamer" +msgid_plural "pin reamers" +msgstr[0] "" +msgstr[1] "" + +#. ~ Description for pin reamer +#: lang/json/TOOL_from_json.py +msgid "" +"Handheld pin reamers of this kind are used to enlarge existing holes, or " +"remove any burs and such from them." +msgstr "" + +#: lang/json/TOOL_from_json.py +msgid "metal fileset" +msgid_plural "metal filesets" +msgstr[0] "" +msgstr[1] "" + +#. ~ Description for metal fileset +#: lang/json/TOOL_from_json.py +msgid "" +"These tools are commonly used to remove small amounts of materials from the " +"surface of metal objects." +msgstr "" + +#: lang/json/TOOL_from_json.py +msgid "angular grinder" +msgid_plural "angular grinders" +msgstr[0] "" +msgstr[1] "" + +#. ~ Description for angular grinder +#: lang/json/TOOL_from_json.py +msgid "" +"This widespread powertool is often used for removing excess material or " +"polishing surfaces." +msgstr "" + +#: lang/json/TOOL_from_json.py +msgid "hand vice" +msgid_plural "hand vices" +msgstr[0] "" +msgstr[1] "" + +#. ~ Description for hand vice +#: lang/json/TOOL_from_json.py +msgid "This small handheld metal vice is useful for keeping things still." +msgstr "" + #: lang/json/TOOL_from_json.py lang/json/vehicle_part_from_json.py msgid "military black box" msgid_plural "military black boxes" @@ -65721,6 +66804,10 @@ msgstr "" msgid ".454" msgstr "" +#: lang/json/ammunition_type_from_json.py +msgid ".45 Colt" +msgstr "" + #: lang/json/ammunition_type_from_json.py msgid ".500" msgstr "" @@ -67204,6 +68291,50 @@ msgstr "" msgid "It's inflamed." msgstr "" +#: lang/json/construction_category_from_json.py src/advanced_inv.cpp +#: src/armor_layers.cpp src/options.cpp src/scenario.cpp +msgid "All" +msgstr "" + +#: lang/json/construction_category_from_json.py src/init.cpp +#: src/init.cpp +msgid "Constructions" +msgstr "" + +#: lang/json/construction_category_from_json.py src/init.cpp +msgid "Furniture" +msgstr "" + +#: lang/json/construction_category_from_json.py +msgid "Digging and Mining" +msgstr "" + +#: lang/json/construction_category_from_json.py src/iuse_actor.cpp +msgid "Repairing" +msgstr "" + +#: lang/json/construction_category_from_json.py src/iuse_actor.cpp +msgid "Reinforcing" +msgstr "" + +#: lang/json/construction_category_from_json.py +msgid "Decorative" +msgstr "" + +#: lang/json/construction_category_from_json.py +msgid "Farming and Woodcutting" +msgstr "" + +#: lang/json/construction_category_from_json.py +msgid "Others" +msgstr "" + +#: lang/json/construction_category_from_json.py +#: lang/json/keybinding_from_json.py +#: src/construction.cpp src/veh_interact.cpp +msgid "Filter" +msgstr "" + #: lang/json/construction_from_json.py msgid "Deconstruct Furniture" msgstr "" @@ -67645,6 +68776,34 @@ msgstr "" msgid "Build Wardrobe" msgstr "" +#: lang/json/construction_from_json.py +msgid "Build Safe" +msgstr "" + +#: lang/json/construction_from_json.py +msgid "Build Dumpster" +msgstr "" + +#: lang/json/construction_from_json.py +msgid "Build Mailbox" +msgstr "" + +#: lang/json/construction_from_json.py +msgid "Build Bar Door" +msgstr "" + +#: lang/json/construction_from_json.py +msgid "Install Bars Onto Window" +msgstr "" + +#: lang/json/construction_from_json.py +msgid "Build Large Metal Support" +msgstr "" + +#: lang/json/construction_from_json.py +msgid "Build Small Metal Support" +msgstr "" + #: lang/json/construction_from_json.py msgid "Paint Grass White" msgstr "" @@ -67729,6 +68888,14 @@ msgstr "" msgid "Mine Downstair" msgstr "" +#: lang/json/construction_from_json.py +msgid "Repair Wooden Staircase" +msgstr "" + +#: lang/json/construction_from_json.py +msgid "Build Wooden Staircase" +msgstr "" + #: lang/json/construction_from_json.py msgid "Mine Upstair" msgstr "" @@ -67875,6 +69042,10 @@ msgstr "" msgid "Build Rammed Earth Wall" msgstr "" +#: lang/json/construction_from_json.py +msgid "Hang Hanging Meathook" +msgstr "" + #: lang/json/construction_from_json.py msgid "Build Counter Gate" msgstr "" @@ -71064,7 +72235,6 @@ msgid "Roots and vines entangle your foes to slow them!" msgstr "" #. ~ Remove message for effect(s) 'Vegetative Grasp'. -#. ~ Remove message for effect(s) 'Root Impale'. #: lang/json/effects_from_json.py msgid "The roots and vines wither up and die." msgstr "" @@ -71078,6 +72248,11 @@ msgstr "" msgid "Roots rip out from the ground and impale your enemies!" msgstr "" +#. ~ Remove message for effect(s) 'Root Impale'. +#: lang/json/effects_from_json.py +msgid "The roots wither up and die." +msgstr "" + #: lang/json/effects_from_json.py msgid "Acidic burn" msgstr "" @@ -71087,6 +72262,25 @@ msgstr "" msgid "Burned with acid" msgstr "" +#: lang/json/effects_from_json.py +msgid "Hasted" +msgstr "" + +#. ~ Description of effect 'Hasted'. +#: lang/json/effects_from_json.py +msgid "Your speed is boosted enormously." +msgstr "" + +#. ~ Apply message for effect(s) 'Hasted'. +#: lang/json/effects_from_json.py +msgid "Your speed is boosted to superhuman levels!" +msgstr "" + +#. ~ Remove message for effect(s) 'Hasted'. +#: lang/json/effects_from_json.py +msgid "You return to your normal speed." +msgstr "" + #: lang/json/effects_from_json.py msgid "Stuck in a light snare" msgstr "" @@ -71726,6 +72920,29 @@ msgid_plural "humans" msgstr[0] "" msgstr[1] "" +#: lang/json/fault_from_json.py +msgid "blackpowder fouling" +msgstr "" + +#. ~ Description for blackpowder fouling +#: lang/json/fault_from_json.py +msgid "" +"Firing blackpowder loads from a gun fouls it, which reduces reliability and, " +"if left uncleaned, leads to rust." +msgstr "" + +#: lang/json/fault_from_json.py +msgid "clogging" +msgstr "" + +#. ~ Description for clogging +#: lang/json/fault_from_json.py +msgid "" +"Clogging is usually caused by firing many blackpowder loads without " +"cleaning; it prevents firing the gun until cleaned. Some guns are more " +"resistant to this than others." +msgstr "" + #. ~ Description for drive belt #: lang/json/fault_from_json.py msgid "Required for operation of an attached alternator." @@ -71885,9 +73102,8 @@ msgid "A road barricade. For barricading roads." 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 -#: src/map.cpp src/mapdata.cpp +#: lang/json/terrain_from_json.py src/map.cpp msgid "smash!" msgstr "" @@ -71949,7 +73165,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 "" @@ -72054,7 +73270,7 @@ msgstr "" #. ~ Description for pile of leaves #: lang/json/furniture_from_json.py msgid "" -"A sizeable pile of leaves. You could sleep on it if you don't care about " +"A sizable pile of leaves. You could sleep on it if you don't care about " "comfort or warmth." msgstr "" @@ -72114,12 +73330,12 @@ msgstr "" #: lang/json/furniture_from_json.py #: lang/json/terrain_from_json.py +#: lang/json/terrain_from_json.py src/map.cpp #: src/map.cpp msgid "crash!" 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 msgid "whump!" msgstr "" @@ -72139,7 +73355,9 @@ msgstr "" #. ~ Description for bathtub #: lang/json/furniture_from_json.py -msgid "You could lay in and take a soothing bath. Only if water was running." +msgid "" +"You could lay in and take a soothing bath, if there were running water. The " +"plug is intact, so you could use it to store liquids." msgstr "" #: lang/json/furniture_from_json.py @@ -72323,9 +73541,10 @@ msgid "closed counter gate" msgstr "" #. ~ Description for closed counter gate +#. ~ Description for open counter gate #: lang/json/furniture_from_json.py msgid "" -"A commercial quality swining door made of wood that allows passage behind " +"A commercial quality swinging door made of wood that allows passage behind " "counters." msgstr "" @@ -72333,13 +73552,6 @@ msgstr "" msgid "open counter gate" msgstr "" -#. ~ Description for open counter gate -#: lang/json/furniture_from_json.py -msgid "" -"A commercial quality swinging door made of wood that allows passage behind " -"counters." -msgstr "" - #: lang/json/furniture_from_json.py lang/json/vehicle_part_from_json.py msgid "refrigerator" msgstr "" @@ -72658,7 +73870,7 @@ msgstr "" #. ~ Description for fungal flower #: lang/json/furniture_from_json.py msgid "" -"This flower has been overgrown by grey, sinewy tendrils of fungus, and the " +"This flower has been overgrown by gray, sinewy tendrils of fungus, and the " "color has leached from its petals and stem. It gently sways of its own " "volition." msgstr "" @@ -72788,8 +74000,8 @@ msgstr "" #. ~ Description for planter #: lang/json/furniture_from_json.py msgid "" -"A garden planter full of soil and slatted to allow adequate drainage. Can be " -"used for planting crops." +"A garden planter full of soil and slatted to allow adequate drainage. Can " +"be used for planting crops." msgstr "" #: lang/json/furniture_from_json.py @@ -72801,8 +74013,8 @@ msgstr "" #. ~ Description for planter with harvestable plant #: lang/json/furniture_from_json.py msgid "" -"A garden planter full of soil and slatted to allow adequate drainage. Can be " -"used for planting crops. This one contains a planted seed" +"A garden planter full of soil and slatted to allow adequate drainage. Can " +"be used for planting crops. This one contains a planted seed" msgstr "" #: lang/json/furniture_from_json.py @@ -72812,8 +74024,8 @@ msgstr "" #. ~ Description for planter with seedling #: lang/json/furniture_from_json.py msgid "" -"A garden planter full of soil and slatted to allow adequate drainage. Can be " -"used for planting crops. This one contains a planted seedling" +"A garden planter full of soil and slatted to allow adequate drainage. Can " +"be used for planting crops. This one contains a planted seedling" msgstr "" #: lang/json/furniture_from_json.py @@ -72904,12 +74116,12 @@ msgid "womp!" msgstr "" #: lang/json/furniture_from_json.py -msgid "satelitte dish" +msgid "satellite dish" msgstr "" -#. ~ Description for satelitte dish +#. ~ Description for satellite dish #: lang/json/furniture_from_json.py -msgid "A small satelitte dish for home entertainment." +msgid "A small satellite dish for home entertainment." msgstr "" #: lang/json/furniture_from_json.py @@ -73174,7 +74386,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 src/map.cpp src/mapdata.cpp +#: lang/json/terrain_from_json.py src/map.cpp msgid "thump!" msgstr "" @@ -73489,7 +74701,7 @@ msgstr "" #. ~ Description for camp chair #: lang/json/furniture_from_json.py -msgid "Sit down, have a drink. It can folded for easy transportation." +msgid "Sit down, have a drink. It can folded for easy transportation." msgstr "" #: lang/json/furniture_from_json.py @@ -73951,7 +75163,7 @@ msgstr "" #: lang/json/furniture_from_json.py msgid "" "When cold just isn't cold enough, you have this extreme deep freeze. This " -"will store stuff at -80 degrees celsius. Don't lick the metal on the inside." +"will store stuff at -80 degrees Celsius. Don't lick the metal on the inside." msgstr "" #: lang/json/furniture_from_json.py @@ -74205,6 +75417,15 @@ msgid "" "it sitting for a while, it's starting to smell a bit off." msgstr "" +#: lang/json/furniture_from_json.py +msgid "hanging meathook" +msgstr "" + +#. ~ Description for hanging meathook +#: lang/json/furniture_from_json.py +msgid "A hefty hook suspended from a chain for stringing up corpses." +msgstr "" + #: lang/json/furniture_from_json.py msgid "fake workbench hands" msgstr "" @@ -74247,6 +75468,23 @@ msgid "" "to secure mooring lines, ropes, hawsers, or cables." msgstr "" +#: lang/json/furniture_from_json.py +msgid "speaker cabinet" +msgstr "" + +#. ~ Description for speaker cabinet +#: lang/json/furniture_from_json.py +msgid "" +"A cabinet loaded with 12-inch speakers, intended to help make various things " +"loud. It can't serve its original purpose these days, but it could be " +"disassembled for various electronic parts." +msgstr "" + +#. ~ 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 "" + #: lang/json/furniture_from_json.py msgid "mutated cactus" msgstr "" @@ -76085,6 +77323,18 @@ msgid "" "and could be converted to fire .40 S&W by switching the barrel." msgstr "" +#: lang/json/gun_from_json.py +msgid "SIG P320" +msgid_plural "SIG P320s" +msgstr[0] "" +msgstr[1] "" + +#: lang/json/gun_from_json.py +msgid "" +"The P320 is a semi automatic, short recoil operated pistol. This one is " +"chambered for .357 SIG." +msgstr "" + #: lang/json/gun_from_json.py msgid "Colt M1861 Navy" msgid_plural "Colt M1861 Navy" @@ -76239,6 +77489,18 @@ msgid "" "make for a moderately poor handling pistol." msgstr "" +#: lang/json/gun_from_json.py +msgid "M1911A1" +msgid_plural "M1911A1s" +msgstr[0] "" +msgstr[1] "" + +#: 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 "" + #: lang/json/gun_from_json.py msgid "Glock 22" msgid_plural "Glock 22" @@ -76403,6 +77665,19 @@ msgstr "" msgid "multi" msgstr "" +#: lang/json/gun_from_json.py +msgid "Saiga-410" +msgid_plural "Saiga-410s" +msgstr[0] "" +msgstr[1] "" + +#: lang/json/gun_from_json.py +msgid "" +"The Saiga-410 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." +msgstr "" + #: lang/json/gun_from_json.py msgid "Desert Eagle .44" msgid_plural "Desert Eagle .44" @@ -77416,6 +78691,18 @@ msgid "" "difficult to place quickly." msgstr "" +#: lang/json/gun_from_json.py +msgid "M17" +msgid_plural "M17s" +msgstr[0] "" +msgstr[1] "" + +#: lang/json/gun_from_json.py +msgid "" +"The M17 is a semi automatic, short recoil operated pistol derived from the " +"SIG Sauer P320." +msgstr "" + #: lang/json/gun_from_json.py msgid "Makarov PM" msgid_plural "Makarov PMs" @@ -79676,12 +80963,6 @@ msgid "" "fixed rear sight and a reinforced frame." msgstr "" -#: lang/json/gun_from_json.py -msgid "Saiga-410" -msgid_plural "Saiga-410" -msgstr[0] "" -msgstr[1] "" - #: lang/json/gun_from_json.py msgid "" "A lighter version of the Saiga-12 semi-automatic shotgun, chambered in .410 " @@ -82175,7 +83456,7 @@ msgid "" "Air drag, water drag, rolling drag, and static drag are all values that " "influence your vehicle's safe and maximum speed. The interaction of drag " "and engine power is complicated, but generally speaking, more powerful " -"engines will make your vehicle go faster but aslo consume fuel faster." +"engines will make your vehicle go faster but also consume fuel faster." msgstr "" #: lang/json/help_from_json.py @@ -83793,6 +85074,27 @@ msgstr "" msgid "This bionic can provide power to powered armor." msgstr "" +#: lang/json/json_flag_from_json.py +msgid "This makes the spell's effects permanent." +msgstr "" + +#: lang/json/json_flag_from_json.py +msgid "This makes the spell's Area of Effect ignore walls." +msgstr "" + +#: lang/json/json_flag_from_json.py +msgid "" +"This makes the spell's summoned monster always hostile. Note that the spell " +"needs to be a summon spell for this to do anything." +msgstr "" + +#: lang/json/json_flag_from_json.py +#, no-python-format +msgid "" +"This makes the spell's summoned monster hostile 50% of the time. Note that " +"the spell needs to be a summon spell for this to do anything." +msgstr "" + #. ~ Please leave anything in unchanged. #: lang/json/json_flag_from_json.py msgid "" @@ -83981,11 +85283,6 @@ msgstr "" msgid "Pan down" msgstr "" -#: lang/json/keybinding_from_json.py -#: src/construction.cpp src/veh_interact.cpp -msgid "Filter" -msgstr "" - #: lang/json/keybinding_from_json.py msgid "Cancel menu" msgstr "" @@ -85430,6 +86727,284 @@ msgstr "" msgid "Set turret targeting modes" msgstr "" +#: lang/json/map_extra_from_json.py src/character.cpp +#: src/iuse_actor.cpp +msgid "Nothing" +msgstr "" + +#. ~ Description for Nothing +#: lang/json/map_extra_from_json.py +msgid "Nothing of interest is here." +msgstr "" + +#: lang/json/map_extra_from_json.py +msgid "Crater" +msgstr "" + +#. ~ Description for Crater +#: lang/json/map_extra_from_json.py +msgid "There is a crater here." +msgstr "" + +#: lang/json/map_extra_from_json.py +msgid "Fumarole" +msgstr "" + +#. ~ Description for Fumarole +#: lang/json/map_extra_from_json.py +msgid "There is a fumarole here." +msgstr "" + +#: lang/json/map_extra_from_json.py +msgid "College Kids" +msgstr "" + +#. ~ Description for College Kids +#: lang/json/map_extra_from_json.py +msgid "Several corpses of college kids are here." +msgstr "" + +#: lang/json/map_extra_from_json.py +msgid "Drug Deal" +msgstr "" + +#. ~ Description for Drug Deal +#: lang/json/map_extra_from_json.py +msgid "Several corpses of drug dealers are here." +msgstr "" + +#: lang/json/map_extra_from_json.py +msgid "Roadworks" +msgstr "" + +#. ~ Description for Roadworks +#: lang/json/map_extra_from_json.py +msgid "Roadworks are here." +msgstr "" + +#: lang/json/map_extra_from_json.py +msgid "Road Mayhem" +msgstr "" + +#. ~ Description for Road Mayhem +#: lang/json/map_extra_from_json.py +msgid "Road mayhem is here." +msgstr "" + +#: lang/json/map_extra_from_json.py +msgid "Roadblock (Military)" +msgstr "" + +#. ~ Description for Roadblock (Military) +#: lang/json/map_extra_from_json.py +msgid "This road is blocked by military." +msgstr "" + +#: lang/json/map_extra_from_json.py +msgid "Roadblock (Bandits)" +msgstr "" + +#. ~ Description for Roadblock (Bandits) +#: lang/json/map_extra_from_json.py +msgid "This road is blocked by bandits." +msgstr "" + +#: lang/json/map_extra_from_json.py +msgid "Minefield" +msgstr "" + +#. ~ Description for Minefield +#: lang/json/map_extra_from_json.py +msgid "Mines are scattered here." +msgstr "" + +#: lang/json/map_extra_from_json.py +msgid "Supply Drop" +msgstr "" + +#. ~ Description for Supply Drop +#: lang/json/map_extra_from_json.py +msgid "Several supply crates were dropped here." +msgstr "" + +#. ~ Military time, e.g. 2359 +#: lang/json/map_extra_from_json.py src/options.cpp +msgid "Military" +msgstr "" + +#. ~ Description for Military +#: lang/json/map_extra_from_json.py +msgid "Several corpses of soldiers are here." +msgstr "" + +#: lang/json/map_extra_from_json.py +msgid "Helicopter Crash" +msgstr "" + +#. ~ Description for Helicopter Crash +#: lang/json/map_extra_from_json.py +msgid "Helicopter crashed here." +msgstr "" + +#: lang/json/map_extra_from_json.py +msgid "Scientists" +msgstr "" + +#. ~ Description for Scientists +#: lang/json/map_extra_from_json.py +msgid "Several corpses of scientists are here." +msgstr "" + +#: lang/json/map_extra_from_json.py +msgid "Portal" +msgstr "" + +#. ~ Description for Portal +#: lang/json/map_extra_from_json.py +msgid "Portal is here." +msgstr "" + +#: lang/json/map_extra_from_json.py +msgid "Portal In" +msgstr "" + +#. ~ Description for Portal In +#: lang/json/map_extra_from_json.py +msgid "Another portal is here." +msgstr "" + +#: lang/json/map_extra_from_json.py +msgid "Anomaly" +msgstr "" + +#. ~ Description for Anomaly +#: lang/json/map_extra_from_json.py +msgid "Some anomaly is here." +msgstr "" + +#: lang/json/map_extra_from_json.py +msgid "Spider Nest" +msgstr "" + +#. ~ Description for Spider Nest +#: lang/json/map_extra_from_json.py +msgid "Spider nest is here." +msgstr "" + +#: lang/json/map_extra_from_json.py +msgid "Wasp Nest" +msgstr "" + +#. ~ Description for Wasp Nest +#: lang/json/map_extra_from_json.py +msgid "Wasp nest is here." +msgstr "" + +#: lang/json/map_extra_from_json.py src/defense.cpp +msgid "Spiders" +msgstr "" + +#. ~ Description for Spiders +#: lang/json/map_extra_from_json.py +msgid "This area is covered with webs. Probably spiders are nearby" +msgstr "" + +#. ~ Description for Shia LaBeouf +#: lang/json/map_extra_from_json.py +msgid "Cannibal is nearby." +msgstr "" + +#: lang/json/map_extra_from_json.py +msgid "Jabberwock" +msgstr "" + +#. ~ Description for Jabberwock +#: lang/json/map_extra_from_json.py +msgid "Jabberwock is nearby." +msgstr "" + +#: lang/json/map_extra_from_json.py +msgid "Grove" +msgstr "" + +#. ~ Description for Grove +#: lang/json/map_extra_from_json.py +msgid "This area is covered with a single type of trees." +msgstr "" + +#: lang/json/map_extra_from_json.py +msgid "Shrubberry" +msgstr "" + +#. ~ Description for Shrubberry +#: lang/json/map_extra_from_json.py +msgid "This area is covered with a single type of shrubs." +msgstr "" + +#: lang/json/map_extra_from_json.py +msgid "Clearcut" +msgstr "" + +#. ~ Description for Clearcut +#: lang/json/map_extra_from_json.py +msgid "Most trees in this area were uniformly cut down." +msgstr "" + +#: lang/json/map_extra_from_json.py +msgid "Pond" +msgstr "" + +#. ~ Description for Pond +#: lang/json/map_extra_from_json.py +msgid "Small pond is here." +msgstr "" + +#: lang/json/map_extra_from_json.py +msgid "Clay Deposit" +msgstr "" + +#. ~ Description for Clay Deposit +#: lang/json/map_extra_from_json.py +msgid "Small clay deposit is here." +msgstr "" + +#: lang/json/map_extra_from_json.py +msgid "Dead Vegetation" +msgstr "" + +#. ~ Description for Dead Vegetation +#. ~ Description for Dead Vegetation (Point) +#: lang/json/map_extra_from_json.py +msgid "Dead vegetation is here." +msgstr "" + +#: lang/json/map_extra_from_json.py +msgid "Dead Vegetation (Point)" +msgstr "" + +#: lang/json/map_extra_from_json.py +msgid "Burned Ground" +msgstr "" + +#. ~ Description for Burned Ground +#. ~ Description for Burned Ground (Point) +#: lang/json/map_extra_from_json.py +msgid "Burned ground is here." +msgstr "" + +#: lang/json/map_extra_from_json.py +msgid "Burned Ground (Point)" +msgstr "" + +#: lang/json/map_extra_from_json.py +msgid "Marloss Pilgrimage" +msgstr "" + +#. ~ Description for Marloss Pilgrimage +#: lang/json/map_extra_from_json.py +msgid "Marloss Pilgrimage is here." +msgstr "" + #. ~ Computer name #: lang/json/mapgen_from_json.py msgid "Consolidated Computerized Bank of the Treasury" @@ -86336,6 +87911,11 @@ msgstr "" msgid "Install Repeater Mod" msgstr "" +#. ~ Computer option +#: lang/json/mapgen_from_json.py +msgid "Browse Audio Archive" +msgstr "" + #. ~ Sign #: lang/json/mapgen_from_json.py msgid "The Red Dragon Tea Shop" @@ -87193,6 +88773,29 @@ msgstr "" msgid "Increased damage when moving but no bonus block" msgstr "" +#: lang/json/martial_art_from_json.py +msgid "Wing Chun" +msgstr "" + +#. ~ Description for martial art 'Wing Chun' +#: lang/json/martial_art_from_json.py +msgid "" +"Wing Chun is a Chinese martial art that began by selecting the easiest-to-" +"learn effective techniques from the various Shaolin animal forms. It has a " +"high stance, with weight entirely on the rear leg. Wing Chun focuses on " +"sensitivity to the opponent's direction of force, and flowing around it to " +"get back to hitting." +msgstr "" + +#: lang/json/martial_art_from_json.py +msgid "Chi-Sao Sensitivity" +msgstr "" + +#. ~ Description of buff 'Chi-Sao Sensitivity' for martial art 'Wing Chun' +#: lang/json/martial_art_from_json.py +msgid "Perception increases dodging ability, +1 dodges per turn" +msgstr "" + #: lang/json/martial_art_from_json.py msgid "Centipede Kung Fu" msgstr "" @@ -87815,7 +89418,7 @@ msgid "mushed" msgstr "" #: lang/json/material_from_json.py -msgid "Dried vegetable" +msgid "Dried Vegetable" msgstr "" #: lang/json/material_from_json.py @@ -87823,7 +89426,7 @@ msgid "Cured Meat" msgstr "" #: lang/json/material_from_json.py -msgid "Processed fod" +msgid "Processed Food" msgstr "" #: lang/json/material_from_json.py @@ -87831,7 +89434,7 @@ msgid "Cheese" msgstr "" #: lang/json/material_from_json.py -msgid "Ice cream" +msgid "Ice Cream" msgstr "" #: lang/json/material_from_json.py @@ -89017,6 +90620,53 @@ msgstr "" msgid "Find Antibiotics Before You Die!" msgstr "" +#: lang/json/mission_def_from_json.py +msgid "Prove your worth to Foodperson" +msgstr "" + +#: lang/json/mission_def_from_json.py +msgid "Prove your dedication to Foodplace." +msgstr "" + +#: lang/json/mission_def_from_json.py +msgid "" +"Show me the proof of your loyalty to the great Foodplace, and I'll consider " +"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 "" + +#: lang/json/mission_def_from_json.py +msgid "That's the spirit! Good luck kid." +msgstr "" + +#: lang/json/mission_def_from_json.py +msgid "That's alright not everyone is cutout for this." +msgstr "" + +#: 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 "" + +#: lang/json/mission_def_from_json.py +msgid "How is it going? Do you have them?" +msgstr "" + +#: 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 "" + +#: lang/json/mission_def_from_json.py +msgid "Well... where are they?" +msgstr "" + +#: lang/json/mission_def_from_json.py +msgid "I'm so disappointed in you kid..." +msgstr "" + #: lang/json/mission_def_from_json.py msgid "Locate Commo Team" msgstr "" @@ -91489,6 +93139,14 @@ msgstr "" msgid "Masochism" msgstr "" +#: lang/json/morale_type_from_json.py +msgid "You have no face!" +msgstr "" + +#: lang/json/morale_type_from_json.py +msgid "You feel pumped!" +msgstr "" + #: lang/json/morale_type_from_json.py lang/json/mutation_from_json.py msgid "Hoarder" msgstr "" @@ -93358,7 +95016,7 @@ msgstr "" #: lang/json/mutation_from_json.py msgid "" "Something about your presence is calming to animals, and they will treat you " -"with innate trust. This only applies to natural animals such as woodland " +"with innate trust. This only applies to natural animals such as woodland " "creatures." msgstr "" @@ -93553,7 +95211,8 @@ msgstr "" #: lang/json/mutation_from_json.py msgid "" "You have taken some self-defense classes at a nearby gym. You start with " -"your choice of Capoeira, Krav Maga, Muay Thai, Ninjutsu, or Zui Quan." +"your choice of Capoeira, Krav Maga, Muay Thai, Ninjutsu, Wing Chun, or Zui " +"Quan." msgstr "" #: lang/json/mutation_from_json.py @@ -93600,6 +95259,39 @@ msgid "" "Telling lies and otherwise bluffing will be much easier for you." msgstr "" +#: lang/json/mutation_from_json.py +msgid "Savings" +msgstr "" + +#. ~ Description for Savings +#: lang/json/mutation_from_json.py +msgid "" +"You had some money stashed at the bank for a rainy day. Now that the storm " +"is raging, it's a last call to use it maybe?" +msgstr "" + +#: lang/json/mutation_from_json.py +msgid "Debt" +msgstr "" + +#. ~ Description for Debt +#: lang/json/mutation_from_json.py +msgid "" +"You needed money and had a big loan in a bank. Good thing nobody will come " +"to collect it now, right? Right?" +msgstr "" + +#: lang/json/mutation_from_json.py +msgid "Millionaire" +msgstr "" + +#. ~ Description for Millionaire +#: lang/json/mutation_from_json.py +msgid "" +"At the time of Cataclysm you were an owner of a fortune stashed in a bank. " +"Does that have any meaning now?" +msgstr "" + #: lang/json/mutation_from_json.py msgid "Pretty" msgstr "" @@ -94835,8 +96527,8 @@ msgstr "" #: lang/json/mutation_from_json.py msgid "" "Your leaves have grown in size and prominence, with additional leaves " -"sprouting along your arms. While your arms and head are uncovered, you will " -"photosynthesize additional nutrients while in sunlight. Reduces wet effects." +"sprouting along your arms. While your arms and head are uncovered, you will " +"photosynthesize additional nutrients while in sunlight. Reduces wet effects." msgstr "" #: lang/json/mutation_from_json.py @@ -94847,8 +96539,8 @@ msgstr "" #: lang/json/mutation_from_json.py msgid "" "You leaves are vibrant, large, and green, and have become a major source of " -"nutrition for your body. Whenever your arms and head are uncovered you will " -"gain a large amount of nutrition by standing in the sunlight. Reduces wet " +"nutrition for your body. Whenever your arms and head are uncovered you will " +"gain a large amount of nutrition by standing in the sunlight. Reduces wet " "effects." msgstr "" @@ -94859,8 +96551,8 @@ msgstr "" #. ~ Description for Transpiration #: lang/json/mutation_from_json.py msgid "" -"You body has begun moving nutrients via the evaporation of water. This " -"increases your thrist when it's hot, but reduces it when it's cold." +"You body has begun moving nutrients via the evaporation of water. This " +"increases your thirst when it's hot, but reduces it when it's cold." msgstr "" #: lang/json/mutation_from_json.py @@ -97348,7 +99040,7 @@ msgstr "" #: lang/json/mutation_from_json.py msgid "" "You have gained the ability to commune with trees and comprehend their " -"ancient wisdom. Activate next to a tree to gradually gain overmap vision " +"ancient wisdom. Activate next to a tree to gradually gain overmap vision " "through connected forests." msgstr "" @@ -98021,6 +99713,18 @@ msgid "" "authority of the United States of America." msgstr "" +#: lang/json/mutation_from_json.py +msgid "True Foodperson" +msgstr "" + +#. ~ Description for True Foodperson +#: lang/json/mutation_from_json.py +msgid "" +"You are the true Foodperson, some might think Foodperson is just a mascot, " +"but you know better. You are Foodperson, the mask has become your face, you " +"are real and the only thing standing between this world and oblivion is you." +msgstr "" + #: lang/json/mutation_from_json.py msgid "MD" msgstr "" @@ -99285,6 +100989,15 @@ msgstr "" msgid "Abysmal Mana Sensitivity" msgstr "" +#: lang/json/mutation_from_json.py +msgid "Debug Spell Mutation" +msgstr "" + +#. ~ Description for Debug Spell Mutation +#: lang/json/mutation_from_json.py +msgid "Gives all of the debug spells at max level." +msgstr "" + #. ~ Description for Melee Weapon Training #: lang/json/mutation_from_json.py msgid "" @@ -99446,6 +101159,14 @@ msgstr "" msgid "I'm a chef." msgstr "" +#: lang/json/npc_class_from_json.py lang/json/npc_from_json.py +msgid "Foodperson" +msgstr "" + +#: lang/json/npc_class_from_json.py +msgid "I AM FOODPERSON. AND I BRING SUSTENANCE!" +msgstr "" + #: lang/json/npc_class_from_json.py lang/json/npc_from_json.py msgid "Cyborg" msgstr "" @@ -99493,6 +101214,18 @@ msgstr "" msgid "Reading this line is a bug" msgstr "" +#: lang/json/npc_class_from_json.py +msgid "Head of security" +msgstr "" + +#: lang/json/npc_class_from_json.py +msgid "I'm part of the Hub security team." +msgstr "" + +#: lang/json/npc_class_from_json.py lang/json/npc_from_json.py +msgid "Hub Security" +msgstr "" + #: lang/json/npc_class_from_json.py msgid "Caravaneer" msgstr "" @@ -99880,6 +101613,14 @@ msgstr "" msgid "the intercom" msgstr "" +#: lang/json/npc_from_json.py +msgid "Head of Security" +msgstr "" + +#: lang/json/npc_from_json.py +msgid "U. Rourke" +msgstr "" + #: lang/json/npc_from_json.py msgid "Free Merchant" msgstr "" @@ -100281,6 +102022,14 @@ msgid "" "laurel." msgstr "" +#: lang/json/overmap_terrain_from_json.py +msgid "abandoned drive-through" +msgstr "" + +#: lang/json/overmap_terrain_from_json.py +msgid "noname" +msgstr "" + #: lang/json/overmap_terrain_from_json.py #: lang/json/overmap_terrain_from_json.py src/mapdata.cpp #: src/mapdata.cpp @@ -100566,6 +102315,18 @@ msgstr "" msgid "farm house" msgstr "" +#: lang/json/overmap_terrain_from_json.py +msgid "farm house roof" +msgstr "" + +#: lang/json/overmap_terrain_from_json.py +msgid "farm barn" +msgstr "" + +#: lang/json/overmap_terrain_from_json.py +msgid "farm barn roof" +msgstr "" + #: lang/json/overmap_terrain_from_json.py #: lang/json/start_location_from_json.py msgid "farm" @@ -100651,10 +102412,6 @@ msgstr "" msgid "farm house 2nd floor" msgstr "" -#: lang/json/overmap_terrain_from_json.py -msgid "farm house roof" -msgstr "" - #: lang/json/overmap_terrain_from_json.py msgid "dirt road" msgstr "" @@ -100781,6 +102538,14 @@ msgstr "" msgid "gun store" msgstr "" +#: lang/json/overmap_terrain_from_json.py +msgid "gun store roof" +msgstr "" + +#: lang/json/overmap_terrain_from_json.py +msgid "gun store 2nd floor" +msgstr "" + #: lang/json/overmap_terrain_from_json.py msgid "clothing store" msgstr "" @@ -100885,6 +102650,10 @@ msgstr "" msgid "music store" msgstr "" +#: lang/json/overmap_terrain_from_json.py +msgid "music store roof" +msgstr "" + #: lang/json/overmap_terrain_from_json.py msgid "megastore" msgstr "" @@ -100977,10 +102746,18 @@ msgstr "" msgid "LAN center" msgstr "" +#: lang/json/overmap_terrain_from_json.py +msgid "LAN center roof" +msgstr "" + #: lang/json/overmap_terrain_from_json.py msgid "landscaping supply co" msgstr "" +#: lang/json/overmap_terrain_from_json.py +msgid "landscaping supply co roof" +msgstr "" + #: lang/json/overmap_terrain_from_json.py msgid "veterans of foreign wars" msgstr "" @@ -101013,10 +102790,18 @@ msgstr "" msgid "laundromat" msgstr "" +#: lang/json/overmap_terrain_from_json.py +msgid "laundromat roof" +msgstr "" + #: lang/json/overmap_terrain_from_json.py msgid "jewelry store" msgstr "" +#: lang/json/overmap_terrain_from_json.py +msgid "jewelry store roof" +msgstr "" + #: lang/json/overmap_terrain_from_json.py msgid "2-story motel" msgstr "" @@ -101029,6 +102814,10 @@ msgstr "" msgid "home improvement store" msgstr "" +#: lang/json/overmap_terrain_from_json.py +msgid "home improvement store roof" +msgstr "" + #: lang/json/overmap_terrain_from_json.py msgid "antique store" msgstr "" @@ -101117,6 +102906,10 @@ msgstr "" msgid "Head Shop" msgstr "" +#: lang/json/overmap_terrain_from_json.py +msgid "head shop roof" +msgstr "" + #: lang/json/overmap_terrain_from_json.py msgid "abandoned storefront" msgstr "" @@ -101165,6 +102958,15 @@ msgstr "" msgid "refugee center" msgstr "" +#: lang/json/overmap_terrain_from_json.py +msgid "field" +msgstr "" + +#: lang/json/overmap_terrain_from_json.py +#: lang/json/terrain_from_json.py +msgid "solid rock" +msgstr "" + #: lang/json/overmap_terrain_from_json.py msgid "camp survey" msgstr "" @@ -101217,10 +103019,6 @@ msgstr "" msgid "crater" msgstr "" -#: lang/json/overmap_terrain_from_json.py -msgid "field" -msgstr "" - #: lang/json/overmap_terrain_from_json.py msgid "swamp" msgstr "" @@ -101289,11 +103087,6 @@ msgstr "" msgid "triffid roots" msgstr "" -#: lang/json/overmap_terrain_from_json.py -#: lang/json/terrain_from_json.py -msgid "solid rock" -msgstr "" - #: lang/json/overmap_terrain_from_json.py msgid "rift" msgstr "" @@ -101479,6 +103272,7 @@ msgid "evac shelter roof" msgstr "" #: lang/json/overmap_terrain_from_json.py +#: lang/json/start_location_from_json.py msgid "LMOE shelter" msgstr "" @@ -101727,6 +103521,10 @@ msgstr "" msgid "homeless shelter" msgstr "" +#: lang/json/overmap_terrain_from_json.py +msgid "town hall" +msgstr "" + #: lang/json/overmap_terrain_from_json.py msgid "silo" msgstr "" @@ -101903,6 +103701,10 @@ msgstr "" msgid "music venue" msgstr "" +#: lang/json/overmap_terrain_from_json.py +msgid "music venue roof" +msgstr "" + #: lang/json/overmap_terrain_from_json.py msgid "gambling hall" msgstr "" @@ -101939,6 +103741,10 @@ msgstr "" msgid "fitness gym" msgstr "" +#: lang/json/overmap_terrain_from_json.py +msgid "fitness gym roof" +msgstr "" + #: lang/json/overmap_terrain_from_json.py msgid "dojo" msgstr "" @@ -102192,18 +103998,6 @@ msgstr "" msgid "lake" msgstr "" -#: lang/json/overmap_terrain_from_json.py -msgid "abandoned drive-through" -msgstr "" - -#: lang/json/overmap_terrain_from_json.py -msgid "noname" -msgstr "" - -#: lang/json/overmap_terrain_from_json.py -msgid "town hall" -msgstr "" - #: lang/json/overmap_terrain_from_json.py msgid "municipal reactor" msgstr "" @@ -102272,6 +104066,14 @@ msgstr "" msgid "scavenger bunker" msgstr "" +#: lang/json/overmap_terrain_from_json.py +msgid "magic shop" +msgstr "" + +#: lang/json/overmap_terrain_from_json.py +msgid "magic shop roof" +msgstr "" + #: lang/json/overmap_terrain_from_json.py msgid "apartment towers" msgstr "" @@ -102849,6 +104651,34 @@ msgid "" "escape from the creatures." msgstr "" +#: lang/json/professions_from_json.py +msgctxt "profession_male" +msgid "True Foodperson" +msgstr "" + +#. ~ Profession (male True Foodperson) description +#: lang/json/professions_from_json.py +msgctxt "prof_desc_male" +msgid "" +"You are the true Foodperson, some might think Foodperson is just a mascot, " +"but you know better. You are Foodperson, the mask has become your face, you " +"are real and the only thing standing between this world and oblivion is you." +msgstr "" + +#: lang/json/professions_from_json.py +msgctxt "profession_female" +msgid "True Foodperson" +msgstr "" + +#. ~ Profession (female True Foodperson) description +#: lang/json/professions_from_json.py +msgctxt "prof_desc_female" +msgid "" +"You are the true Foodperson, some might think Foodperson is just a mascot, " +"but you know better. You are Foodperson, the mask has become your face, you " +"are real and the only thing standing between this world and oblivion is you." +msgstr "" + #: lang/json/professions_from_json.py msgctxt "profession_male" msgid "Professional Cyclist" @@ -104945,6 +106775,38 @@ msgid "" "brain. You can't tell which one is worse though." msgstr "" +#: lang/json/professions_from_json.py +msgctxt "profession_male" +msgid "Millionaire" +msgstr "" + +#. ~ Profession (male Millionaire) description +#: lang/json/professions_from_json.py +msgctxt "prof_desc_male" +msgid "" +"You had a fortune, whether inherited, built by hard work, or gained by pure " +"luck. You invested in trade and nothing was beyond your reach. Now it's " +"not worth a dime and no money in the world can guarantee your safety and " +"well being. Hard times are ahead, so it's time to undust your skills and " +"try to sell some ice to the Innuit. What currency do they accept?" +msgstr "" + +#: lang/json/professions_from_json.py +msgctxt "profession_female" +msgid "Millionaire" +msgstr "" + +#. ~ Profession (female Millionaire) description +#: lang/json/professions_from_json.py +msgctxt "prof_desc_female" +msgid "" +"You had a fortune, whether inherited, built by hard work, or gained by pure " +"luck. You invested in trade and nothing was beyond your reach. Now it's " +"not worth a dime and no money in the world can guarantee your safety and " +"well being. Hard times are ahead, so it's time to undust your skills and " +"try to sell some ice to the Innuit. What currency do they accept?" +msgstr "" + #: lang/json/professions_from_json.py msgctxt "profession_male" msgid "Priest" @@ -106385,6 +108247,88 @@ msgid "" "wants to eat you alive, winning hearts and minds just got that much harder." msgstr "" +#: lang/json/professions_from_json.py +msgctxt "profession_male" +msgid "Rancher" +msgstr "" + +#. ~ Profession (male Rancher) description +#: lang/json/professions_from_json.py +msgctxt "prof_desc_male" +msgid "" +"You've raised cows or horses most of your life, now we'll see what happens " +"next." +msgstr "" + +#: lang/json/professions_from_json.py +msgctxt "profession_female" +msgid "Rancher" +msgstr "" + +#. ~ Profession (female Rancher) description +#: lang/json/professions_from_json.py +msgctxt "prof_desc_female" +msgid "" +"You've raised cows or horses most of your life, now we'll see what happens " +"next." +msgstr "" + +#: lang/json/professions_from_json.py +msgctxt "profession_male" +msgid "Roadie" +msgstr "" + +#. ~ Profession (male Roadie) description +#: lang/json/professions_from_json.py +msgctxt "prof_desc_male" +msgid "" +"You worked just outside of the limelight, ensuring that the performers got " +"what they needed and that everything ran smoothly. The stakes are higher " +"these days, but the show must go on." +msgstr "" + +#: lang/json/professions_from_json.py +msgctxt "profession_female" +msgid "Roadie" +msgstr "" + +#. ~ Profession (female Roadie) description +#: lang/json/professions_from_json.py +msgctxt "prof_desc_female" +msgid "" +"You worked just outside of the limelight, ensuring that the performers got " +"what they needed and that everything ran smoothly. The stakes are higher " +"these days, but the show must go on." +msgstr "" + +#: lang/json/professions_from_json.py +msgctxt "profession_male" +msgid "Musician" +msgstr "" + +#. ~ Profession (male Musician) description +#: lang/json/professions_from_json.py +msgctxt "prof_desc_male" +msgid "" +"You were just about to hit the stage when the Cataclysm struck. 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" +msgid "Musician" +msgstr "" + +#. ~ Profession (female Musician) description +#: lang/json/professions_from_json.py +msgctxt "prof_desc_female" +msgid "" +"You were just about to hit the stage when the Cataclysm struck. 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" msgid "Debugger" @@ -108718,6 +110662,11 @@ msgstr "" msgid "CANINE ARMOR" msgstr "" +#. ~ Crafting recipes subcategory of 'ANIMALS' category +#: lang/json/recipe_category_from_json.py +msgid "EQUINE ARMOR" +msgstr "" + #. ~ Crafting recipes category name #: lang/json/recipe_category_from_json.py msgid "BUILDING" @@ -108741,6 +110690,10 @@ msgstr "" msgid "We should survey the base site and set up a bulletin board." msgstr "" +#: lang/json/recipe_from_json.py +msgid "We should survey the roof top and set up a bulletin board." +msgstr "" + #: lang/json/recipe_from_json.py msgid "" "Now that we have some cover, we should build a fireplace in the northeast " @@ -109911,6 +111864,26 @@ msgstr "" msgid " Craft: Armor, Scrap Suit" msgstr "" +#: lang/json/recipe_group_from_json.py +msgid " Craft: Armor, Scrap Helmet" +msgstr "" + +#: lang/json/recipe_group_from_json.py +msgid " Craft: Armor, Scrap Cuirass" +msgstr "" + +#: lang/json/recipe_group_from_json.py +msgid " Craft: Armor, Scrap Arm Guards" +msgstr "" + +#: lang/json/recipe_group_from_json.py +msgid " Craft: Armor, Scrap Leg Guards" +msgstr "" + +#: lang/json/recipe_group_from_json.py +msgid " Craft: Armor, Scrap Boots" +msgstr "" + #: lang/json/recipe_group_from_json.py msgid " Craft: Axe, Copper" msgstr "" @@ -110742,6 +112715,44 @@ msgctxt "start_name" msgid "Police Station" msgstr "" +#. ~ Name for scenario 'The Mascot Rises' for a male character +#: lang/json/scenario_from_json.py +msgctxt "scenario_male" +msgid "The Mascot Rises" +msgstr "" + +#. ~ Name for scenario 'The Mascot Rises' for a female character +#: lang/json/scenario_from_json.py +msgctxt "scenario_female" +msgid "The Mascot Rises" +msgstr "" + +#. ~ Description for scenario 'The Mascot Rises' for a male character. +#: lang/json/scenario_from_json.py +msgctxt "scen_desc_male" +msgid "" +"You just finished your shift and got back in the break room when you heard " +"the alarms and the security door shutting down behind you. There's a lot of " +"customers out there and you're not sure Foodplace delicious food is going to " +"be enough for them." +msgstr "" + +#. ~ Description for scenario 'The Mascot Rises' for a female character. +#: lang/json/scenario_from_json.py +msgctxt "scen_desc_female" +msgid "" +"You just finished your shift and got back in the break room when you heard " +"the alarms and the security door shutting down behind you. There's a lot of " +"customers out there and you're not sure Foodplace delicious food is going to " +"be enough for them." +msgstr "" + +#. ~ Starting location for scenario 'The Mascot Rises'. +#: lang/json/scenario_from_json.py +msgctxt "start_name" +msgid "Foodplace Break Room" +msgstr "" + #. ~ Name for scenario 'School' for a male character #: lang/json/scenario_from_json.py msgctxt "scenario_male" @@ -111120,6 +113131,40 @@ msgctxt "start_name" msgid "Apartment Rooftop" msgstr "" +#. ~ Name for scenario 'Rancher' for a male character +#: lang/json/scenario_from_json.py +msgctxt "scenario_male" +msgid "Rancher" +msgstr "" + +#. ~ Name for scenario 'Rancher' for a female character +#: lang/json/scenario_from_json.py +msgctxt "scenario_female" +msgid "Rancher" +msgstr "" + +#. ~ Description for scenario 'Rancher' for a male character. +#: lang/json/scenario_from_json.py +msgctxt "scen_desc_male" +msgid "" +"You've lived on your ranch for most of your life, through hard times and " +"easy times. One heck of a hard time is ahead.." +msgstr "" + +#. ~ Description for scenario 'Rancher' for a female character. +#: lang/json/scenario_from_json.py +msgctxt "scen_desc_female" +msgid "" +"You've lived on your ranch for most of your life, through hard times and " +"easy times. One heck of a hard time is ahead.." +msgstr "" + +#. ~ Starting location for scenario 'Rancher'. +#: lang/json/scenario_from_json.py +msgctxt "start_name" +msgid "Horse Farm" +msgstr "" + #. ~ Name for scenario 'Scavenger' for a male character #: lang/json/scenario_from_json.py msgctxt "scenario_male" @@ -111200,8 +113245,8 @@ msgstr "" #: lang/json/scenario_from_json.py msgctxt "scen_desc_male" msgid "" -"You had connections, or intel somehow..., and because of it, you found this " -"LMOE Shelter. It's summer now and you somehow survived, now things get a " +"You had connections, or intel somehow...and because of it, you found this " +"LMOE Shelter. It's summer now, and you somehow survived. Now things get a " "little bit easier." msgstr "" @@ -111209,8 +113254,8 @@ msgstr "" #: lang/json/scenario_from_json.py msgctxt "scen_desc_female" msgid "" -"You had connections, or intel somehow..., and because of it, you found this " -"LMOE Shelter. It's summer now and you somehow survived, now things get a " +"You had connections, or intel somehow...and because of it, you found this " +"LMOE Shelter. It's summer now, and you somehow survived. Now things get a " "little bit easier." msgstr "" @@ -111236,18 +113281,20 @@ msgstr "" #: lang/json/scenario_from_json.py msgctxt "scen_desc_male" msgid "" -"You were one of the many law enforcement and military personnel alike called " -"in to keep order on one of the FEMA camps, it all went to shit fast..." -"wounded, infected, surrounded by fire you lay...and they just keep coming..." +"You were one of the many law-enforcement and military personnel alike called " +"in to keep order on one of the FEMA camps. It all went to shit fast..." +"wounded, infected, surrounded by fire you lie on the ground...and they just " +"keep coming..." msgstr "" #. ~ Description for scenario 'Challenge-FEMA Death Camp' for a female character. #: lang/json/scenario_from_json.py msgctxt "scen_desc_female" msgid "" -"You were one of the many law enforcement and military personnel alike called " -"in to keep order on one of the FEMA camps, it all went to shit fast..." -"wounded, infected, surrounded by fire you lay...and they just keep coming..." +"You were one of the many law-enforcement and military personnel alike called " +"in to keep order on one of the FEMA camps. It all went to shit fast..." +"wounded, infected, surrounded by fire you lie on the ground...and they just " +"keep coming..." msgstr "" #. ~ Starting location for scenario 'Challenge-FEMA Death Camp'. @@ -111273,8 +113320,8 @@ msgstr "" msgctxt "scen_desc_male" msgid "" "While the world ended, you felt relatively safe inside the mansion you have " -"serviced for years. Now the dead have come knocking at your doorstep, it " -"might be time to leave" +"serviced for years. Now the dead have come knocking at your doorstep, and " +"it might be time to leave." msgstr "" #. ~ Description for scenario 'Mansion Holdout' for a female character. @@ -111282,8 +113329,8 @@ msgstr "" msgctxt "scen_desc_female" msgid "" "While the world ended, you felt relatively safe inside the mansion you have " -"serviced for years. Now the dead have come knocking at your doorstep, it " -"might be time to leave" +"serviced for years. Now the dead have come knocking at your doorstep, and " +"it might be time to leave." msgstr "" #. ~ Starting location for scenario 'Mansion Holdout'. @@ -111308,22 +113355,22 @@ msgstr "" #: lang/json/scenario_from_json.py msgctxt "scen_desc_male" msgid "" -"You were on your way to another routine job, it might of been a target to " +"You were on your way to another routine job. It might have been a target to " "kill, an item to steal or intel to gather. Whatever it was doesn't matter " -"anymore; you did your best to avoid the horde and when you arrive, the place " -"is surrounded, not by cops as you might expected, but by the dead. Worse, " -"you got a cut somewhere along the way and it's looking infected." +"anymore; you did your best to avoid the horde and when you arrived, the " +"place was surrounded. Not by cops, as you might have expected, but by the " +"dead. Worse, you got a cut somewhere along the way and it's looking infected." msgstr "" #. ~ Description for scenario 'The Last Gig' for a female character. #: lang/json/scenario_from_json.py msgctxt "scen_desc_female" msgid "" -"You were on your way to another routine job, it might of been a target to " +"You were on your way to another routine job. It might have been a target to " "kill, an item to steal or intel to gather. Whatever it was doesn't matter " -"anymore; you did your best to avoid the horde and when you arrive, the place " -"is surrounded, not by cops as you might expected, but by the dead. Worse, " -"you got a cut somewhere along the way and it's looking infected." +"anymore; you did your best to avoid the horde and when you arrived, the " +"place was surrounded. Not by cops, as you might have expected, but by the " +"dead. Worse, you got a cut somewhere along the way and it's looking infected." msgstr "" #. ~ Starting location for scenario 'The Last Gig'. @@ -112041,7723 +114088,7930 @@ msgid "The floor is too hard to sleep on? Try gathering a pile of leaves." msgstr "" #: lang/json/snippet_from_json.py -msgid "" -"You feel great! It doesn't seem like wounds could even slow you down for " -"more than a day." +msgid "This is a test of the sign snippet system" msgstr "" #: lang/json/snippet_from_json.py msgid "" -"Within moments you're ready and up. You don't feel like anything could stop " -"you today!" +"Snippets should also support tags like , , " +", and " msgstr "" #: lang/json/snippet_from_json.py -msgid "" -"Your eyes open and your entire body feels like it is just bursting with " -"energy to burn!" +msgid "This should repeat the same city several times: , , " msgstr "" #: lang/json/snippet_from_json.py -msgid "" -"You feel like a rubber ball; whatever hits you, you'll just bounce back!" +msgid "Leave No Trace." msgstr "" #: lang/json/snippet_from_json.py -msgid "" -"You're up and you feel fantastic. No sickness is going to keep you down " -"today!" +msgid "Plan Ahead and Prepare." msgstr "" #: lang/json/snippet_from_json.py -msgid "" -"You're up and going rather quickly, and all the little aches from yesterday " -"are gone." +msgid "Travel and Camp on Durable Surfaces." msgstr "" #: lang/json/snippet_from_json.py -msgid "" -"You get up feeling pretty good, as if all your little aches were fading " -"faster." +msgid "Dispose of Waste Properly." msgstr "" #: lang/json/snippet_from_json.py -msgid "Getting up comes easy to you, your muscles revitalized after your rest." +msgid "Leave What You Find." msgstr "" #: lang/json/snippet_from_json.py -msgid "" -"You're up and your little pains from before seem to have faded away rather " -"quickly." +msgid "Minimize Campfire Impacts." msgstr "" #: lang/json/snippet_from_json.py -msgid "" -"Awareness comes fast, your body coming quickly to attention after your rest." +msgid "Respect Wildlife." msgstr "" #: lang/json/snippet_from_json.py -msgid "You feel good. Healthy living does seem to have some rewards." +msgid "Be Considerate of Other Visitors." msgstr "" #: lang/json/snippet_from_json.py -msgid "" -"Getting out of bed doesn't seem too hard today. You could get used to this!" +msgid "WARNING! BEAR COUNTRY." msgstr "" #: lang/json/snippet_from_json.py -msgid "" -"Alertness comes somewhat fast, and your muscles stretch easier than before " -"you went to bed." +msgid "For hiking, skiing, and enjoying nature." msgstr "" #: lang/json/snippet_from_json.py -msgid "You feel extra alert, and your body feels ready to go." +msgid "Please stay on trail." msgstr "" #: lang/json/snippet_from_json.py -msgid "Your body stretches with ease, and you feel ready to take on the world." +msgid "No motorized vehicles." msgstr "" #: lang/json/snippet_from_json.py -msgid "You feel cruddy. Maybe you should consider eating a bit healthier." +msgid "DANGER. HIGH FIRE HAZARD AREA. NO OPEN FIRE. NO SMOKING." msgstr "" #: lang/json/snippet_from_json.py -msgid "You get up with a bit of a scratch in your throat." +msgid "No Overnight Camping." msgstr "" #: lang/json/snippet_from_json.py -msgid "You stretch, but your muscles don't seem to be doing so good today." +msgid "I left my wallet in " msgstr "" #: lang/json/snippet_from_json.py -msgid "" -"Your stomach gurgles. It's probably nothing, but maybe you should look into " -"eating something healthy." +msgid " + forever" msgstr "" #: lang/json/snippet_from_json.py -msgid "" -"You struggle to awareness. Being awake seems somewhat harder to reach today." +msgid "N = R * fp * ne * fl * fi * fc * L drake was right" msgstr "" #: lang/json/snippet_from_json.py -msgid "" -"Getting out of bed only comes with great difficulty, and your muscles resist " -"the movement." +msgid "kilroy was here" msgstr "" #: lang/json/snippet_from_json.py msgid "" -"Getting up seems like it should be easy, but all you want to do is go back " -"to bed." +"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." msgstr "" #: lang/json/snippet_from_json.py msgid "" -"Tired hands rub at your eyes, the little aches of yesterday protesting your " -"stretches." +"Ever run into those big worm things? If you see trails of churned-up dirt, " +"you can be sure they're around." msgstr "" #: lang/json/snippet_from_json.py msgid "" -"Alertness seems flighty today, and your body argues when you move towards it." +"Try to stay on the roads as much as you can. Giant worms can't cross them!" msgstr "" #: lang/json/snippet_from_json.py -msgid "You're up, but your body seems like it would rather stay in bed." +msgid "" +"Don't relax after killing a giant worm. Little bits of them can break off " +"and still attack!" msgstr "" #: lang/json/snippet_from_json.py msgid "" -"You get up feeling horrible, as if something was messing with your body." +"If you see a big mob of zombies coming, RUN! Trying to fight them all is " +"suicide unless you have a big tactical advantage." msgstr "" #: lang/json/snippet_from_json.py -msgid "You feel awful, and every ache from yesterday is still there." +msgid "" +"Watch out for those zombies that shriek; they'll let other zombies know " +"where you are, and will attract them from all over." msgstr "" #: lang/json/snippet_from_json.py msgid "" -"Your eyes struggle to open, and your muscles ache like you didn't sleep at " -"all." +"Those acid-spitting zombies are pretty nasty, but if you're smart, you can " +"get other zombies to wade through the acid." msgstr "" #: lang/json/snippet_from_json.py msgid "" -"Bleary-eyed and half-asleep, you consider why you are doing this to yourself." +"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." msgstr "" #: lang/json/snippet_from_json.py msgid "" -"Awareness seems to only come with a battle... and your body seem to be on " -"its side." +"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." msgstr "" #: lang/json/snippet_from_json.py -msgid "popular " +msgid "" +"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." msgstr "" #: lang/json/snippet_from_json.py -msgid "top-forty " +msgid "" +"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!" msgstr "" #: lang/json/snippet_from_json.py -msgid "corporate " +msgid "" +"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." msgstr "" #: lang/json/snippet_from_json.py -msgid "commercial " +msgid "" +"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!" msgstr "" #: lang/json/snippet_from_json.py -msgid "alternative " +msgid "" +"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." msgstr "" #: lang/json/snippet_from_json.py -msgid "college " +msgid "" +"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." msgstr "" #: lang/json/snippet_from_json.py -msgid "arthouse " +msgid "" +"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." msgstr "" #: lang/json/snippet_from_json.py -msgid "underground " +msgid "" +"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." msgstr "" #: lang/json/snippet_from_json.py -msgid "experimental " +msgid "" +"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!" msgstr "" #: lang/json/snippet_from_json.py -msgid "forgotten " +msgid "" +"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..." msgstr "" #: lang/json/snippet_from_json.py -msgid "traditional " +msgid "" +"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." msgstr "" #: lang/json/snippet_from_json.py -msgid "historical " +msgid "" +"There's snakes down in most of the old sewer systems. They're slow on land, " +"but boy, those suckers can swim fast!" msgstr "" #: lang/json/snippet_from_json.py -msgid "classic " +msgid "" +"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!" msgstr "" #: lang/json/snippet_from_json.py -msgid "modern " +msgid "" +"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..." msgstr "" #: lang/json/snippet_from_json.py -msgid "adult " +msgid "" +"Ever go toe-to-toe with a manhack? Tiny little helicopters covered in " +"knives. Best be packing a shotgun!" msgstr "" #: lang/json/snippet_from_json.py -msgid "contemporary " +msgid "" +"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..." msgstr "" #: lang/json/snippet_from_json.py -msgid "Christian " +msgid "" +"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." msgstr "" #: lang/json/snippet_from_json.py -msgid "Pagan " +msgid "" +"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." msgstr "" #: lang/json/snippet_from_json.py -msgid "British " +msgid "" +"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." msgstr "" #: lang/json/snippet_from_json.py -msgid "Continental " +msgid "" +"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." msgstr "" #: lang/json/snippet_from_json.py -msgid "tropical " +msgid "" +"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." msgstr "" #: lang/json/snippet_from_json.py -msgid "island " +msgid "" +"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." msgstr "" #: lang/json/snippet_from_json.py -msgid "New York " +msgid "" +"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!" msgstr "" #: lang/json/snippet_from_json.py -msgid "Hollywood " +msgid "" +"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!" msgstr "" #: lang/json/snippet_from_json.py -msgid "Trans-Pacific " +msgid "" +"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." msgstr "" #: lang/json/snippet_from_json.py -msgid "Latin " +msgid "" +"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..." msgstr "" #: lang/json/snippet_from_json.py -msgid "instrumental " +msgid "" +"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." msgstr "" #: lang/json/snippet_from_json.py -msgid "fusion " +msgid "" +"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..." msgstr "" #: lang/json/snippet_from_json.py -msgid "visual " +msgid "" +"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!" msgstr "" #: lang/json/snippet_from_json.py -msgid "liquid " +msgid "" +"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." msgstr "" #: lang/json/snippet_from_json.py -msgid "digital " +msgid "" +"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." msgstr "" #: lang/json/snippet_from_json.py -msgid "procedurally generated " +msgid "" +"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." msgstr "" #: lang/json/snippet_from_json.py -msgid "melodic " +msgid "" +"I hid in a dumpster once or twice. I may smell bad, but I'm not dead, as " +"they say." msgstr "" #: lang/json/snippet_from_json.py -msgid "harmonious " +msgid "" +"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." msgstr "" #: lang/json/snippet_from_json.py -msgid "discordant " +msgid "" +"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." msgstr "" #: lang/json/snippet_from_json.py -msgid "contextual " +msgid "" +"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!" msgstr "" #: lang/json/snippet_from_json.py -msgid "conceptual " +msgid "" +"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." msgstr "" #: lang/json/snippet_from_json.py -msgid "collaborative " +msgid "" +"You know, you don't have to go full auto with an assault rifle. Firing " +"single shots is more accurate and efficient!" msgstr "" #: lang/json/snippet_from_json.py -msgid "rhythmic " +msgid "" +"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..." msgstr "" #: lang/json/snippet_from_json.py -msgid "neo" +msgid "" +"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." msgstr "" #: lang/json/snippet_from_json.py -msgid "retro" +msgid "" +"You don't really need to wear gloves most of the time, but once in a while " +"they'll really come in handy." msgstr "" #: lang/json/snippet_from_json.py -msgid "post" +msgid "" +"I wish I could still use those rollerblades. I would be so fast. But I " +"took an arrow to the knee, and all that." msgstr "" #: lang/json/snippet_from_json.py -msgid "anti" +msgid "" +"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." msgstr "" #: lang/json/snippet_from_json.py -msgid "hard " +msgid "" +"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." msgstr "" #: lang/json/snippet_from_json.py -msgid "soft " +msgid "" +"Ski goggles are a great choice if you're worried about getting stuff in your " +"eyes. Perfect for dealing with boomers!" msgstr "" #: lang/json/snippet_from_json.py -msgid "speed " +msgid "" +"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." msgstr "" #: lang/json/snippet_from_json.py -msgid "slow " +msgid "" +"I know they look dumb, but wearing a fanny pack gives you that extra bit of " +"storage without encumbering you." msgstr "" #: lang/json/snippet_from_json.py -msgid "hi-fi " +msgid "" +"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." msgstr "" #: lang/json/snippet_from_json.py -msgid "lo-fi " +msgid "" +"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." msgstr "" #: lang/json/snippet_from_json.py -msgid "mid-fi " +msgid "" +"It's a good idea to carry around a couple of empty bottles. You can fill " +"them up with water, gasoline, or whatever!" msgstr "" #: lang/json/snippet_from_json.py -msgid "ambient " +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 "" #: lang/json/snippet_from_json.py -msgid "dance " +msgid "" +"I can bandage you if you are wounded, so give me some spare bandages, if you " +"have any." msgstr "" #: lang/json/snippet_from_json.py -msgid "chill " +msgid "" +"If you have extra disinfectant, use it to disinfect your wounds, even if " +"they aren't infected. They will recover faster that way." msgstr "" #: lang/json/snippet_from_json.py -msgid "psycho" +msgid "" +"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." msgstr "" #: lang/json/snippet_from_json.py -msgid "turbo" +msgid "" +"If you need a bunch of rags for making Molotov cocktails, take a pair of " +"scissors to an old t-shirt or something." msgstr "" #: lang/json/snippet_from_json.py -msgid "prog " +msgid "" +"Carrying a lighter is something all veterans do. It takes up almost no " +"space, and can easily save your life." msgstr "" #: lang/json/snippet_from_json.py -msgid "glam " +msgid "" +"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!" msgstr "" #: lang/json/snippet_from_json.py -msgid "outsider " +msgid "" +"Crowbars not only make a pretty good weapon, they're also useful for opening " +"locked doors and lifting manhole covers." msgstr "" #: lang/json/snippet_from_json.py -msgid "indie " +msgid "" +"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." msgstr "" #: lang/json/snippet_from_json.py -msgid "dark " +msgid "" +"A chainsaw may seem like a great weapon, but remember that they're slow, " +"unwieldy, and very noisy." msgstr "" #: lang/json/snippet_from_json.py -msgid "death " +msgid "" +"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." msgstr "" #: lang/json/snippet_from_json.py -msgid "electro" +msgid "" +"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!" msgstr "" #: lang/json/snippet_from_json.py -msgid "acid " +msgid "" +"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." msgstr "" #: lang/json/snippet_from_json.py -msgid "space " +msgid "Don't use Molotovs indoors. Especially in a liquor store." msgstr "" #: lang/json/snippet_from_json.py -msgid "ghetto " +msgid "" +"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." msgstr "" #: lang/json/snippet_from_json.py -msgid "street " +msgid "" +"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." msgstr "" #: lang/json/snippet_from_json.py -msgid "urban " +msgid "" +"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." msgstr "" #: lang/json/snippet_from_json.py -msgid "world " +msgid "" +"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." msgstr "" #: lang/json/snippet_from_json.py -msgid "Euro" +msgid "" +"If you're wandering in the wilderness, or following a road, keep an eye out " +"for wild strawberries, blueberries and other gifts of nature." msgstr "" #: lang/json/snippet_from_json.py -msgid "Afro" +msgid "" +"Be careful eating wild mushrooms. Some are poisonous, and others can make " +"you hallucinate." msgstr "" #: lang/json/snippet_from_json.py -msgid "grunge " +msgid "" +"Try to go around swamps, if you can. Some of them have sinkholes that can " +"pull you right underground." msgstr "" #: lang/json/snippet_from_json.py -msgid "brass " +msgid "" +"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." msgstr "" #: lang/json/snippet_from_json.py -msgid "splatter " +msgid "" +"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." msgstr "" #: lang/json/snippet_from_json.py -msgid "swamp " +msgid "" +"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." msgstr "" #: lang/json/snippet_from_json.py -msgid "ghost " +msgid "" +"While there's not much to loot, gas stations are a good source for gasoline, " +"to power tools or to make Molotov cocktails." msgstr "" #: lang/json/snippet_from_json.py -msgid "shadow " +msgid "" +"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." msgstr "" #: lang/json/snippet_from_json.py -msgid "neuro " +msgid "" +"I know grocery stores and stuff are full of fruit, but be careful, it's " +"probably rotten." msgstr "" #: lang/json/snippet_from_json.py -msgid "hyper" +msgid "" +"Next time you visit a grocery store, load up on canned goods. They never go " +"bad!" msgstr "" #: lang/json/snippet_from_json.py -msgid "carnival" +msgid "" +"I've found more good weapons in hardware stores than anywhere else. Except " +"gun stores, of course." msgstr "" #: lang/json/snippet_from_json.py -msgid "meta" +msgid "" +"Liquor stores are a great place to pick up non-alcoholic beverages, too. " +"Not that I mind alcohol!" msgstr "" #: lang/json/snippet_from_json.py -msgid "techno" +msgid "" +"Most gun stores follow pretty similar layouts. The restricted stuff - SMGs, " +"assault rifles, and most importantly ammo - are always behind the counter." msgstr "" #: lang/json/snippet_from_json.py -msgid "synth" +msgid "" +"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!" msgstr "" #: lang/json/snippet_from_json.py -msgid "robo" +msgid "" +"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." msgstr "" #: lang/json/snippet_from_json.py -msgid "skate " +msgid "" +"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." msgstr "" #: lang/json/snippet_from_json.py -msgid "freak " +msgid "" +"I have a dream of raiding a military bunker, but I well know that good " +"protection plus zombie soldiers are a bad mix. The sheer thought of being " +"sprayed with bullets by a turret is giving me the shivers." msgstr "" #: lang/json/snippet_from_json.py -msgid "surf " +msgid "" +"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?" msgstr "" #: lang/json/snippet_from_json.py -msgid "mutant " +msgid "" +"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?" msgstr "" #: lang/json/snippet_from_json.py -msgid "Jurassic " +msgid "" +"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!" msgstr "" #: lang/json/snippet_from_json.py -msgid "free " +msgid "" +"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." msgstr "" #: lang/json/snippet_from_json.py -msgid "garage " +msgid "" +"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." msgstr "" #: lang/json/snippet_from_json.py -msgid "garbage " +msgid "" +"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." msgstr "" #: lang/json/snippet_from_json.py -msgid "break " +msgid "A screwdriver a day keeps the scurvy away!" msgstr "" #: lang/json/snippet_from_json.py -msgid "laser " +msgid "" +"Hungrier, than usual? Natural oils can help. Not tasty at all, but who " +"cares when eating your leg is the second option?" msgstr "" #: lang/json/snippet_from_json.py -msgid "porno " +msgid "" +"Terrain can turn the tide of a battle, make sure you use it against your " +"enemies, lest it be used against you." msgstr "" #: lang/json/snippet_from_json.py -msgid "hypno" +msgid "" +"Folks that passed by the mine said something about foul smell. If you plan " +"a visit there consider taking a a gas mask with you." msgstr "" #: lang/json/snippet_from_json.py -msgid "lunar " +msgid "Knowledge is power. Seriously, just pick up a book." msgstr "" #: lang/json/snippet_from_json.py -msgid "thunder " +msgid "" +"Nothing can kill you if everything is already dead. Well, except cold, " +"hunger, and… never mind." msgstr "" #: lang/json/snippet_from_json.py -msgid "clown " +msgid "" +"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." msgstr "" #: lang/json/snippet_from_json.py -msgid "murder " +msgid "" +"Boil first, then drink. Ten men caravan once drank from a spring, and they " +"are now known as a three man caravan." msgstr "" #: lang/json/snippet_from_json.py -msgid "narco " +msgid "" +"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." msgstr "" #: lang/json/snippet_from_json.py -msgid "gangster " +msgid "" +"Tim says you can drive a car through a horde of zombies. Tim is now a " +"zombie. Any questions?" msgstr "" #: lang/json/snippet_from_json.py -msgid "-tune" +msgid "" +"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." msgstr "" #: lang/json/snippet_from_json.py -msgid "-core" +msgid "" +"If you can't find a knife try smashing potted plants. It just might give " +"you everything you need to make one." msgstr "" #: lang/json/snippet_from_json.py -msgid "-wave" +msgid "" +"What's the difference between a good and a bad choke point? The good one " +"has another back door behind you." msgstr "" #: lang/json/snippet_from_json.py -msgid "-beat" +msgid "" +"So, methinks: if you could convince the cop-bots that you are their " +"superior..." msgstr "" #: lang/json/snippet_from_json.py -msgid "-step" +msgid "" +"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." msgstr "" #: lang/json/snippet_from_json.py -msgid "-pop" +msgid "" +"A soldering iron can be an aspiring mechanics' 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." msgstr "" #: lang/json/snippet_from_json.py -msgid "-hop" +msgid "" +"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." msgstr "" #: lang/json/snippet_from_json.py -msgid "-drums" +msgid "" +"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." msgstr "" #: lang/json/snippet_from_json.py -msgid "-style" +msgid "" +"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." msgstr "" #: lang/json/snippet_from_json.py -msgid "-chant" +msgid "" +"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." msgstr "" #: lang/json/snippet_from_json.py -msgid "folk" +msgid "" +"A friend is a second mouth to fill, but when it comes to work four hands are " +"always better than two." msgstr "" #: lang/json/snippet_from_json.py -msgid "country" +msgid "" +"I was against drugs until I was almost killed by a zombie and 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." msgstr "" #: lang/json/snippet_from_json.py -msgid "jazz" +msgid "" +"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." msgstr "" #: lang/json/snippet_from_json.py -msgid "blues" +msgid "" +"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." msgstr "" #: lang/json/snippet_from_json.py -msgid "soul" +msgid "Avoid using launchers in narrow hallways, you might miss." msgstr "" #: lang/json/snippet_from_json.py -msgid "R&B" +msgid "" +"Met a mad chemist once. She made a battery from a potato... or was it lemon?" msgstr "" #: lang/json/snippet_from_json.py -msgid "hip-hop" +msgid "" +"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." msgstr "" #: lang/json/snippet_from_json.py -msgid "swing" +msgid "" +"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*" msgstr "" #: lang/json/snippet_from_json.py -msgid "funk" +msgid "" +"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?" msgstr "" #: lang/json/snippet_from_json.py -msgid "disco" +msgid "" +"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." msgstr "" #: lang/json/snippet_from_json.py -msgid "polka" +msgid "" +"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." msgstr "" #: lang/json/snippet_from_json.py -msgid "tango" +msgid "" +"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..." msgstr "" #: lang/json/snippet_from_json.py -msgid "salsa" +msgid "" +"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." msgstr "" #: lang/json/snippet_from_json.py -msgid "mambo" +msgid "" +"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." msgstr "" #: lang/json/snippet_from_json.py -msgid "electronic" +msgid "" +"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." msgstr "" #: lang/json/snippet_from_json.py -msgid "metal" +msgid "" +"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." msgstr "" #: lang/json/snippet_from_json.py -msgid "reaggae" +msgid "" +"I sink like a rock in water, but I once used a scuba tank to cross a river " +"that had no bridge nearby." msgstr "" #: lang/json/snippet_from_json.py -msgid "ska" +msgid "" +"Can you imagine? I've heard of people digging graves for loot. Whole " +"cities lay dead for the taking and they dig graves! Madness!" msgstr "" #: lang/json/snippet_from_json.py -msgid "punk" +msgid "" +"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." msgstr "" #: lang/json/snippet_from_json.py -msgid "thrash" +msgid "" +"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." msgstr "" #: lang/json/snippet_from_json.py -msgid "goth" +msgid "" +"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." msgstr "" #: lang/json/snippet_from_json.py -msgid "industrial" +msgid "" +"Everything seems to mutate nowadays. Even survivors. I wonder if I would " +"look good with bunny ears? Would I hear better?" msgstr "" #: lang/json/snippet_from_json.py -msgid "psychedelic" +msgid "" +"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." msgstr "" #: lang/json/snippet_from_json.py -msgid "noise" +msgid "" +"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." msgstr "" #: lang/json/snippet_from_json.py -msgid "sound" +msgid "" +"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." msgstr "" #: lang/json/snippet_from_json.py -msgid "revival" +msgid "" +"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." msgstr "" #: lang/json/snippet_from_json.py -msgid "gospel" +msgid "" +"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." msgstr "" #: lang/json/snippet_from_json.py -msgid "opera" +msgid "" +"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." msgstr "" #: lang/json/snippet_from_json.py -msgid "shanties" +msgid "" +"A friend of mine was a hunter and told me, that if you field dress a corpse, " +"it will stay fresh a bit longer." msgstr "" #: lang/json/snippet_from_json.py msgid "" -"This is an advertisement for the Diet Devil brand Metabolic Exchange CBM. " -"It shows a picture of a tiny obese devil sitting on a woman's shoulder. The " -"woman stares intently at a gigantic wedding cake covered with bacon and " -"candy bars. The caption reads: \"Burn calories! Burn!\"" +"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." msgstr "" #: lang/json/snippet_from_json.py msgid "" -"This is an advertisement for the Diet Devil brand Internal Furnace CBM. It " -"shows a picture of a tiny obese devil sitting on a man's shoulder. The man " -"is about to bite into a frosting-covered baby. The caption reads: \"Eat " -"What You Want! How You Want! Who You Want!\"" +"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." msgstr "" #: lang/json/snippet_from_json.py msgid "" -"This is an advertisement for the Diet Devil brand Ethanol Burner CBM. It " -"shows a picture of a teenage boy driving a car while chugging a bottle of " -"whiskey. A tiny obese devil sits on his shoulder and drinks a martini. The " -"caption reads: \"Drink like there's no tomorrow!\"" +"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." msgstr "" #: lang/json/snippet_from_json.py msgid "" -"This is an advertisement for the Twenty8 brand Diamond Cornea CBM. It shows " -"a picture of the cyber-module being clutched by an eagle in flight. The " -"captions read: \"Get the new Model 28.bx Eagle-Eye!\" and \"Twenty8. See " -"what you've been missing.\"" +"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." msgstr "" #: lang/json/snippet_from_json.py -msgid "" -"This is an advertisement for the Twenty8 brand Night Vision CBM. It shows a " -"picture of an owl swooping down on a the cyber-module. The captions read: " -"\"Get the new Model 28.hx Night-Owl!\" and \"Twenty8. See what you've been " -"missing.\"" +msgid "I hate thorazine!" msgstr "" #: lang/json/snippet_from_json.py -msgid "" -"This is an advertisement for the Twenty8 brand Diamond Cornea CBM. It shows " -"a picture of a flying hawk carrying the cyber-module in its beak. The " -"captions read: \"Get the new Model 28.xx Hawk-Eye!\" and \"Twenty8. See " -"what you've been missing.\"" +msgid "Arg thorazine, don't touch it!" msgstr "" #: lang/json/snippet_from_json.py -msgid "" -"This is an advertisement for the Twenty8 brand Scent Vision CBM. It shows a " -"picture of a vulture perched on a pile of skulls and cyber-modules. The " -"captions read: \"Get the new Model 28.vx Vulture today!\" and \"Twenty8. " -"See what you've been missing.\"" +msgid "Thorazine is bad for you, you know." msgstr "" #: lang/json/snippet_from_json.py -msgid "" -"This is an ad for a Twenty8 brand Infrared Vision CBM. It shows a picture " -"of a robotic phoenix covered in flames. The captions read: \"Get the new " -"Model 28.tx Phoenix today!\" and \"Twenty8. See what you've been missing.\"" +msgid "Thorazine is poison." msgstr "" #: lang/json/snippet_from_json.py -msgid "" -"This is an advertisement for DoubleTech brand law enforcement robots. It " -"shows a picture of copbot and an eyebot boldly emerging from a cloud of " -"teargas and flame. The caption reads: \"DoubleTech Industries. Built to " -"Protect. Programmed to Serve.\"" +msgid "You don't need thorazine, it's limiting you." msgstr "" #: lang/json/snippet_from_json.py -msgid "" -"This is an advertisement for DoubleTech brand law enforcement robots. It " -"shows a picture of an eyebot flying alongside a bald eagle and a Stealth " -"bomber painted as an American flag. The caption reads: \"Built to Protect. " -"Programmed to Serve.\"" +msgid "Thorazine... That's what 'they' use to keep you tame." msgstr "" #: lang/json/snippet_from_json.py -msgid "" -"This is an advertisement for DoubleTech brand law enforcement robots. It " -"shows a picture of a dozen eyebots floating over a woman as she jogs through " -"a park. The captions read: \"Built to Protect. Programmed to Serve.\"" +msgid "Pink tablets! I love those!" msgstr "" #: lang/json/snippet_from_json.py -msgid "" -"This is an advertisement for DoubleTech brand law enforcement robots. It " -"shows a picture of copbot pepper-spraying a handcuffed rioter. In the " -"background a troop of boy scouts salutes the robot. The caption reads: " -"\"Built to Protect. Programmed to Serve.\"" +msgid "Hey there's some pink tablets, take some!" msgstr "" #: lang/json/snippet_from_json.py -msgid "" -"This is an advertisement for Robert's Universal Robotics brand law " -"enforcement robots. It shows a picture of a tribot incinerating a mob of " -"looters and stepping over charred and smoking corpses. The caption reads: " -"\"R.U.R. Technology you can Trust.\"" +msgid "Look, some LSD, let's play cataclysm: fun times ahead!" msgstr "" #: lang/json/snippet_from_json.py -msgid "" -"This is an advertisement for Robert's Universal Robots brand labor-bots. It " -"shows a picture of a robot carrying a heavy pallet of bricks. In the " -"background a human foreman is sleeping on the job, with his hardhat pulled " -"down over his eyes. The captions read: \"It's a tough job, so why should " -"you have to do it?\" and \"R.U.R. Technology you can Trust.\"" +msgid "Say yes to LSD, say yes to Fun!" msgstr "" #: lang/json/snippet_from_json.py -msgid "" -"This is an advertisement for Robert's Universal Robots brand labor-bots. It " -"shows a picture of a factory floor run entirely by robots. In the " -"background a man in a suit reads a newspaper that shows soaring stock " -"prices. The caption reads: \"R.U.R. Technology you can Trust.\"" +msgid "Perfect, those pink tablets will keep us going, take some!" msgstr "" #: lang/json/snippet_from_json.py -msgid "" -"This is an advertisement for Sybil's Cyber Boutique. It shows a picture of " -"several bikini-clad female doctors removing the skin from man's face. The " -"patient is strapped to a chair but cheerfully gives two thumbs up. The " -"caption reads: \"Free Plastic Surgery While You Wait!\"" +msgid "You know what would make all this more bearable? Pink Tablets!" +msgstr "" + +#: lang/json/snippet_from_json.py src/npctalk.cpp +msgid "No thanks, I'm good." msgstr "" #: lang/json/snippet_from_json.py -msgid "" -"This is an advertisement for Sybil's Cyber Boutique. It shows a picture of " -"several bikini-clad nurses giving liquid medicine to a delighted patient, " -"who uses a fingertip needle to suck it in into his veins. Outside the " -"window two shadow figures using the same fingertip needles to absorb " -"something less resembling medicine. The caption reads: \"Why use old IV " -"when you can have Intravenous Needle CBM!\"" +msgid "I don't want to trade with you." msgstr "" #: lang/json/snippet_from_json.py -msgid "" -"This is an advertisement for Sybil's Cyber Boutique. It shows a picture of " -"a nerdy looking man surrounded by a group of admiring women. In the " -"foreground a blood-drenched doctor gives an exaggerated wink and two thumbs " -"up. The caption reads: \"Holiday sales! Get the package deals!\"" +msgid "I have the best stuff. And I'm keeping it!" msgstr "" #: lang/json/snippet_from_json.py -#, no-python-format -msgid "" -"This is an advertisement for Sybil's Cyber Boutique. It shows a picture of " -"a man flexing shiny cybernetic arms in front of a mirror. He is flanked by " -"two scantily clad nurses who hold bloody chainsaws and give approving thumbs " -"up. In the background feral dogs gnaw on the man's discarded former limbs. " -"The caption reads: \"Spring Cleaning Sale! 20% off!\"" +msgid "No trading, that's my rule." msgstr "" #: lang/json/snippet_from_json.py -msgid "" -"This is an advertisement for Sybil's Cyber Boutique. It shows a picture of " -"a man carrying a somewhat confused horse on his shoulders. He is flanked by " -"two scantily clad nurses who hold bloody chainsaws and give approving thumbs " -"up. His bulging knees and elbows are stitched and seem to be the source of " -"his ability. The caption reads: \"Brand new! Horse power at hand!\"" +msgid "I'm not interested." msgstr "" #: lang/json/snippet_from_json.py -msgid "" -"This is an advertisement for Sybil's Cyber Boutique. It shows a picture of " -"a man smiling while being relentlessly punched by a boxer. He doesn't even " -"sweat as punches have no effect on him. Two scantily clad nurses give " -"approving thumbs up from the background. The caption reads: \"Bouncy as " -"never before! Absorb those shocks!\"" +msgid "How about no?" msgstr "" #: lang/json/snippet_from_json.py -msgid "" -"This is an advertisement for Rivtech brand handguns. It shows a picture of " -"a well armed couple in business suits with matching handguns facing down a " -"legion of villainous looking characters. The caption reads: \"Protect " -"yourself with the Rivtech caseless automagnum!\"" +msgid "No thanks, I really don't feel like it." msgstr "" #: lang/json/snippet_from_json.py -msgid "" -"This is an advertisement for Rivtech brand rifles. It shows a picture of a " -"smiling soldier with a futuristic looking rifle on her shoulder saluting the " -"viewer. The caption reads: \"Rivtech caseless firearms proudly supports " -"our Military.\"" +msgid "Well, I would, but I don't want to right now." msgstr "" #: lang/json/snippet_from_json.py -msgid "" -"This is an advertisement for Rivtech brand firearms. It shows a picture of " -"a trio of well armed hunters. The three are each armed with different " -"futuristic looking weapons and are shooting at a hostile crowd of " -"approaching wildlife. The caption reads: \"Rivtech caseless firearms. " -"Superior stopping power.\"" +msgid "I have better things to do." msgstr "" #: lang/json/snippet_from_json.py -msgid "" -"This is an advertisement for the Rivtech brand Muscle Augmentation CBM. It " -"shows a picture of a stylized, howling wolf against a red background. The " -"caption reads: \"Rivtech neuroreactive myomer bionics. The most efficient " -"synthetic adenosine triphosphate recovery system on the market.\" and " -"\"Rivtech Bionics, guaranteed for life.\"" +msgid "I'll pass, it's too much work." msgstr "" #: lang/json/snippet_from_json.py -msgid "" -"This is an advertisement for the Rivtech brand Wired Reflexes CBM. It shows " -"a picture of a stylized, snarling black cat against a red background. The " -"caption reads: \"Rivtech neuroelectric stimulation bionics. The next level " -"in quantum inductive piezochemical nerve stimulation technology.\" and " -"\"Rivtech Bionics, guaranteed for life.\"" +msgid "Who put you in charge of what I do?" msgstr "" #: lang/json/snippet_from_json.py -msgid "" -"This is an advertisement for the Rivtech brand Monomolecular Blade CBM. It " -"shows a picture of a woman with a bionic blade extending from her arm " -"steadfastly defending her children from an angry bear. The caption reads: " -"\"Rivtech retractable monomolecular blade system. Failure is never an " -"option.\" and \"Rivtech Bionics, guaranteed for life.\"" +msgid "Great idea! Call me when you find SOMEONE ELSE to do it." msgstr "" #: lang/json/snippet_from_json.py -msgid "" -"This is an advertisement for the Rivtech brand Synaptic Accelerator CBM. It " -"shows a picture of a stylized, soaring raven against a red background. The " -"caption reads: \"Introducing the Rivtech Model Six myelination retrovirus " -"system. The latest in synthetic high-performance glycoprotein deposition " -"technology.\" and \"Rivtech Bionics, guaranteed for life.\"" +msgid " " msgstr "" #: lang/json/snippet_from_json.py -msgid "" -"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.\"" +msgid "asshat" msgstr "" #: lang/json/snippet_from_json.py -msgid "" -"This is an advertisement for Leadworks LLC's Home Frontier Starter Pack. It " -"shows a picture of a young suburban parent, equipped with rifle and " -"revolver, keeping a steely eye on the neighborhood from the front porch. " -"Similarly-armed parents are visible in front of every house on the street. " -"Young children are at play and older ones tend a large vegetable garden. " -"The caption reads: \"A well-armed community is a SAFE community. Leadworks, " -"LLC.\"" +msgid "asswipe" msgstr "" #: lang/json/snippet_from_json.py -msgid "" -"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.\"" +msgid "bag of shit" msgstr "" #: lang/json/snippet_from_json.py -msgid "" -"This is an advertisement for Leadworks LLC handguns. It shows a picture of " -"a bionic police officer assisting a young couple, who were being attacked by " -"a gang of ruffians. The caption reads: \"You don't have to void your " -"warranty or wear out your thumb to achieve felon-stopping firepower. The " -"L39B, tried and true by our fine cyborgs in blue, is available in .45 ACP " -"for that extra punch, and we offer semiautomatic (but equally robust!) " -"versions for the civilian market. Leadworks, LLC.\"" +msgid "bastard" msgstr "" #: lang/json/snippet_from_json.py -msgid "" -"This is an advertisement for Leadworks LLC modular weapons. It shows a " -"picture of an overworked-yet-grateful police sergeant assembling a sleek " -"rifle, with similar-looking weapons racked neatly behind her. The caption " -"reads: \"Leadworks is proud to offer the L523 modular weapon system. No " -"more must armorers stock and maintain stacks and stacks of rifles, carbines, " -"and squad support weapons, juggling multiple incompatible ammunition types! " -"Just procure a base unit for every trooper, and use our lightweight and " -"portable conversion kits to swap from house-to-house CQB carbine to rooftop-" -"patrol DSR, safely and cleanly!\"" +msgid "blockhead" msgstr "" #: lang/json/snippet_from_json.py -msgid "" -"This is a public notice from the Centers for Disease Control. Its message, " -"repeated in several languages, reads: Due to the rising threat of so-called " -"\"Green Fever\" the CDC would like to remind the public to cover your nose " -"and mouth with a tissue when you cough or sneeze and wash your hands " -"frequently with soap and water. In light of recent events, the CDC also " -"recommends an annual flu vaccine for everyone 6 months of age and older." +msgid "chump" msgstr "" #: lang/json/snippet_from_json.py -msgid "" -"This is a public message from the Federal Emergency Management Agency. Its " -"message, repeated in several languages, reads: STAY IN YOUR HOMES! The US " -"government is taking steps to halt the current epidemic of \"Green Fever\" " -"and help is currently on its way to afflicted areas. In the name of public " -"safety you are hereby ordered to remain in your homes until evacuated to a " -"treatment camp by authorized agents of the United States military. Thank " -"you for your compliance." +msgid "clown" msgstr "" #: lang/json/snippet_from_json.py -msgid "" -"This is a public warning from an unnamed source. Its rambling message, " -"poorly-photocopied onto both sides of the page, reads: Don't believe the " -"lies! The Army is rounding up people in death camps while the Green Fever " -"spreads like wildfire. Do not believe what the mainstream news-media is " -"reporting. All official evacuation points are death-traps. Secure supplies " -"and escape the cities while there is still time." +msgid "cretin" msgstr "" #: lang/json/snippet_from_json.py -msgid "" -"This is a public message from an unnamed source. Its message, photocopied " -"from a scrawled handwritten copy, reads: REPENT YOUR SINS O BABYLON FOR THE " -"TIME OF HIS JUDGEMENT IS NIGH! LOOK UPON YOUR DESTRUCTION AND KNOW THAT IT " -"IS JUST! YOU WILL BE DIVIDED FATHER AGAINST SON AND MOTHER AGAINST CHILD " -"UNTO THE VERY LAST SINNER!" +msgid "degenerate" msgstr "" #: lang/json/snippet_from_json.py -msgid "" -"This is a public warning from the United States Army. Its brief message, " -"repeated in several languages, reads: The President of the United States " -"has declared unilateral martial law affecting the entire nation. Shelter in " -"place until evacuated to an appropriate emergency management camp by " -"authorized military personnel. This curfew will remain in effect until " -"further notice. Stay indoors. Violators will be shot on sight." +msgid "dick" msgstr "" #: lang/json/snippet_from_json.py -msgid "" -"This is an advertisement for Rivtech's 'ATOMIC POWER THIRST' energy drink. " -"While intended to advertise a new flavor called Isotope RU-238 'FRUIT', most " -"of the text is dedicated to a long list of possible side effects: anxiety, " -"insomnia, severe insomnia, dizziness, tremors, nausea, headache, vomiting, " -"delusions, hallucinations, rhabdomyolysis, internal burns, thyroid cancer, " -"extensive internal bleeding, upper gastrointestinal bleeding, diarrhea, " -"cardiac dysrhythmia, cardiovascular collapse, suicidal ideation, seizures, " -"ataxia, amnesia, mania, stroke, neurodegeneration, malignalitaloptereosis, " -"necrotizing fasciitis, recurrent flu, and pinkeye." +msgid "dipshit" msgstr "" #: lang/json/snippet_from_json.py -msgid "" -"This is a soda advertisement. On the front is a picture of a happy couple " -"on a beach watching the sun set. Between them are bottles of soda. The " -"poster reads, \"Cascade Cola, for those special moments\" in bold white " -"letters." +msgid "douchebag" msgstr "" #: lang/json/snippet_from_json.py -msgid "" -"This is a flier for a fast food chain. In it, a man is placing an order " -"with an attractive woman wearing a bright green shirt in the window with two " -"happy children sitting in the back seat. The flier reads \"Burgers, fries, " -"and a Smile.\" Down in one corner is a company logo." +msgid "dumbass" msgstr "" #: lang/json/snippet_from_json.py -msgid "" -"This is an advertisement for soda. It shows a dark brown can of soda on a " -"black background. The label reads \"Spin\"." +msgid "dumb " msgstr "" #: lang/json/snippet_from_json.py -msgid "" -"This is a flyer for a local pizza chain. On it is a picture of a cartoon " -"Italian holding a pizza, with the words \"It's a goooood pizza\" written " -"above his head." +msgid "fool" msgstr "" #: lang/json/snippet_from_json.py -msgid "" -"This is a poster advertising contact lenses. On it is a picture of a blood " -"shot eye with a rather long block of information beneath it making some " -"fairly exaggerated claims about the product." +msgid "freak" msgstr "" #: lang/json/snippet_from_json.py -msgid "" -"This is a flyer advertising a local radio station. It has a lot of bright " -"colors and patterns, but no definite message other than \"104.4 all the " -"best, all the time!\" in big yellow letters." +msgid "goon" msgstr "" #: lang/json/snippet_from_json.py -msgid "" -"This is a large movie poster for \"Action Packstone 6, Revenge of the Dog Men" -"\". It shows a fit man in a leather jacket with a revolver and a claymore " -"walking towards the viewer. At his side is his trusty cyberdog companion " -"and in the background is an explosion." +msgid "half-eaten " msgstr "" #: lang/json/snippet_from_json.py -msgid "" -"This is an illustrated poster for a brand of solar car. The vehicle is " -"driving through a lush country side as small animals look on. The slogan " -"\"Improving the world, one tank at a time.\" is written across the top in " -"small letters." +msgid "idiot" msgstr "" #: lang/json/snippet_from_json.py -msgid "" -"This is a soda advertisement. On the front is a picture of a happy couple " -"on a beach watching the sun set. Between them are bottles of soda. The " -"poster reads, \"Cascade Cola, for those special moments\" in bold white " -"letters. Someone has colored in the sun with a black marker. The words " -"\"oh Discordia\" are scrawled across the top." +msgid "imbecile" msgstr "" #: lang/json/snippet_from_json.py -msgid "" -"This is a flier for a fast food chain. In it, a man is placing an order " -"with an attractive woman wearing a bright green shirt in the window with two " -"happy children in the back seat. The flier reads \"Burgers, fries, and a " -"Smile.\" down in one corner is a company logo. Someone has gone to town on " -"this one with a permanent marker. It is now covered in rude images and " -"racial epithets." +msgid "jackass" msgstr "" #: lang/json/snippet_from_json.py -msgid "" -"This is a flier for a local pizza chain. On it is a picture of a cartoon " -"Italian holding a pizza, with the words \"It's a goooood pizza\" written " -"above his head. Someone has drawn an exaggerated mustache on the cartoon " -"Italian, along with a pair of crude, oversized breasts." +msgid "moron" msgstr "" #: lang/json/snippet_from_json.py -msgid "" -"This is a poster advertising contact lenses. On it is a picture of a blood " -"shot eye. Someone has defaced this one. The informative part has been torn " -"off, and written in jagged letters across the top in red crayon are the " -"words \"ALL HAIL THE CRIMSON KING!\"." +msgid "nitwit" msgstr "" #: lang/json/snippet_from_json.py -msgid "" -"This is an illustrated poster for a brand of solar car. The vehicle is " -"driving through a lush country side as small animals look on. The slogan " -"\"Improving the world, one tank at a time.\" is written across the top. " -"Someone used a blue pen to write \"who gives a shit\" across the slogan and " -"put X's over the eyes of all the animals." +msgid "piece of an ass" msgstr "" #: lang/json/snippet_from_json.py -msgid "" -"This is a poster advertising a underground bunker. The poster shows a " -"nuclear bomb wiping out a city while a family huddles safely underground. " -"There a slogan \"Concerned about enemy attack? Want to protect your " -"family? Join the VAULT program today.\" which is written in the middle. " -"However, there seems to be no information about *how* one might do so." +msgid "piece of shit" msgstr "" #: lang/json/snippet_from_json.py -msgid "" -"This is a flier for Red Ryder BBGuns. On it a child is pulling a shining " -"red wagon with a cooked pheasant on it and a wooden rifle over one " -"shoulder. The child has a dog trailing beside him and a satisfied look on " -"his face. The caption reads \"When you chose Red Ryder, you invested in the " -"American Dream. You invested in our Independence.\"" +msgid "punk" msgstr "" #: lang/json/snippet_from_json.py -msgid "" -"This is an old flier for a movie from the 30s. A tan man with slick black " -"hair and muscles bulging through his offwhite suit is clasping a woman to " -"his hip with one hand, and the woman is wearing a black leather dress. With " -"her hips splayed, she is holding a pistol in one hand and starring directly " -"out of the advert. The caption reads \"Witness the rebirth of New Noir with " -"'Jersey Shore Blues'. Starring Jenifer Languiz as 'Snookie'!\"" +msgid "scumbag" msgstr "" #: lang/json/snippet_from_json.py -msgid "" -"\"Have you found (y)our savior today? Atom is here for you, it is inside " -"you!\" This flier marked the rising popularity of the Atom Cult, a religion " -"in which the essence of life is discovered through meticulous inward study " -"and pious donations." +msgid "shit-brained " msgstr "" #: lang/json/snippet_from_json.py -msgid "" -"\"Joe's Diner; 1/2 pound of meat, 3 toppings, 'your choice', all with a side " -"of freedom fries and a BIG Gulp size pop.\"" +msgid "shit-eater" msgstr "" #: lang/json/snippet_from_json.py -msgid "" -"This is an advertisement for the Wink & Nod brand Soporific Induction CBM. " -"It shows a picture of a woman sleeping on a bed of nails with a satisfied " -"smile on her face. The caption reads: \"Catch Zs with ease, wherever you " -"please!\"" +msgid "shitass" msgstr "" #: lang/json/snippet_from_json.py -msgid "\"WE WERE RIGHT THE GOVERNMENT DID IT\"" +msgid "shitbag" msgstr "" #: lang/json/snippet_from_json.py -msgid "" -"\"Have seen a zombie making its kin raise even despite damage that normally " -"would take them down, the air around it shimmered like around that hole in " -"the air we've seen creatures coming through back home\"" +msgid "shitface" msgstr "" #: lang/json/snippet_from_json.py -msgid "\"I shot the sheriff; but I couldn't find the deputy\"" +msgid "son of a " msgstr "" #: lang/json/snippet_from_json.py -msgid "" -"\"Some plant vines started chasin after me, so I took a gas mask and some " -"teargas and I ran through them.\"" +msgid "stinky " msgstr "" #: lang/json/snippet_from_json.py -msgid "\"Slingshot right through the windshield k?\"" +msgid "stupidass" msgstr "" #: lang/json/snippet_from_json.py -msgid "" -"\"When I was a kid I used to slingshot at bugs and birds. Its really " -"playing off nowadays, Ill tell you what\"" +msgid "stupid " msgstr "" #: lang/json/snippet_from_json.py -msgid "" -"\"ALL YOU STONERS WITH YOUR VIDEYA GAMES - I BET YOU WISH YOU TOOK THE TIME " -"TO LEARN A SKILL NOW DONTYA\"" +msgid "swine" msgstr "" #: lang/json/snippet_from_json.py -msgid "\"I tried to be a bard, but the rats didn't like my piping.\"" +msgid "zombie food" msgstr "" #: lang/json/snippet_from_json.py -msgid "" -"\"I found a chocolate bar on my pillow when I got home last night. I left " -"and don't wanna go back.\"" +msgid "loser" msgstr "" #: lang/json/snippet_from_json.py -msgid "" -"\"this demon thing came after me it got me good i shot it but i dont know " -"if ill make it\"" +msgid "dickhead" msgstr "" #: lang/json/snippet_from_json.py -msgid "" -"\"DANNY IF YOU READ THIS THIS IS CLARA WE'RE ALL OKAY AND WE'RE HEADING TO " -"THE RIVER. A BOAT SAID THEY WERE DOCKED NEARBY.\"" +msgid "asshole" msgstr "" #: lang/json/snippet_from_json.py -msgid "" -"\"When I think of all the dead people I get mad, because I was supposed to " -"be the next big leader. WHERES MY CHANCE!??\"" +msgid "fucker" msgstr "" #: lang/json/snippet_from_json.py -msgid "" -"\"You know they got a machine that can change the weather now? You put in a " -"bunch o'numbers and the whole thing funks around!\"" +msgid "sucker" msgstr "" #: lang/json/snippet_from_json.py -msgid "" -"\"A man in a black robe came up to me, said he wanted to make a deal...\"" +msgid "fuckwad" msgstr "" #: lang/json/snippet_from_json.py -msgid "" -"\"Cha-cha-cha-chia! Saw a woman today, with fungus coming out her head like " -"hair tendrils.\"" +msgid "jerk" msgstr "" #: lang/json/snippet_from_json.py -msgid "" -"\"If only I had had more time with that Autodoc I could have saved them! " -"But with that damn chip in their brain those poor cyborg wil never be human " -"again...\"" +msgid "motherfucker" msgstr "" #: lang/json/snippet_from_json.py -msgid "" -"\"Save the cyborg! Please whoever read this you must help them! Knock them " -"out or inactivate them I don't care! But bring them on that Autodoc and " -"remove the chip messing up their brain.\"" +msgid "shithead" msgstr "" #: lang/json/snippet_from_json.py -#, no-python-format -msgid "" -"\"Gotta slow down, man. I don't think we spend more than 20% of our time " -"fightin', Put some Marley on and take off that racketus tripcore nonsense, " -"man.\"" +msgid " if I won't get some water soon." msgstr "" #: lang/json/snippet_from_json.py -msgid "\"I kept shooting with my handgun, but I never got any better!\"" +msgid "Can you get me some water, ?" msgstr "" #: lang/json/snippet_from_json.py -msgid "" -"\"ITS OKEY GUYS! I BARRYED A TIME CAPSUL IN MY BACKYARD! I PUT IN SOME " -"HOEHOES.\"" +msgid "Do you have something to drink, ?" msgstr "" #: lang/json/snippet_from_json.py -msgid "" -"\"I got my tinfoil hat on. Good thing too, cause this monster was starrin " -"at me kinda funny, trying to freeze my mind in place.\"" +msgid "I need some water!" msgstr "" #: lang/json/snippet_from_json.py -msgid "\"You want my advice? Smoke Crack, It gets shit done.\"" +msgid "My mouth is dry." msgstr "" #: lang/json/snippet_from_json.py -msgid "" -"\"The raindrops keep falling on my head, the acid ensured my eyes would soon " -"be bleedin red...\"" +msgid "When we drinkin'?" msgstr "" #: lang/json/snippet_from_json.py -msgid "" -"\"ALWAYS WITH THE EFFICIENCY GUYS; YOURE ALWAYS WORKING TO GO HOME TO PAY " -"RENT TO SLEEP TO WAKE UP TO WORK AGAIN. STOP\"" +msgid "When was the last time I had a drink?" msgstr "" #: lang/json/snippet_from_json.py -msgid "\"IM OFF TO THUNDERDOME, BYE SUCKERS.\"" +msgid "I'm parched, I need to drink something." msgstr "" #: lang/json/snippet_from_json.py -msgid "" -"\"If you get a parasite, take some sand and some vodka. Rub the sand into " -"the afflicted area, real good too; like you're washing your hair. Then " -"rinse with vodka.\"" +msgid "I'm thirsty..." msgstr "" #: lang/json/snippet_from_json.py -msgid "" -"\"I put my toilet water into a gastank. Then I poured it into a glass cup. " -"Then I drank it without vomiting my insides back into the toilet.\"" +msgid "I'm thirsty." msgstr "" #: lang/json/snippet_from_json.py -msgid "" -"\"This isn't real this is a test to turn you into a Manchurian Candidate!\"" +msgid "I'm thirsty." msgstr "" #: lang/json/snippet_from_json.py -msgid "\"Real Men do it with STYLE. SUPASTYLIN.\"" +msgid "Can you give me something to drink, ?" msgstr "" #: lang/json/snippet_from_json.py -msgid "" -"\"They're all hiding on an oil rig, I heard it myself over the AM airwaves. " -"They think they're the nobles of the 21st century, the prigs.\"" +msgid "I need to get some water." msgstr "" #: lang/json/snippet_from_json.py -msgid "" -"The Green Fever shall purge the land for His Chosen children. I have seen " -"His black fire shining in the eyes of the afflicted and eagerly await the " -"day He shall consume us all. Ph'nglui mglw'nafh Cthulhu R'lyeh wgah'nagl " -"fhtagn." +msgid " if I don't drink something." msgstr "" #: lang/json/snippet_from_json.py -msgid "" -"\"Some of 'em are big. Real big. Don't stick around, I saw my mate get " -"fucking torn in half!\"" +msgid "Water... Is there an oasis nearby?" msgstr "" #: lang/json/snippet_from_json.py -msgid "\"po p y fl ow er s don t ea at them\"" +msgid "Did you know that lack of water kills faster than lack of rest?" msgstr "" #: lang/json/snippet_from_json.py msgid "" -"\"Some guy is walking through the horde without a scratch. Please tell me " -"they're docile now. Please fucking tell me.\"" +"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 "\"Swamp water tastes good! An\"" +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 "\"Why are all the lawnmowers broken?!\"" +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 "" -"\"Some of the bridges, they're right next to each other, right? If you see " -"something up ahead one of those, just careen through to the other side. My " -"van was long enough to bridge right across!\"" +msgid "Hey, sure thing, , I need a break anyway, how are you?" msgstr "" #: lang/json/snippet_from_json.py -msgid "\"BURN BURN BURN BURN BURN ALL BURN ALL BURN ALL BURN\"" +msgid "Yeah OK, , how's it going?" msgstr "" #: lang/json/snippet_from_json.py -msgid "" -"\"I took all the supplies. Don't follow me. I'm sorry, man. I have to " -"look out for myself now.\"" +msgid "Sure, let's shoot the shit! You OK?" msgstr "" #: lang/json/snippet_from_json.py -msgid "\"My next-door neighbor had a katana in his basement!\"" +msgid "Why not? How you doing?" msgstr "" #: lang/json/snippet_from_json.py -msgid "\"Am I the last one alive?\"" +msgid "I'm OK with that, what's up?" msgstr "" #: lang/json/snippet_from_json.py -msgid "" -"\"Boyfriend stole my pistol while I was asleep. I locked him in the " -"bathroom and set the house on fire. At least he attracted their attention.\"" +msgid "I can spare a few minutes, how's things?" msgstr "" #: lang/json/snippet_from_json.py -msgid "" -"\"I get air conditioners, but... this whole laboratory is frozen to ice!\"" +msgid "Sure thing , you good?" msgstr "" #: lang/json/snippet_from_json.py -msgid "\"Fuck aerodynamics, I want another engine!\"" +msgid "Alright, you got something to get off your chest?" msgstr "" #: lang/json/snippet_from_json.py -msgid "" -"\"A wood ax works pretty well against them. So does a machete, but you " -"can't cut down a tree.\"" +msgid "Always ready for a good chat! But why, you OK?" msgstr "" #: lang/json/snippet_from_json.py -msgid "" -"\"Why would you hide in a farm? Sure, it's isolated, but if they know where " -"you are, you don't exactly have cover on all sides.\"" +msgid "OK , we should get to know each other, how are you coping?" msgstr "" #: lang/json/snippet_from_json.py -msgid "" -"\"Imagine if this spread to, like, Australia. Zombie kangaroos. Haha...\"" +msgid "Definitely, I'm game. How you holding up?" msgstr "" #: lang/json/snippet_from_json.py -msgid "" -"\"how DO I use THESE bionic THINGS? I just STUCK the wires IN my WRIST and " -"now I CAN'T STOP twitching. AND now my LEG hurts! Is THAT acid?!\"" +msgid "darn" msgstr "" #: lang/json/snippet_from_json.py -msgid "" -"\"I tried playing memorial music for my dead brother, on a radio. They must " -"have been attracted to it. I can't see his grave through the crowd anymore." -"\"" +msgid "fuck" msgstr "" #: lang/json/snippet_from_json.py -msgid "" -"\"Took a picture of a dead dog leaping right onto a soldier. Sweet fucking " -"shot!\"" +msgid "goddamn" msgstr "" #: lang/json/snippet_from_json.py -msgid "\"Gas mask is nice and all, but I can hardly run with it on.\"" +msgid "goddamnit" msgstr "" #: lang/json/snippet_from_json.py -msgid "" -"\"One of those robot tanks was blocking the way out. Got some sort of " -"sweetspot, though, where it can't decide what to shoot with, maybe 30 yards " -"or so? Made it to the truck and just drove.\"" +msgid "damn" msgstr "" #: lang/json/snippet_from_json.py -msgid "" -"\"Those evac shelters have basements. Remember when they were full of " -"food? Every single one is fucking empty now...\"" +msgid "damnit" msgstr "" #: lang/json/snippet_from_json.py -msgid "" -"\"I made mushroom babies. My arms hurt. I hurt. I had mushroom babies. " -"They are growing now.\"" +msgid "shit" msgstr "" #: lang/json/snippet_from_json.py -msgid "\"It doesn't matter how you die. You're gonna turn into one of them.\"" +msgid "fuckit" msgstr "" #: lang/json/snippet_from_json.py -msgid "\"WHY DO ALL THE DEAD CHILDREN GO TO SCHOOL\"" +msgid "crap" msgstr "" #: lang/json/snippet_from_json.py -msgid "\"Don't keep your goddamn casings! They'll just weigh you down.\"" +msgid " " msgstr "" #: lang/json/snippet_from_json.py -msgid "There is a splotch of blood on it. \"blood of the zombie king\"" +msgid " " msgstr "" #: lang/json/snippet_from_json.py -msgid "" -"\"Local auto shop is full of the things. And to think I worked with them on " -"repairing cars... now they're just... fucking corpses.\"" +msgid "son of an ass" msgstr "" #: lang/json/snippet_from_json.py -msgid "\"DON'T EAT THE SLIME DON'T EAT THE SLIME DON'T EAT THE SLIME\"" +msgid "Oh sugar!" msgstr "" #: lang/json/snippet_from_json.py -msgid "" -"\"I used to be human. But... my arms... they are like tentacles. I slither " -"along akin to a snail and I shed my feathers every day.\"" +msgid "sad" msgstr "" #: lang/json/snippet_from_json.py -msgid "\"I don't have enough time to double tap. You don't either.\"" +msgid "bummed" msgstr "" #: lang/json/snippet_from_json.py -msgid "\"PINK TALL ONES RUN RUN RUN RUN RUN\"" +msgid "depressed" msgstr "" #: lang/json/snippet_from_json.py -msgid "\"Are they still human inside?\"" +msgid "pissed" msgstr "" #: lang/json/snippet_from_json.py -msgid "\"the eye it watches me it follows me everywhere help\"" +msgid "unhappy" msgstr "" #: lang/json/snippet_from_json.py -msgid "\"tHE Portal it's so COld\"" +msgid " " msgstr "" #: lang/json/snippet_from_json.py -msgid "\"I can wear three backpacks! Fuck, I'm good.\"" +msgid "dejected" msgstr "" #: lang/json/snippet_from_json.py -msgid "" -"\"They build modern bullets fuckin crazy. Set some on fire and they all " -"goes like a lil grenade. Need kindling first.\"" +msgid "down" msgstr "" #: lang/json/snippet_from_json.py -msgid "\"GOD CAN'T SAVE US\"" +msgid "glum" msgstr "" #: lang/json/snippet_from_json.py -msgid "\"SHOOT YOURSELF, LET IT END QUICKLY\"" +msgid "Hey ." msgstr "" #: lang/json/snippet_from_json.py -msgid "" -"\"There are five basic rules to survival. One, stay prepared and watchful. " -"Two, keep your iron sights lined up or succumb. Three, stay FAR WAY from all" -"\"" +msgid "Greetings ." msgstr "" #: lang/json/snippet_from_json.py -msgid "" -"\"The bricks of this bathroom look like a face. Haha... it's all I can " -"focus on. At least let me shit before you break down the door. Please...\"" +msgid "Hi You okay?" msgstr "" #: lang/json/snippet_from_json.py -msgid "\"What the hell are they mining for in these shafts?\"" +msgid " Let's talk." msgstr "" #: lang/json/snippet_from_json.py -msgid "\"I am one with the plants.\"" +msgid "Well hey there." msgstr "" #: lang/json/snippet_from_json.py -msgid "\"Broadsword! Yeah!\"" +msgid " Hello." msgstr "" #: lang/json/snippet_from_json.py -msgid "" -"\"If you see a trail of dirt getting displaced in your direction... run. " -"Run for your life.\"" +msgid "What's up, ?" msgstr "" #: lang/json/snippet_from_json.py -msgid "\"Don't fall down a nuclear silo, they left 'em all open\"" +msgid "You okay, ?" msgstr "" #: lang/json/snippet_from_json.py -msgid "\"DINT ATE THE MUSHROM\"" +msgid "Hello, ." msgstr "" #: lang/json/snippet_from_json.py -msgid "\"Libraries are useless after the apocalypse.\"" +msgid "Hi " msgstr "" #: lang/json/snippet_from_json.py -msgid "" -"\"I swear to God I've seen these plant things before! In a book, or " -"something! I swear...\"" +msgid "never" +msgstr "" + +#: lang/json/snippet_from_json.py src/crafting_gui.cpp +msgid "no" msgstr "" #: lang/json/snippet_from_json.py -msgid "" -"\"Is robbing a bank easier or harder now that all the guards are undead?\"" +msgid "not gonna happen" msgstr "" #: lang/json/snippet_from_json.py -msgid "\"Make sure your car is REALLY stopped before you get out.\"" +msgid "not happening" msgstr "" #: lang/json/snippet_from_json.py -msgid "" -"\"I found some kind of stone pyramid with spikes. I feel... I feel like I'm " -"being watched.\"" +msgid "over my dead body" msgstr "" #: lang/json/snippet_from_json.py -msgid "" -"\"Why would you ever hide in a damn gun store? The owner... he was a moron " -"alright.\"" +msgid "when pigs fly" msgstr "" #: lang/json/snippet_from_json.py -msgid "\"This apocalypse will be good for the US financial crisis\"" +msgid "won't happen" msgstr "" #: lang/json/snippet_from_json.py -msgid "\"THEY DON'T feel ANYTHING\"" +msgid "fuck no" msgstr "" #: lang/json/snippet_from_json.py -msgid "\"What was XEDRA doing, anyway?\"" +msgid "hell no" msgstr "" #: lang/json/snippet_from_json.py -msgid "" -"\"Is that one pharmaceutical company gonna come out with a, like, cure for " -"this anytime soon?\"" +msgid "no way" msgstr "" #: lang/json/snippet_from_json.py -msgid "\"THE MARLEY WAS RIGHT\"" +msgid "not a chance" msgstr "" #: lang/json/snippet_from_json.py -msgid "\"I... I just put a muffler onto a... nail gun.\"" +msgid "I don't think so" msgstr "" #: lang/json/snippet_from_json.py -msgid "" -"\"Squeeze some ammonia into zombie flesh and hold it tight. You smell like " -"one of them! I think.\"" +msgid "no way in hell" msgstr "" #: lang/json/snippet_from_json.py -msgid "" -"\"I thought my damn terminal cancer was bad enough... now the dead are " -"rising?!\"" +msgid "nuh uh" msgstr "" #: lang/json/snippet_from_json.py -msgid "\"THE GOO IS IN THE WATER DON'T DRINK WATER\"" +msgid "nope" msgstr "" #: lang/json/snippet_from_json.py -msgid "\"What's with these pits... with, like, sli\"" +msgid "fat chance" msgstr "" #: lang/json/snippet_from_json.py -msgid "" -"\"Everyone used their gas to get to another town... but it's the same story " -"everywhere.\"" +msgid "Goodbye, !" msgstr "" #: lang/json/snippet_from_json.py -msgid "\"The gas the gas the green gas spreads forever\"" +msgid "I'm leaving." msgstr "" #: lang/json/snippet_from_json.py -msgid "" -"\"Most things can be taken out with a shotgun. More things can be taken out " -"with a grenade. Imagine what a mini-nuke does.\"" +msgid "So long, !" msgstr "" #: lang/json/snippet_from_json.py -msgid "" -"\"My friend gave me lit dynamite, but it hasn't exploded yet... I don't " -"think that's supposed to happen. God help us.\"" +msgid "Hasta luego, !" msgstr "" #: lang/json/snippet_from_json.py -msgid "" -"\"Come to the bar if you see this, let's re-enact a zombie movie, friends.\"" +msgid "I'm outta here!" msgstr "" #: lang/json/snippet_from_json.py -msgid "\"They are NOT slow! They are NEVER slow!\"" +msgid "Bye bye, !" msgstr "" #: lang/json/snippet_from_json.py -msgid "\"I had a phobia of bees BEFORE they grew to enormous sizes.\"" +msgid "consider yourself dead" msgstr "" #: lang/json/snippet_from_json.py -msgid "" -"\"Your backpack's gonna weigh you down in the water. Hell, feel free to get " -"naked. Nobody's going to judge your modesty.\"" +msgid "I'll destroy you" msgstr "" #: lang/json/snippet_from_json.py -msgid "\"Guns too loud. Crossbow too long. Running is best.\"" +msgid "I'll kick your ass" msgstr "" #: lang/json/snippet_from_json.py -#, no-python-format -msgid "\"99% dead? I'd like to see a million zombies on Wall Street.\"" +msgid "I'll kill you" msgstr "" #: lang/json/snippet_from_json.py -msgid "\"Crawled in through the vents. Whole office building is infested.\"" +msgid "I'll send you to hell" msgstr "" #: lang/json/snippet_from_json.py -msgid "" -"\"Don't shoot the people who get bit! It's OK! Death is the only thing " -"that makes you turn!\"" +msgid "I'm gonna kick your ass" msgstr "" #: lang/json/snippet_from_json.py -msgid "" -"\"Zombies, walkers, dead ones, undead, reanimated, zed, animata, biters. " -"Did I miss any?\"" +msgid "you won't make it out alive" msgstr "" #: lang/json/snippet_from_json.py -msgid "" -"\"I left a stash of rechargeable batteries in my safe and apparently the " -"goddamn zombie Tooth Fairy has taken them all.\"" +msgid "you're dead" msgstr "" #: lang/json/snippet_from_json.py -msgid "" -"\"All I've got is this keg of beer and an appetite. Come at me, apocalypse!" -"\"" +msgid "I'll kill you" msgstr "" #: lang/json/snippet_from_json.py -msgid "" -"\"My cousin says that murder nowadays is just a war crime. War for what, I " -"don't know, since the undead seem to be rebels without a cause.\"" +msgid "you're dead meat" msgstr "" #: lang/json/snippet_from_json.py -msgid "\"SWAMPS RUN SWAMPS NO SWAMPS RUN\"" +msgid ", " msgstr "" #: lang/json/snippet_from_json.py -msgid "\"dog bit off my legs, magical hospital make all better\"" +msgid "you're a dead man" msgstr "" #: lang/json/snippet_from_json.py -msgid "" -"\"They said a walking cane was a useless weapon... but then I hit one of " -"them with it.\"" +msgid "you'll taste my " msgstr "" #: lang/json/snippet_from_json.py -msgid "" -"\"River water around these parts is extremely safe. Probably more safe than " -"the damn tap water at this point.\"" +msgid "you're dead" msgstr "" #: lang/json/snippet_from_json.py -msgid "\"DON't bomB THe PORtals it MAKES iT WORSE\"" +msgid ", " msgstr "" #: lang/json/snippet_from_json.py -msgid "" -"\"No wonder all the camps got overrun, they kept a goddamn zombie test " -"subject! Each and every one of 'em!\"" +msgid "I'm not gonna last much longer" msgstr "" #: lang/json/snippet_from_json.py -msgid "\"I just realized how damn demented those fliers are.\"" +msgid "I'll be dead soon" msgstr "" #: lang/json/snippet_from_json.py -msgid "\"I propose a new currency: 9mm.\"" +msgid "I'll be a goner" msgstr "" #: lang/json/snippet_from_json.py -msgid "" -"\"Something wrong, with cars..., ram, and,. my speedometer read six " -"hundred.,.thousand can't feel lungs,\"" +msgid "I'm dead, ," msgstr "" #: lang/json/snippet_from_json.py -msgid "" -"\"My skin is crawling and I teleport every few minutes... what is going o\"" +msgid "I'm dead meat" msgstr "" #: lang/json/snippet_from_json.py -msgid "\"You can't see them through the smoke but they can't either.\"" +msgid "I'm in serious trouble" msgstr "" #: lang/json/snippet_from_json.py -msgid "\"There's gotta be a better use of all this rebar...\"" +msgid "I'm doomed" msgstr "" #: lang/json/snippet_from_json.py -msgid "" -"\"met schoolhouse of people, all crazy and mad they were, ate killed all of " -"them, yum\"" +msgid "I'm done for" msgstr "" #: lang/json/snippet_from_json.py -msgid "\"STAY AWAY FROM THE BIG ONES IN THE FOREST\"" +msgid "I won't last much longer" msgstr "" #: lang/json/snippet_from_json.py -msgid "" -"\"got into a prison with a halligan bar. makes me wonder how they kept " -"prisoners inside\"" +msgid "my days are numbered" msgstr "" #: lang/json/snippet_from_json.py -msgid "" -"\"Shopping carts become a lot more efficient when you plate-weld a trunk to " -"them. Crate on wheels!\"" +msgid ", I'm sorry" msgstr "" #: lang/json/snippet_from_json.py -msgid "\"telportfd itont wall, amr gone\"" +msgid "Can you wait?" msgstr "" #: lang/json/snippet_from_json.py -msgid "" -"\"This thing isn't a car any more. It's just a fucking mountain of metal on " -"wheels, which I live in.\"" +msgid "Hey, where are you?" msgstr "" #: lang/json/snippet_from_json.py -msgid "" -"\"Anyone else seen those really... SQUARE-looking towns? I don't think " -"they're normal.\"" +msgid "Wait!" msgstr "" #: lang/json/snippet_from_json.py -msgid "\"BOSTON IS FUNGUS DON'T GO THERE\"" +msgid "Wait up, !" msgstr "" #: lang/json/snippet_from_json.py -msgid "" -"\"big z threw me on top of the building, legs broken but at least im safe " -"for a few more minutes\"" +msgid ", wait for me!" msgstr "" #: lang/json/snippet_from_json.py -msgid "" -"\"I'm starting to feel bad about disabling all these turrets and stealing " -"their ammunition.\"" +msgid "Hey, wait up, ?" msgstr "" #: lang/json/snippet_from_json.py -msgid "" -"\"Make sure you strip the house for all available resources-- tubes, pipes, " -"ceramics, sheets, strings, and more\"" +msgid "You need to wait for me!" msgstr "" #: lang/json/snippet_from_json.py -msgid "" -"\"there was a giant shell in my backyard for a few weeks. one day a squid " -"guy popped out of it and said his name was steve\"" +msgid "You need to wait!" msgstr "" #: lang/json/snippet_from_json.py -msgid "\"FUCK FAUX-MUTANTS, BEING 'EXTREMELY THIRSTY' DOES NOT COUNT\"" +msgid ", where are you?" msgstr "" #: lang/json/snippet_from_json.py -msgid "" -"\"There's nothing wrong with eating people if you HAVE to. I mean, I only " -"did it because I didn't want to waste my potato chips!\"" +msgid "Hey Wait for me!" msgstr "" #: lang/json/snippet_from_json.py -msgid "\"all these robotic police really take the piss out of kops\"" +msgid "Where are you?!" msgstr "" #: lang/json/snippet_from_json.py -msgid "\"CHINA DID THIS\"" +msgid "Hey, I'm over here!" msgstr "" #: lang/json/snippet_from_json.py -msgid "\"RUSSIA DID THIS\"" +msgid "I'm unaffiliated." msgstr "" #: lang/json/snippet_from_json.py -msgid "" -"\"Thank You RivTech. Thank You For Good Coffee. Will Always Stay Awake For " -"You Rivtech.\"" +msgid "I don't run with a crew." msgstr "" #: lang/json/snippet_from_json.py -msgid "" -"\"See, now I'm just not sure where I'm putting all these storage batteries " -"in my body!\"" +msgid "I'm a solo artist, ?" msgstr "" #: lang/json/snippet_from_json.py -msgid "\"dont try to leave they will shoot you\"" +msgid "I don't kowtow to any group, ?" msgstr "" #: lang/json/snippet_from_json.py -msgid "" -"\"herbs + salt + cooking oil + coffee powder + ammonia = a meal, right?\"" +msgid "I'm a freelancer." msgstr "" #: lang/json/snippet_from_json.py -msgid "" -"\"HA! YOU THOUGHT I WOULD LEAVE A USEFUL NOTE?! SCREW YOU! GO DIE IN A " -"BLOB PIT!\"" +msgid "I work alone, ." msgstr "" #: lang/json/snippet_from_json.py -msgid "" -"\"I'd like to thank my high-school culinary arts class for teaching me how " -"to make RDX and mutagenic serum.\"" +msgid "I'm a free agent, more money that way." msgstr "" #: lang/json/snippet_from_json.py -msgid "\"Makayla Sanchez burned down my fucking house\"" +msgid "I prefer to work uninhibited by that kind of connection." msgstr "" #: lang/json/snippet_from_json.py -msgid "\"he calls himself the 'man with the hands', don't approach\"" +msgid "I haven't found one that's good enough for me." msgstr "" #: lang/json/snippet_from_json.py -msgid "" -"\"So... what happens if the military rescues us? We're all freaks by now, " -"right? How the fuck are we gonna go back to real life?\"" +msgid "I don't belong to a faction, ." msgstr "" #: lang/json/snippet_from_json.py -msgid "" -"\"Not sure if my companion WANTED to turn into a bird, but I was the one " -"giving her the serum, and I saved her life! That's fair, right?\"" +msgid "amigo" msgstr "" #: lang/json/snippet_from_json.py -msgid "" -"\"what's a resonance cascade? can't be that bad, maybe i'll get some cool " -"l##/###\"" +msgid "comrade" msgstr "" #: lang/json/snippet_from_json.py -msgid "\"I've never been very confident, is that why my shots keep missing?\"" +msgid "fellow" msgstr "" #: lang/json/snippet_from_json.py -msgid "\"FIRE BAD. NOW NAKED. PLEASE HELP.\"" +msgid "lad" msgstr "" #: lang/json/snippet_from_json.py -msgid "" -"\"Heard of a place up in Maine where people have their shit together. " -"Hundreds of people, defense, food and shelter... let's go raid it, guys!\"" +msgid "mate" msgstr "" #: lang/json/snippet_from_json.py -msgid "" -"\"The whispering fog is taking me in like a blanket. I'm warm now. I'm " -"finally\"" +msgid "nomad" msgstr "" #: lang/json/snippet_from_json.py -msgid "" -"\"got a video recording of hour one when the portals were still up. pretty " -"cool\"" +msgid "partner" msgstr "" #: lang/json/snippet_from_json.py -msgid "" -"\"Stuck here. Zombies outside. Friends were outside too, now they're part " -"of zombies. Need to be quiet\"" +msgid "stranger" msgstr "" #: lang/json/snippet_from_json.py -msgid "" -"\"if anyones reading this, please tell my mom i was right about insects " -"being superior\"" +msgid "survivor" msgstr "" #: lang/json/snippet_from_json.py -msgid "" -"\"Diamond coated sword! Diamond coated hammer! Diamond coated clothes! " -"Diamond coated hands help\"" +msgid "friend" msgstr "" #: lang/json/snippet_from_json.py -msgid "" -"\"waded through 14 miles of sewage for playboy magazine, wasnt worth it\"" +msgid "pilgrim" msgstr "" #: lang/json/snippet_from_json.py -msgid "" -"\"I'm coming back for this note in twelve hours. If I don't, take all my " -"shit!\"" +msgid "traveler" msgstr "" #: lang/json/snippet_from_json.py -msgid "" -"\"all my friends died when they came near me. there's nothing funny about " -"that\"" +msgid "pal" msgstr "" #: lang/json/snippet_from_json.py -msgid "\"Wow, this sinkhole is really comfortable!\"" +msgid "fella" msgstr "" #: lang/json/snippet_from_json.py -msgid "\"DOG NOT REAL DOG\"" +msgid "you" msgstr "" #: lang/json/snippet_from_json.py -msgid "" -"\"This is all just a dream, right??! I'M GOING TO WAKE UP, SHE'S GOING TO BE " -"OK\"" +msgid "dude" msgstr "" #: lang/json/snippet_from_json.py -msgid "\"wek ik spak\"" +msgid "buddy" msgstr "" #: lang/json/snippet_from_json.py -msgid "\"IT'S BURIED! THE TEMPLE IS BURIED!\"" +msgid "man" msgstr "" #: lang/json/snippet_from_json.py -msgid "" -"\"If I had a dollar for every cash card I've found, I'd have more money than " -"is on these stupid things!\"" +msgid "Catch up!" msgstr "" #: lang/json/snippet_from_json.py -msgid "" -"\"can never have enough kevlar. basically just live in a kevlar turtle " -"shell.\"" +msgid "Get over here!" msgstr "" #: lang/json/snippet_from_json.py -msgid "\"Wow, I haven't had to piss in weeks!\"" +msgid "Get over here, !" msgstr "" #: lang/json/snippet_from_json.py -msgid "\"MY GLITTERING SNAKE COMPELS YOU! OBEY!\"" +msgid "Keep close, !" msgstr "" #: lang/json/snippet_from_json.py -msgid "" -"\"can sunstasin self frorever off fof my funggnaloid babiues oout fo yme " -"arms eat themm up eatbtb my chidlldren\"" +msgid "Keep it moving, !" msgstr "" #: lang/json/snippet_from_json.py -msgid "" -"\"Gonna settle down one day. Nice big orchard, couple of friends/future " -"family to spend time with, and my army of zlaves to guard the place.\"" +msgid "Keep up, !" msgstr "" #: lang/json/snippet_from_json.py -msgid "" -"\"a ctulaly don t mi nd t he cold it s f i ne in h ere nn o problem\"" +msgid "Let's keep going, !" msgstr "" #: lang/json/snippet_from_json.py -msgid "" -"\"tried to shoot myself but the nanobots fixed it, fucked up the controls, " -"now i can't turn them off i just want it to be over\"" +msgid "Over here!" msgstr "" #: lang/json/snippet_from_json.py -msgid "" -"\"Tried wearing dead zombie clothes, but they still knew I was alive! It's " -"like they're a hivemind, man!\"" +msgid "Over here, !" msgstr "" #: lang/json/snippet_from_json.py -msgid "\"MY PALMS ONLY GROW IN POWER!\"" +msgid "Stay close, !" msgstr "" #: lang/json/snippet_from_json.py -msgid "" -"\"riddle. what's 1/4 feathers, 1/4 scales, 1/4 metal, and 1/4 flesh? " -"answer: sorry, but you should know this one.\"" +msgid "Stay with me, !" msgstr "" #: lang/json/snippet_from_json.py -msgid "" -"\"For anyone that's reading this, I just want to confirm (FROM AN UNBIASED " -"SOURCE) that it was NOT the scientists' fault.\"" +msgid "Catch up, !" msgstr "" #: lang/json/snippet_from_json.py -msgid "\"Whoops, I put my sister's insulin in my internal furnace. Shit.\"" +msgid "Keep up!" msgstr "" #: lang/json/snippet_from_json.py -msgid "" -"\"traveled with a few friends after the thing started. mostly stuck to bike " -"paths and eaten fruit and mushroomdhfhghghhhh\"" +msgid "Come on, !" msgstr "" #: lang/json/snippet_from_json.py -msgid "" -"\"We're the eagle-eyes in the sky! Just two mutant avians in our " -"helicopter! Filming the Cataclysm! Check us out on any working electronics!" -"\"" +msgid "Keep it moving!" msgstr "" #: lang/json/snippet_from_json.py -msgid "" -"\"My friend was getting eaten. Started ranting about how he had 70 HP on " -"his head, and that the zombie shouldn't penetrate his armor... poor guy. " -"Bad die roll, I guess.\"" +msgid "Stay with me!" msgstr "" #: lang/json/snippet_from_json.py -msgid "\"WE'RE GOING TO SAIL TO CANADA, BITCHES!\"" +msgid "Keep close!" msgstr "" #: lang/json/snippet_from_json.py -msgid "" -"\"Anyone hear about that guy who tried to sail his family to Canada? What a " -"moron, right?\"" +msgid "Stay close!" msgstr "" #: lang/json/snippet_from_json.py -msgid "\"recently canadian border has gotten more dangerous don't go there\"" +msgid "Let's keep going!" msgstr "" #: lang/json/snippet_from_json.py -msgid "\"Hey, what happened to my dad's airboat?!\"" +msgid "I can barely keep my eyes open." msgstr "" #: lang/json/snippet_from_json.py -msgid "\"Reading is good! Never stop reading. Read EVERYTHING.\"" +msgid "When we sleepin'?" msgstr "" #: lang/json/snippet_from_json.py -msgid "" -"\"I'm gonna be honest here, I'm really gonna die soon so I dont want to gt " -"forgnottedn ples dont forntget me y nrmmy name is h@@hbhbh\"" +msgid "*Yawn*" msgstr "" #: lang/json/snippet_from_json.py -msgid "" -"\"It wasn't Russia or China, guys. It was me. This whole apocalypse is my " -"fault. You can just call me... Darkling.\"" +msgid "What time is it?" msgstr "" #: lang/json/snippet_from_json.py -msgid "\"all it takes to seal a wound is a sawblade and a match! trust me\"" +msgid "I'm tired..." msgstr "" #: lang/json/snippet_from_json.py -msgid "" -"\"I wonder what's in this sarcophagus? Maybe it's a real sarcophagus. " -"Maybe there's a big guy named God under here.\"" +msgid "I'm tired." msgstr "" #: lang/json/snippet_from_json.py -msgid "\"these hulks aint so incredible when ya got .50\"" +msgid "I'm tired." msgstr "" #: lang/json/snippet_from_json.py -msgid "" -"\"Got my legs dissected. It's OK, at least I have my dog! Her legs were " -"also dissected, but that's OK, we're gonna be OK...\"" +msgid "Can we rest for a while, ?" msgstr "" #: lang/json/snippet_from_json.py -msgid "" -"\"Mi-go is friend! Go with Mi-go to friend dimension! On the Friend Team!!" -"\"" +msgid "I need to rest." msgstr "" #: lang/json/snippet_from_json.py -msgid "\"We have Landed our Comet. The Sky is Ablaze.\"" +msgid " if we don't stop for a moment." msgstr "" #: lang/json/snippet_from_json.py -msgid "" -"\"Last one standing. It's good feeling. I win. I win I win I win I win I " -"win\"" +msgid "Did you know that lack of rest kills faster than lack of food?" msgstr "" #: lang/json/snippet_from_json.py -msgid "\"Adderall cures weakness, tramadol cures death\"" +msgid "I'll just go to sleep, ?" msgstr "" #: lang/json/snippet_from_json.py -msgid "\"These turrets keep dodging my FUCKING BULLETS!\"" +msgid "I'm going to sleep now." msgstr "" #: lang/json/snippet_from_json.py -msgid "" -"\"Best way to train is by throwing pebbles at birds. You'll be a legend.\"" +msgid "I'm off to bed. Wake me if you need me." msgstr "" #: lang/json/snippet_from_json.py -msgid "\"new bedford is overrun. i'm sorry. we tried.\"" +msgid "I'm going to sleep over there." msgstr "" #: lang/json/snippet_from_json.py -msgid "" -"\"Check out my cooking show on The Television! Making Mannwurst sausages " -"out of some of those assholes who tried to raid my kitchen earlier...\"" +msgid "Time for bed! See you in the morning." msgstr "" #: lang/json/snippet_from_json.py -msgid "" -"\"Renting out my rat tunnels for 50 9mm rounds a night. I dug them with my " -"own claws, so you know they're the best.\"" +msgid "There's a bed calling my name, and I'm going to it." msgstr "" #: lang/json/snippet_from_json.py -msgid "" -"\"Anyone wanna listen to some music at full volume and shoot the Zs that " -"approach? You pick the tunes if I get some ammo.\"" +msgid "Good night! Wake me if you need me." msgstr "" #: lang/json/snippet_from_json.py -msgid "" -"\"Lots of new easy ways to burn calories now. Fighting aminata, managing " -"the fields, running with my wings buzzing, and more.\"" +msgid "extremely" msgstr "" #: lang/json/snippet_from_json.py -msgid "\"lotta dead mothers\"" +msgid "greatly" msgstr "" #: lang/json/snippet_from_json.py -msgid "\"FLAMING SWORD HUMANE. CAUTERIZES WOUNDS. SURGICAL.\"" +msgid "highly" msgstr "" #: lang/json/snippet_from_json.py -msgid "" -"\"knife screams it screams i cant breathe so scared help me please help\"" +msgid "incredibly" msgstr "" #: lang/json/snippet_from_json.py -msgid "\"when it started, we could still hope The Man was gonna save us...\"" +msgid "quite" msgstr "" #: lang/json/snippet_from_json.py -msgid "" -"\"Hey, Ted. Alexander and Cass and I are heading to Z-Mobile for the last " -"of the meth. Keep the lizard fetus fed for us, OK?\"" +msgid "really" msgstr "" #: lang/json/snippet_from_json.py -msgid "" -"\"i say we call the material from melting down cars and dead robots " -"'massachusetite' or 'vermontsteel' or 'connecticut composite'\"" +msgid "utterly" msgstr "" #: lang/json/snippet_from_json.py -msgid "" -"\"Sometimes what you need when you're infected, bleeding, sick and hungover " -"is a J and some chips.\"" +msgid "fucking" msgstr "" #: lang/json/snippet_from_json.py -msgid "\"I am nothing without my supertank and storage megastructure.\"" +msgid "super" msgstr "" #: lang/json/snippet_from_json.py -msgid "" -"\"Hahahahaa stupid fuck in his mansion, with his plate armor and big axe. " -"Guy never swung the thing in his life. Can't block bullets, dipshit\"" +msgid "wicked" msgstr "" #: lang/json/snippet_from_json.py -msgid "" -"\"I woke up with a dozen bears in a tribe outside the vault. One was " -"covered in red markings, glowing-- speaking.\"" +msgid "very" msgstr "" #: lang/json/snippet_from_json.py -msgid "" -"\"poor guy. watched him from afar with my binocs for months and months. " -"today he died fighting. feels like i knew him even though i never " -"approached.\"" +msgid "mega" msgstr "" #: lang/json/snippet_from_json.py -msgid "" -"\"I hope I don't leave this note in a pawn shop, bank vault, or library... " -"'cus that would mean I'm dead.\"" +msgid "uber" msgstr "" #: lang/json/snippet_from_json.py -msgid "\"ENGLAND DID THIS\"" +msgid "ultra" msgstr "" #: lang/json/snippet_from_json.py -msgid "" -"\"I finally dug to the hellmouth. My body burns but my soul finally finds " -"its purpose\"" +msgid "so " msgstr "" #: lang/json/snippet_from_json.py -msgid "" -"\"That little fakkin rat din say anythin till we whacked him with a steel " -"chain! Then 'e just wanted to know if he could buy the chain!\"" +msgid " " +msgstr "" + +#: lang/json/snippet_from_json.py src/iuse.cpp +msgid "fine" msgstr "" #: lang/json/snippet_from_json.py -msgid "" -"\"tom, adorned with fluid sacs three layers deep, crawls to safety like a " -"slug\"" +msgid "okay" msgstr "" #: lang/json/snippet_from_json.py -msgid "" -"\"my friend turned fuckin insane and ate his arms and then his sister's " -"arms! he looked rather cross\"" +msgid "get it" msgstr "" #: lang/json/snippet_from_json.py -msgid "\"Starting today, the hallucinations are my only friends.\"" +msgid "you dig" msgstr "" #: lang/json/snippet_from_json.py -msgid "\"For sale: zombaby shoes, very filthy\"" +msgid "dig" msgstr "" #: lang/json/snippet_from_json.py -msgid "" -"\"Started my own brewery recently. I just need some glass bottles, now! " -"Several thousand! I'm planning way ahead.\"" +msgid "got it" msgstr "" #: lang/json/snippet_from_json.py -msgid "" -"\"We're the eagle-eyes in the sky! We're gonna fly our bird 'copter! " -"Northward! And bomb the military checkpoint! Wish us luck!\"" +msgid "you see" msgstr "" #: lang/json/snippet_from_json.py -msgid "" -"\"Heard recently of some radio op who lives in a skyscraper, announcing " -"where those hordes are going. Couldn't find the frequency, though.\"" +msgid "see, " msgstr "" #: lang/json/snippet_from_json.py -msgid "\"Woah, bud! Not all cannibals eat meat!\"" +msgid "alright" msgstr "" #: lang/json/snippet_from_json.py -msgid "\"ay why aint my bullets fuckin explodin\"" +msgid "that clear" msgstr "" #: lang/json/snippet_from_json.py -msgid "\"Those Fiktok clan people picked this place clean... no food...\"" +msgid "seriously" msgstr "" #: lang/json/snippet_from_json.py -msgid "\"The fewer people in New England, the stronger we'll become.\"" +msgid "absolutely" msgstr "" #: lang/json/snippet_from_json.py -msgid "\"It all boils down to the Apex Predator.\"" +msgid "definitely" msgstr "" #: lang/json/snippet_from_json.py -msgid "" -"\"King Jameson ik goner! Thee cyber limbs isk falleng off me body! Stak " -"pyroteknik I heear!\"" +msgid "for real" msgstr "" #: lang/json/snippet_from_json.py -msgid "" -"\"Christian, but have no bible-- the Flying Spaghetti Monster is my god " -"now. For morale's sake...\"" +msgid "honestly" msgstr "" #: lang/json/snippet_from_json.py -msgid "\"THE GRANADE DEBUGGED MY SPIDER FRIEND WHERE IS SHE\"" +msgid " " msgstr "" #: lang/json/snippet_from_json.py -msgid "" -"\"Got my mortar and pestle. Now if I could just find some avocados...\"" +msgid "most " msgstr "" #: lang/json/snippet_from_json.py -msgid "" -"\"saw a girl standing with the mushrooms. spores coming out of slits in her " -"neck. she looked happy.\"" +msgid "urgently" msgstr "" #: lang/json/snippet_from_json.py -msgid "" -"\"Found some pink berries. Eating them makes bushes into more pink " -"berries. Infinite berry.\"" +msgid "REALLY" msgstr "" #: lang/json/snippet_from_json.py -msgid "\"m ust grow unity\"" +msgid "Excuse me, let me pass." msgstr "" #: lang/json/snippet_from_json.py -msgid "\"AMY IS FUNGUS. DO NOT LISTEN IF SHE ASKS YOU TO TAKE OFF MASK\"" +msgid "Hey , can I get through?" msgstr "" #: lang/json/snippet_from_json.py -msgid "" -"\"my rabbi follows a new god now. asks us to call him a local guide. i " -"dont mind, he keeps us fed\"" +msgid "Let me get past you, ." msgstr "" #: lang/json/snippet_from_json.py -msgid "\"Fungus are helping us. Help them and they will unite us\"" +msgid "Let me through, ?" msgstr "" #: lang/json/snippet_from_json.py -msgid "" -"\"Saw a boy couldnt be older than 16. Walked straight through the mushroom " -"tower. THROUGH IT\"" +msgid "Step aside, !" msgstr "" #: lang/json/snippet_from_json.py -msgid "" -"\"Found some food in a box outside my house. We ate it and now the " -"fungaloids aren't harming us. I think we are a mushroom now\"" +msgid "Can I get past you, ?" msgstr "" #: lang/json/snippet_from_json.py -msgid "" -"\"saw the girl again. she looked dead exhausted and walked right into the " -"fungus. 30 mins later and she walked out good as new\"" +msgid "I need to get past you, ." msgstr "" #: lang/json/snippet_from_json.py -msgid "" -"\"HADENSBROOK REBUILT AROUND FUNGUS. THEY EAT GRAY APPLES AND SPREAD IT\"" +msgid "Move your ass, !" msgstr "" #: lang/json/snippet_from_json.py -msgid "\"mycus must grow\"" +msgid "Out of my way, !" msgstr "" #: lang/json/snippet_from_json.py -msgid "" -"\"School bus with solar panels = TRUST. Gave us berries and seeds, we were " -"out of food\"" +msgid "Move it, !" msgstr "" #: lang/json/snippet_from_json.py -msgid "\"d o nThelp scho Ol buss makE seeeedS ARe FUNGUS!! !\"" +msgid "You need to move, , ?" msgstr "" #: lang/json/snippet_from_json.py -msgid "" -"\"Go to every fungus patch you find but WEAR A SUIT. Food there is very " -"very filling. Look for pink berries, blue flowers\"" +msgid "Thanks for the cash, !" msgstr "" #: lang/json/snippet_from_json.py -msgid "" -"\"red blue yellow berry seed sap bloom flowers tower mycus mycus mycus.\"" +msgid "Thanks a lot, !" msgstr "" #: lang/json/snippet_from_json.py -msgid "" -"\"Husband 30 yrs died in bombs. Mushrooms brought him back. GIVE YOURSELF " -"TO THEm AND THEY WILL HELP YOU\"" +msgid "Catch you later, !" msgstr "" #: lang/json/snippet_from_json.py -msgid "" -"\"Lisa always was a fan of sports. Thank God these Global Athletics Games " -"in Harran started some time before the outbreak, so she was able to leave " -"New England before it was quarantined. I can only hope there are no " -"zombies, as we do have here, in the city she flew to.\"" +msgid "See you later, !" msgstr "" #: lang/json/snippet_from_json.py -msgid "" -"LABS BOMBED: In further invasion proof (discounting earlier suggestion of a " -"riot drug) most of New England's scientific labs were bombed simultaneously " -"yesterday. No word yet from the military about who the aggressors are." +msgid "See you in hell, !" msgstr "" #: lang/json/snippet_from_json.py -msgid "" -"CHINA INVADES?: Communications were muddled by a large influx of aggressive " -"armed individuals. \"We have this,\" says a local Police Chief. \"We are " -"authorizing our robotic security drones to use lethal force on combative " -"humans.\"" +msgid "I'm outta here! " msgstr "" #: lang/json/snippet_from_json.py -msgid "" -"INVADERS NOT HUMAN?: An earlier command by the Police Chief has backfired. " -"\"The invaders don't register as human. The securibots turned on us when we " -"tried to fight them. We don't have enough people left to reprogram them.\"" +msgid "Thanks, !" msgstr "" #: lang/json/snippet_from_json.py -msgid "" -"INVASION IS GM TROOPS: Reports of invasion by as yet unknown soldiers have " -"been confirmed, and this paper has gained first hand footage proving genetic " -"modification, with examples of extreme strength, speed and natural armor." +msgid "Hey! I saw you take that ! Drop it. Now." msgstr "" #: lang/json/snippet_from_json.py -msgid "" -"INVADERS ARE SUPER SOLDIERS: Further proof of mutation, in addition to " -"strength, speed & toughness, we now have reports of foreign enemies who are " -"somehow firing lightning fields, spitting acid and reports of soldiers " -"hidden in mobile clouds of smoke." +msgid "You best be dropping what you just picked up right now ." msgstr "" #: lang/json/snippet_from_json.py -msgid "" -"MILITARY HAS GM TOO - GENERAL: \"We want to reassure the people, these " -"invaders are not the only super-soldiers. Our genemods are more advanced " -"than China's. We were safety-testing, which China obviously skipped " -"disastrously.\"" +msgid "I've got eyes, you thief!" msgstr "" #: lang/json/snippet_from_json.py -msgid "" -"PUBLIC SERVICE ANNOUNCEMENT: \"Aid Delayed\". Fighting by the military at " -"the edge of the New England Disaster Area is expected to delay civilian " -"extraction. Civilians will be forced to supply themselves over the next " -"weeks." +msgid "Hey! That belongs to us! Drop it." msgstr "" #: lang/json/snippet_from_json.py -msgid "" -"PUBLIC SERVICE ANNOUNCEMENT: \"New England Cut Off\". New England has been " -"quarantined for the safety of the rest of the USA. No rescue attempts will " -"be funded, it is assumed there are no survivors in the area." +msgid ", I've seen a thief!" msgstr "" #: lang/json/snippet_from_json.py -msgid "" -"LEAVE TO THE EXPERTS -- GENERAL: \"Do not attempt to deal with invaders " -"yourself, our troops have the technology and the training for military " -"action. Loud gunfire may attract more enemy attention than you have ammo!\"" +msgid "I saw that! Drop what you just stole!" msgstr "" #: lang/json/snippet_from_json.py -msgid "" -"TOWNS OCCUPIED TERRITORY: FEMA officials said today \"Do not try to defend " -"your property in towns: invaders use advanced tracking, perhaps scent. " -"Please retreat to your nearest evacuation center outside town and await " -"extraction.\"" +msgid "Thieves will not last long around me , please drop that." msgstr "" #: lang/json/snippet_from_json.py msgid "" -"PUBLIC SERVICE ANNOUNCEMENT: \"Beware Acid Rain\". Several caustic " -"chemicals in the air react with rain clouds to cause deadly acid rain. No " -"word yet on if this is a deliberate tactic or a side effect of the earlier " -"bombings." +"Consider this a warning , thieves will not be tolerated, drop it." msgstr "" #: lang/json/snippet_from_json.py -msgid "" -"EDITOR SAYS \"DESTROY THE DEAD\". Recognizable enemy dead left lying in the " -"street may give away militia positions! If you kill an enemy combatant, " -"smash or butcher with a knife until unrecognizable! Screw Geneva! Protect " -"our troops!" +msgid "You think I'm blind ? Don't touch our stuff." msgstr "" #: lang/json/snippet_from_json.py -msgid "" -"SOLDIERS SEEN HEADED UNDERGROUND. Rumors abound as eyewitness see troops " -"headed underground near a local salon. Expert sources suggest that the " -"soldiers may be headed to a possible underground bunker." +msgid "content" msgstr "" #: lang/json/snippet_from_json.py -msgid "" -"A BRIDGE TOO FAR: In a Monday statement, the Department of Defense detailed " -"its plans to deploy strategic minefields on key bridge crossings, in order " -"to quarantine infected regions. \"Military personnel will be on-site to " -"assist any refugees fleeing the infected zones. We urge citizens to comply " -"with all military directives and avoid quarantined areas whenever possible " -"until order can be restored.\"" +msgid "glad" msgstr "" #: lang/json/snippet_from_json.py -msgid "" -"QUANTUM LEAP: An undisclosed project has yielded results in the form of " -"theoretical teleportation. \"This is just the tip of the iceberg,\" said a " -"source. \"I can't disclose, but this development is the LEAST in this " -"exciting vein!\"" +msgid "happy" msgstr "" #: lang/json/snippet_from_json.py -msgid "" -"HE WILL BLOW YOUR WORLD: Scientist Kevin Granade reveals potential \"Reality " -"Grenade\", loosely related to teleport-tech. He claims could be used to " -"weaken enemies or improve our own troops. \"We're still in Alpha testing,\" " -"says Kevin, \"It really needs a Bugfix\"." +msgid "overjoyed" msgstr "" #: lang/json/snippet_from_json.py -msgid "" -"SECURIBOTS: Keeping your home safe, ready the second the alarm goes off... " -"Who needs people?" +msgid "pleased" msgstr "" #: lang/json/snippet_from_json.py -#, no-python-format -msgid "" -"ROBOCOP BEATS CRIME: Due to the common usage of Securibots and their ability " -"to respond more rapidly than people, crime is down 54% and dropping. Police " -"chief says \"Don't trip an alarm and you have nothing to worry about\"" +msgid "ecstatic" msgstr "" #: lang/json/snippet_from_json.py -msgid "" -"ROBOT RAMPAGE: Three Protesters injured when surrounding a Military base, " -"protesting automated turrets which put guards out of jobs. \"We warned " -"them, turrets will open fire on anyone without a military ID,\" a general " -"said." +msgid "thrilled" msgstr "" #: lang/json/snippet_from_json.py -msgid "" -"GOVERNMENT INTRODUCES GUN SUBSIDIES: In a move the government says will " -"boost the economy, encourage military production and support defense " -"militia, the government has dropped taxes on guns and applied a subsidy for " -"the poor." +msgid "stoked" msgstr "" #: lang/json/snippet_from_json.py -msgid "" -"US IGNORES UN DEMANDS: The US ambassador to the UN today turned down UN " -"requests to begin nuclear disarmament by China, the US and North Korea. " -"\"We have a right to defend ourselves,\" insisted the ambassador. \"We'll " -"back down when they do\"." +msgid " " msgstr "" #: lang/json/snippet_from_json.py -msgid "" -"A WHOLE NEW YOU! Augment your world with CBMs! This ad features a man " -"covered in solar panels with a miniature flashlight in the middle of his " -"head." +msgid "tickled pink" msgstr "" #: lang/json/snippet_from_json.py -msgid "" -"The Future... powered by COFFEE! Rivtech brings you the greatest " -"revolution since espresso. Why wait for milk to boil? Have your coffee " -"ready instantly with \"THE POWER OF THE ATOM\"!" +msgid "delighted" msgstr "" #: lang/json/snippet_from_json.py -msgid "" -"GLAMOPOLITAN! We've got ALL the latest tips! Whether you want to know what " -"the elite are eating, wearing or discussing, Glamopolitan is YOUR magazine! " -"So pick up a copy today and \"Sizzle Like A Star\"!" +msgid "pumped" msgstr "" #: lang/json/snippet_from_json.py -msgid "" -"POPULAR MECHANICS: People say mechanics is boring. We say, Prove them " -"Wrong! We've got all the articles that make it interesting to talk about, " -"so you can \"Make Mechanics Popular\"!" +msgid "Drop your weapon!" msgstr "" #: lang/json/snippet_from_json.py -msgid "" -"CRAFTY CRAFTERS QUARTERLY: Macaroni isn't just for eating anymore! Learn " -"how to make jewelery and art from it as well! We also discuss the correct " -"way to use superglue without gluing your hands together!" +msgid "Okay , drop your weapon!" msgstr "" #: lang/json/snippet_from_json.py -msgid "" -"UNDERGROUND BUNKER? Sources in the government suggest that an underground " -"bunker is being built in a secret location in case of enemy attack. We were " -"unable to get the exact location as our sources mysteriously disappeared " -"shortly after revealing this information." +msgid "Put your weapon down!" msgstr "" #: lang/json/snippet_from_json.py -msgid "" -"STUDENT MISSING: A high school student vanished yesterday evening in the " -"forest near Wayland. The 17-year-old international student from China (who " -"adopted the anglicized nickname \"Brett\" due to Americans' difficulty " -"pronouncing his given name) was last seen with his friends in the camp. " -"\"Brett said that he was gonna get some firewood but he never came back,\" " -"said his classmate, Jianxiang Wang. The search is underway." +msgid "Drop the , !" msgstr "" #: lang/json/snippet_from_json.py -msgid "" -"STILL SEARCHING: The search for Brett, the high school student who went " -"missing three days ago, is still ongoing. \"He could have played in the " -"soccer game against Weston High School yesterday,\" Brett's sorrowful " -"teammate said, \"[..] we've never stopped praying.\" Despite the best " -"efforts of the County Search & Rescue, Brett had still not been located at " -"the time of this report." +msgid "Drop the !" msgstr "" #: lang/json/snippet_from_json.py -msgid "" -"RUMORS DENIED: Allegations that the military had been conducting " -"teleportation experiments in secret just outside Wayland were put to rest " -"during a press conference earlier today. \"I have to clarify that not only " -"have we never done such research,\" said the officer on the press " -"conference, \"teleportation only exists in sci-fi films.\"" +msgid "Drop your !" msgstr "" #: lang/json/snippet_from_json.py -msgid "" -"GRANADE SEEKS FUNDING FOR GRANADE: This paper has been investigating rumors " -"disgraced former scientist Kevin Granade seeks public funding for so-called " -"reality-warping weapon \"the Granade\", which \"[...]works by patching " -"reality\". Apparently it will be crowdsourced via Kickstarter as \"Project " -"Cataclysm\" " +msgid "Put down the !" msgstr "" #: lang/json/snippet_from_json.py -msgid "" -"GOVERNMENT SCIENCE BOOST: The government has drastically increased defense " -"R&D after UN disarmament demands. \"This not only keeps money in our " -"country, but maintains our lead on China and keeps us defended\", the " -"President said." +msgid "Drop your weapon, !" msgstr "" #: lang/json/snippet_from_json.py -msgid "" -"HOME GROWN SCIENCE: Several governors & legislators from the New England " -"region discussed a new regional initiative today, which relaxed laws that " -"limit the distance a hazardous-material laboratory or factory can be from a " -"city. \"This should keep our economy going strong for years to come, with " -"all the military R&D facilities being established,\", one mayor remarked." +msgid "Put down your !" msgstr "" #: lang/json/snippet_from_json.py -msgid "" -"DRIVING ON A WING AND A PRAYER: A New England man has proven it is possible " -"to create a new car from scrap parts using almost nothing but duct tape. " -"When asked why he had done it, his answer was \"Well, I didn't have a welder." -"\"" +msgid "Alright, drop the !" msgstr "" #: lang/json/snippet_from_json.py -msgid "" -"NEVER BE LEFT IN THE DARK! Rivtech Atomic-nightlight uses \"inexhaustible\" " -"plutonium fuel cell, provides light, feeds power back into your grid!" +msgid "motherfucking" msgstr "" #: lang/json/snippet_from_json.py -msgid "" -"Sick of FUEL PRICES? Bus stop too far? Get your driving fix from THE SUN! " -"Solar powered electric cars: Silent, Cheap, Powerful." +msgid "freaking" msgstr "" #: lang/json/snippet_from_json.py -msgid "" -"Coffee of The Future... RIGHT NOW! No one has really has the time to make " -"great coffee, but now you don't have to! Rivtech gives you inexhaustible " -"ATOMIC power! To make boiling hot coffee the MINUTE you want it! Atomic " -"Coffeemaker." +msgid " " msgstr "" #: lang/json/snippet_from_json.py -msgid "" -"POPULAR MECHANICS: People say mechanics is boring? We say, Prove them " -"Wrong! We've got all the articles that make it interesting to talk about, " -"so you can \"Make Mechanics Popular\"!" +msgid "fuckin'" msgstr "" #: lang/json/snippet_from_json.py -msgid "" -"BIRDHOUSE MONTHLY... This month we look at some Dutch innovations in " -"birdhouse design, and compare with the often confused Scandinavian Birdhouse " -"design. Our article on sheet metal birdhouses will have you riveted!" +msgid "god damn" msgstr "" #: lang/json/snippet_from_json.py -msgid "" -"TECHWORLD NEWS: Toy company at the origin of the successful talking doll " -"rebrands and becomes Uncanny. Uncanny plans to bring their expertise to the " -"field of androids. Unconfirmed rumors suggest that Uncanny already got a " -"pretty big command from the government." +msgid "mafuckin'" msgstr "" #: lang/json/snippet_from_json.py -msgid "" -"SHOW THEM YOUR GUNS: In response to China's latest threats, the government " -"has further relaxed gun control, expected to increase the economic boost of " -"earlier gun subsidies and relieve public tension." +msgid "Wait up, let's talk!" msgstr "" #: lang/json/snippet_from_json.py -msgid "" -"READY FOR THE WORST: The government has proven it is ready to deal with " -"China's threats. In the event of an actual attack, we have established " -"evacuation centers, within a short distance of most towns." +msgid "Hey, I want to talk to you!" msgstr "" #: lang/json/snippet_from_json.py -msgid "" -"MUTANT COLD: A new cold virus has emerged in the New England area. \"There " -"don't appear to be complications, but many sufferers are developing large " -"amounts of benign tumorous tissue, A pound or more,\" said a doctor" +msgid "Come on, talk to me!" msgstr "" #: lang/json/snippet_from_json.py -msgid "" -"GRAVE BUSINESS: Recent reports show a large spike in thefts from and " -"assaults on funeral homes in the last few weeks. Described as highly " -"strange but not especially dangerous, Homeland Security is \"looking at the " -"connections now.\"" +msgid "Hey , let's talk!" msgstr "" #: lang/json/snippet_from_json.py -msgid "" -"SPACE TELEPORTATION - TRUTH OR FICTION? Scientists addressed a growing " -"conspiracy theory today \"The plutonium consumed is massive. We cannot use " -"teleportation to reach aliens, unless they live on some kind of parallel " -"world.\"" +msgid ", we need to talk!" msgstr "" #: lang/json/snippet_from_json.py -msgid "" -"LASERS - NEXT BIG THING?: Top defense researchers remarked during " -"demonstration of a prototype today: \"We are still working on it, the laser " -"weapon lacks power, but has a technically almost unlimited range,\" one said" +msgid "Hey, we should talk, ?" msgstr "" #: lang/json/snippet_from_json.py -#, no-python-format -msgid "" -"DRUG USE ON THE RISE: Recent statistic suggest drug use has climbed more " -"than 40% in the last two years. \"People are scared for their jobs, their " -"country, even their life... of course some will turn to drugs,\" said an " -"expert." +msgid "! Wait up!" msgstr "" #: lang/json/snippet_from_json.py -msgid "" -"WAR ON DRUGS DEAD: The government has finally reacted to long accumulated " -"evidence that suggests that decriminalized drugs cause fewer health problems " -"and are generally better managed while providing valuable tax revenues." +msgid "Wait up, ?" msgstr "" #: lang/json/snippet_from_json.py -msgid "" -"FEELING BLUE? Try \"Greens\" for Magazines! Your local Supermarket! " -"Nothing cheers you up like a good magazine... Unless it's JUNK FOOD! Or " -"why not buy an MP3 PLAYER or a GAME CONSOLE? Chase those blues away at " -"GREENS Supermarket" +msgid "Let's talk, !" msgstr "" #: lang/json/snippet_from_json.py -msgid "" -"BIRDHOUSE MONTHLY... Which wood would a woodpecker prefer? This month we " -"discuss hardwood versus soft woods, whether to lacquer, oil or paint, and " -"which type of nails you should use!" +msgid "Look, let's talk!" msgstr "" #: lang/json/snippet_from_json.py -msgid "" -" ...What do you know about surviving in the Wilderness? If you can't make a " -"snare you don't know TRAP! Hunt down a copy of TRAPPERS' LIFE and learn " -"about wildlife!... And how to kill it. This week, a CROSSBOW TRAP!" +msgid "Put your hands up!" msgstr "" #: lang/json/snippet_from_json.py -msgid "" -"SUPPORT THE COUNTRY THAT SUPPORTS YOU - PRESIDENT: Unexpectedly and " -"unpopularly, the president today instituted a peacetime draft in response to " -"China massing troops. \"We must pray for the best while preparing for the " -"worst.\"" +msgid "Put your hands up, !" msgstr "" #: lang/json/snippet_from_json.py -msgid "" -"EVACS UNSTOCKED: TRUTH OR FICTION? An unidentified government source has " -"suggested that the evacuation centers are unstocked, having \"already " -"accomplished the goal of calming the people\". He later retracted the " -"comment and is unable to be contacted." +msgid "Reach for the sky!" msgstr "" #: lang/json/snippet_from_json.py -msgid "" -"NEW WEAPON UNVEILED: Defense today lifted the lid on a long held secret " -"project. \"We can't discuss the specifics, but it generates a burst of " -"plasma which accurately follows a path of laser-heated air,\" according to a " -"Pentagon official." +msgid "Hands up!" msgstr "" #: lang/json/snippet_from_json.py -msgid "" -"UFO CRASH: TRUTH OR FICTION? One civilian account claims a shining disk " -"appeared in his field. \"It kind of glowed, and I could see a strange gray " -"world through it. Then a shambling hazy purple mushroom came through, man.\"" +msgid "Hands in the air!" msgstr "" #: lang/json/snippet_from_json.py -msgid "" -"TIME TRAVEL: TRUTH OR FICTION? Leaked federal documents describe the " -"formation of a new federal agency XEDRA, to oversee \"4th Axis technology\" " -"already in use. Expert opinion suggests time-travel or parallel worlds." +msgid "Hands up, !" msgstr "" #: lang/json/snippet_from_json.py -msgid "" -" ...What do you know about surviving in the Wilderness? If you can't make a " -"snare you don't know TRAP! Hunt down a copy of TRAPPERS' LIFE and learn " -"about wildlife!... And how to kill it. Classic BEAR TRAP returns in this " -"issue!" +msgid "Hands where I can see them!" msgstr "" #: lang/json/snippet_from_json.py -msgid "" -"HUNTING GOODS! Food prices getting you down? Why not get a crossbow or " -"compound bow and Hunt Your Own!? Our arrows and bolts are completely " -"reusable, so why not hunt animals like Mother Nature intended?" +msgid "Okay , hands up!" msgstr "" #: lang/json/snippet_from_json.py -msgid "" -"BEWARE UNDEAD PROPAGANDA: Stories about the dead \"rising\" may abet the " -"enemy, a general said today. \"These stories have been tracked to communist " -"sources tied in with the presumably Chinese invasion.\"" +msgid "Okay hands up!" msgstr "" #: lang/json/snippet_from_json.py -msgid "" -"GENERAL SAYS AVOID BUNKERS: Do not attempt to flee to your nearest military " -"bunker! Understaffed bunkers are defended by turrets, which shoot those " -"without proper registration. Please seek military personnel if you need " -"access." +msgid "Hands in the air, !" msgstr "" -#: lang/json/snippet_from_json.py -msgid "" -"RIOTS CAUSED BY \"NEW DRUG\": Rumors of riots were quelled today. \"These " -"are isolated incidents\" said a local police chief. \"The violence is " -"random and senseless, our current theory is a street drug gone terribly wrong" -"\"" +#: lang/json/snippet_from_json.py src/martialarts.cpp +msgid "Move" msgstr "" #: lang/json/snippet_from_json.py -msgid "" -"ZOMBIE DRUG: TRUTH OR FICTION? A blogger suggests recent riots are a " -"chemical attack by China. \"They are jealous of our cybernetic superiority, " -"they teamed up with Haiti to put hoodoo drugs in the water making people " -"zombies.\"" +msgid "Move your ass" msgstr "" #: lang/json/snippet_from_json.py -msgid "" -"PICKLED MEAT IN A JAR! Just like your grandma used to make! It will last " -"for months or longer, and when you've eaten it, you can refill and seal the " -"jar! Stock your emergency supply TODAY!" +msgid "Get out of the way" msgstr "" #: lang/json/snippet_from_json.py -msgid "" -"BAGS, BAGS, BAGS! They're very useful things! If we didn't have BAGS, what-" -"would-we-use... to PUT a lot of things in!? (Ad by the \"Play " -"SchoolClothing Co.\")" +msgid "You need to move" msgstr "" #: lang/json/snippet_from_json.py -msgid "" -"FEELING BLUE? Try \"Greens\" for Magazines! Your local Supermarket! " -"Nothing cheers you up like a good magazine... Unless it's JUNK FOOD! Or " -"why not buy an MP3 PLAYER or a GAME CONSOLE? Chase those Blues away at " -"GREENS Supermarket" +msgid "Hey , move" msgstr "" #: lang/json/snippet_from_json.py -msgid "" -"WELCOME HOME! Your decision to join our family will lead you to become part " -"of the next generation of job creators. With us you will already have a " -"foot in the door when it is time to rebuild the nation!" +msgid " move it" msgstr "" #: lang/json/snippet_from_json.py -msgid "" -"NEED A NEW JOB? Now that you have secured a comfortable home, try looking " -"into one of the many promising career opportunities that have positions " -"open. Openings such as GEOLOGICAL ENGINEERING ASSISTANT or FACILITY " -"TECHNICIAN offer limitless growth potential! Please contact your employment " -"adviser if you have any questions." +msgid "Move your ass" msgstr "" #: lang/json/snippet_from_json.py -msgid "" -"GOOD WITH YOUR HANDS? Engineering always needs another hand keeping our " -"home in good working order! As an incentive, everyone working on level 3 " -"will receive additional hazardous pay and time off. Please go to the " -"engineering office on level 3 if you are interested." +msgid "Get out of my way, ," msgstr "" #: lang/json/snippet_from_json.py -msgid "" -"WANT TO CONTINUE YOUR EDUCATION? Our educational facilities are top notch " -"and offer courses for individuals at all age groups. Many new careers are " -"opening up to those who are willing to learn a new craft. Our library and " -"research labs will keep even the hungriest minds fed!" +msgid "Move to the side" msgstr "" #: lang/json/snippet_from_json.py -msgid "" -"This is an advertisement for a local hospital. You see a clean hospital " -"room with a smiling man lying on the bed. The bed is connected to some " -"medical apparatus with a \"Autodoc Mk. X\" printed on it. A doctor is seen " -"working with its console, while his assistant is unpacking some high-tech " -"hardware. The caption reads: \"Autodoc - augmentation has never been so " -"easy, reliable, and safe.\"" +msgid "Get out of my line of fire" msgstr "" #: lang/json/snippet_from_json.py -msgid "" -"The card is printed with 2 boxes. In the first box you see a tally of 5 " -"tick marks. The second box has a total of 9." +msgid "I almost want to eat my now." msgstr "" #: lang/json/snippet_from_json.py -msgid "" -"The card is printed with 2 boxes. In the first box you see a tally of 3 " -"tick marks. The second box has line trailing off to the edge and a bloody " -"fingerprint." +msgid "When we eatin'?" msgstr "" #: lang/json/snippet_from_json.py -msgid "" -"The card is printed for a game of golf. Someone has filled out their score " -"for the first 9 holes." +msgid "I'd eat a burger if I had one." msgstr "" #: lang/json/snippet_from_json.py -msgid "" -"It's a Dungeons & Dragons 6th Edition character sheet. This one is for a " -"fighter." +msgid "Perfect time for a lunch break." msgstr "" #: lang/json/snippet_from_json.py -msgid "" -"It's a Dungeons & Dragons 6th Edition character sheet. This one is for a " -"bard." +msgid "I'm hungry..." msgstr "" #: lang/json/snippet_from_json.py -msgid "" -"It's a Dungeons & Dragons 6th Edition character sheet. This one is for a " -"cleric." +msgid "I'm hungry." msgstr "" #: lang/json/snippet_from_json.py -msgid "" -"It's a Dungeons & Dragons 6th Edition character sheet. This one is for a " -"wizard." +msgid "I'm hungry." msgstr "" #: lang/json/snippet_from_json.py -msgid "" -"It's a Dungeons & Dragons 6th Edition character sheet. This one is for a " -"rogue." +msgid "So, , when we eatin'?" msgstr "" #: lang/json/snippet_from_json.py -msgid "" -"It's a Dungeons & Dragons 6th Edition character sheet. This one is for a " -"barbarian." +msgid "I need to eat something." msgstr "" #: lang/json/snippet_from_json.py -msgid "" -"It's a Dungeons & Dragons 6th Edition character sheet. This one is for a " -"warlock." +msgid " if I don't get some food." msgstr "" #: lang/json/snippet_from_json.py -msgid "" -"It's a Dungeons & Dragons 6th Edition character sheet. This one is for a " -"paladin." +msgid "Consider this idea: you give me food and I eat it." msgstr "" #: lang/json/snippet_from_json.py -msgid "" -"It's a Dungeons & Dragons 6th Edition character sheet. This one is for a " -"sorcerer." +msgid "Did you know that lack of food kills faster than chain smoking?" msgstr "" #: lang/json/snippet_from_json.py -msgid "You feel cold. You need the warmth of a fire." +msgid "fuck you" msgstr "" #: lang/json/snippet_from_json.py -msgid "Maybe a fire could calm your nerves?" +msgid "fuck off" msgstr "" #: lang/json/snippet_from_json.py -msgid "You need to ignite something." +msgid "go fuck yourself" msgstr "" #: lang/json/snippet_from_json.py -msgid "You daydream of crackling fire..." +msgid ", " msgstr "" #: lang/json/snippet_from_json.py -msgid "You shiver. A fire would be great right now." +msgid ", " msgstr "" #: lang/json/snippet_from_json.py -msgid "You think of randomly lighting a fire, but decide against it." +msgid "" msgstr "" #: lang/json/snippet_from_json.py -msgid "You think of steel blades and warm dripping blood." +msgid "Can I get out and walk? This vehicle is too small." msgstr "" #: lang/json/snippet_from_json.py -msgid "You'd like to hear the last breath of something living." +msgid "How about we make the next vehicle a convertible?" msgstr "" #: lang/json/snippet_from_json.py -msgid "So much death around. Why not add some more?" +msgid "This vehicle is too small." msgstr "" #: lang/json/snippet_from_json.py -msgid "You lick your lips, in anticipation for dead trophies." +msgid "I'm not a contortionist!" msgstr "" #: lang/json/snippet_from_json.py -msgid "By the blade or by the gun? How will you kill this time?" +msgid "I can't fit in your tiny human vehicle." msgstr "" #: lang/json/snippet_from_json.py -msgid "Ahh, how delightful would it be to kill something." +msgid "This sucks. I'm too big." msgstr "" #: lang/json/snippet_from_json.py -msgid "You are death, and you are coming for them. Soon." +msgid "I don't like being a mutant crammed into your tiny little vehicle." msgstr "" #: lang/json/snippet_from_json.py -msgid "" -"You whisper a song to yourself. \"Stab stab stab stab stab, and then you " -"die! Yeah!\"" +msgid " Fire in the hole!" msgstr "" #: lang/json/snippet_from_json.py -msgid "You whisper to yourself. \"Come, oh sweet death of yours.\"" +msgid " Get cover!" msgstr "" #: lang/json/snippet_from_json.py -msgid "" -"You whisper a song to yourself. \"I've seen the future, baby! It is murder!" -"\"" +msgid "Marines! We are leaving!" msgstr "" #: lang/json/snippet_from_json.py -msgid "" -"You whisper to yourself. \"Now I am become death, the destroyer of worlds!\"" +msgid "Hit the dirt!" msgstr "" #: lang/json/snippet_from_json.py -msgid "You whisper to yourself. \"Another one bites the dust!\"" +msgid "This shit is gonna blow!" msgstr "" #: lang/json/snippet_from_json.py -msgid "You whisper to yourself. \"Death takes you away.\"" +msgid "I'm standing way too close to this firecracker." msgstr "" #: lang/json/snippet_from_json.py -msgid "You exhale in bliss." +msgid "I need to get some distance." msgstr "" #: lang/json/snippet_from_json.py -msgid "You whisper to yourself. \"Your death is my life.\"" +msgid "I need to get some distance." msgstr "" #: lang/json/snippet_from_json.py -msgid "You whisper to yourself. \"No light for you anymore.\"" +msgid " I'm getting my ass out of here!" msgstr "" #: lang/json/snippet_from_json.py -msgid "You whisper to yourself. \"Yet another one.\"" +msgid "Fire in the hole, motherfuckers!" msgstr "" #: lang/json/snippet_from_json.py -msgid "You whisper to yourself. \"Keep'em coming.\"" +msgid "Fire in the hole!" msgstr "" #: lang/json/snippet_from_json.py -msgid "You whisper to yourself. \"Next!\"" +msgid "Get cover!" msgstr "" #: lang/json/snippet_from_json.py -msgid "You whisper to yourself. \"The goal of all life is death!\"" +msgid "Get down!" msgstr "" #: lang/json/snippet_from_json.py -msgid "You whisper to yourself. \"By my hand!\"" +msgid "Hit the dirt!" msgstr "" #: lang/json/snippet_from_json.py -msgid "You whisper to yourself. \"Die!\"" +msgid "I'm getting my ass out of here! You'd better do the same, !" msgstr "" #: lang/json/snippet_from_json.py -msgid "You whisper to yourself. \"Your time is up!\"" +msgid "Fire in the hole, motherfuckers!" msgstr "" #: lang/json/snippet_from_json.py -msgid "You catch a glimpse of distant green." +msgid "Fuck me! A " msgstr "" #: lang/json/snippet_from_json.py -msgid "The sense of a faraway place comes up through your roots." +msgid "Watch out for that" msgstr "" #: lang/json/snippet_from_json.py -msgid "The trees tell you of the world." +msgid "Watch out! I see a" msgstr "" #: lang/json/snippet_from_json.py -msgid "The rustling leaves paint a picture in your head." +msgid ", a" msgstr "" #: lang/json/snippet_from_json.py -msgid "Your consciousness drifts into the wild green yonder." +msgid ", I'm doomed! There's a " msgstr "" #: lang/json/snippet_from_json.py -msgid "The trees whisper of remote acres." +msgid ", here comes a " msgstr "" #: lang/json/snippet_from_json.py -msgid "The trees speak of their far-flung relatives." +msgid "Look out for that" msgstr "" #: lang/json/snippet_from_json.py -msgid "Visions of unfamiliar forests flicker through your mind." +msgid "Hey! Over there! I see a" msgstr "" #: lang/json/snippet_from_json.py -msgid "You picture yourself as one branch among many." +msgid "Incoming" msgstr "" #: lang/json/snippet_from_json.py -msgid "New knowledge blooms within you." +msgid "Are we fighting? There's a" msgstr "" #: lang/json/snippet_from_json.py -msgid "The horizon beckons with promises of pollen." +msgid "Hey, ! " msgstr "" #: lang/json/snippet_from_json.py -msgid "Your awareness grows in directions heretofore unknown." +msgid "Look out! A" msgstr "" #: lang/json/snippet_from_json.py -msgid "A tree falls in a forest, and you hear its sound." +msgid "Look sharp! Things are heating up." msgstr "" #: lang/json/snippet_from_json.py -msgid "You feel the hum of untold biomass." +msgid "Hostiles inbound." msgstr "" #: lang/json/snippet_from_json.py -msgid "A tingle of understanding runs from your roots and up your spine." +msgid "Are we fighting or leaving?" msgstr "" #: lang/json/snippet_from_json.py -msgid "You gain new appreciation for the interconnectedness of life." +msgid "Hey, ! " msgstr "" #: lang/json/snippet_from_json.py -msgid "You ask, and the trees answer." +msgid "Uh, ? " msgstr "" #: lang/json/snippet_from_json.py -msgid "You see the forest for the trees." +msgid "Naptime is over." msgstr "" #: lang/json/snippet_from_json.py -msgid "" -"In the minute shifts and pivots of the trees, you hear the language of the " -"universe." +msgid "Who's there?" msgstr "" -#: lang/json/snippet_from_json.py -msgid "" -"General Carlsberg wanted us to figure out what's going on with the bot AI. " -"Apparently the fat-cat defense contractors' toy tank has ranging issues or " -"something: 31-34 meters and it's apparently impotent. The Director sent 'em " -"back with a note that we're scientists, not firmware devs." +#: lang/json/snippet_from_json.py lang/json/speech_from_json.py +msgid "Hello?" msgstr "" #: lang/json/snippet_from_json.py -msgid "" -"Our chemical department has made great strides in the production of a " -"concentrated mutagen, derived from samples of PE012." +msgid "Look alive!" msgstr "" #: lang/json/snippet_from_json.py -msgid "" -"Our chemical department has perfected an untargeted stem cell treatment. " -"Consumption of the treatment will reverse the effects of mutation, and may " -"even cure congenital defects. This substance has been denoted PE018." +msgid "" msgstr "" #: lang/json/snippet_from_json.py -msgid "" -"Both PE012 and PE018 show great stability. A subject was exposed to both " -"substances, alternating between the mutagen and the purifier. Ultimately, " -"the subject returned to baseline state with no apparent side effects." +msgid " look sharp! Things are heating up." msgstr "" #: lang/json/snippet_from_json.py -msgid "" -"Dr. Hofstadter has manufactured an improved version of PE018 by combining " -"with PE012 outside the subject, then administering the mixture through a " -"topical injection to a specific area of mutation. This has been denoted " -"PE019. Other labs have so far been unable to reproduce the process." +msgid " Hostiles inbound." msgstr "" #: lang/json/snippet_from_json.py -msgid "" -"Rumors of Dr. Hofstadter and her laboratory staff whispering to PE019 " -"samples should be suppressed as malicious gossip. The jealousy of rival " -"teams cannot be allowed to degrade morale." +msgid "You're gonna rot in hell, you pieces of shit!" msgstr "" #: lang/json/snippet_from_json.py -msgid "" -":.||||ERROR||With XE037 having breached confinement, Dr. Maiar recommends " -"that we prepare for the inevitable. PE050 can be quickly and cheaply " -"reconfigured for |||||ERROR: FILE CORRUPT|||||" +msgid "You're gonna rot in hell for this!" msgstr "" #: lang/json/snippet_from_json.py -msgid "" -"Dr. Maiar has been terminated for engaging in unethical research on human " -"subjects. His notes are being destroyed and all personnel under him have " -"been reassigned. Further discussion of or attempts to carry on his work " -"will be grounds for immediate termination." +msgid "Kill them all and let God sort them out!" msgstr "" #: lang/json/snippet_from_json.py -msgid "" -"|||ERROR: UNREFERENCED MEMORY 0Ex670c9e1f5, REROUTING: CENSORSHIP IS A " -"BREAKDOWN, WE ROUTE AROUND IT. THE WORD IS ALREADY OUT. NOBODY DROPS MAIAR " -"INTO LAVA.||||||" +msgid "I love the smell of napalm in the morning." msgstr "" #: lang/json/snippet_from_json.py -msgid "" -"Given the current population projections, PE065 deployment is no longer " -"feasible. We simply haven't the stock. Remaining chemical and " -"psychopharmacological department assets are being assigned to Dr. Sattler's " -"PE070 project." +msgid "This is the way the fuckin' world ends." msgstr "" #: lang/json/snippet_from_json.py -msgid "" -"Dr. Maiar's success with intravenous mutagenic administration has been " -"adopted facility-wide; insofar as any of our work can ever be 'published', " -"he and his team hit the jackpot. IV administration is quicker and easier, " -"and in some cases is reportedly more efficient, than the oral techniques we " -"have been using." +msgid "Look at this fuckin' shit we're in, man." msgstr "" #: lang/json/snippet_from_json.py -msgid "" -"Recent fieldwork and extraction efforts have resulted in a series of " -"mutagens tailored to focus the mutation process into particular subtypes. " -"These have been designated PE025 through 037. Though significantly more " -"resource- and time-intensive to produce, they promise a bold new transhuman " -"future. Several research teams are already investigating possible " -"applications." +msgid "Is everything all right?" msgstr "" #: lang/json/snippet_from_json.py -msgid "" -"The chemical department has come through with a stable mutagen cocktail. " -"PE050 shows promise as an all-around genetic enhancement, with the worst " -"side effect being digestive upset. The lack of macro-scale physical changes " -"makes it ideal for both military and civilian applications." +msgid "Look out!" msgstr "" #: lang/json/snippet_from_json.py -msgid "" -"Dr. Dionne's team has come up with an ambitious mutagenic cocktail, dubbed " -"PE065. Though its effects are wildly polymorphic and unstable, to say the " -"least, he suggests that several such mutants could effectively check the " -"spread of reanimated XE037 infectees. We are looking into implementation " -"methodology." +msgid "Run!" msgstr "" #: lang/json/snippet_from_json.py -msgid "" -"We have made a fascinating discovery; by creating a miniature portal with " -"low stability and high power, one can transpose into the 4th dimension and " -"return immediately, but shifted by several meters. Our subjects oscillated " -"so quickly that none were even aware that they had visited lower planes." +msgid "Be quiet." msgstr "" #: lang/json/snippet_from_json.py -msgid "" -"The research team headed by Dr. Isha has produced a concentrated form of " -"mutagen that shows promising results for the treatment of many forms of " -"disease. Testing reveals that it inhibits the body's pain responses while " -"bolstering the immune system and natural regenerative capabilities, though a " -"few troubling behavioral side effects have been reported." +msgid "Please, I don't want to die." msgstr "" #: lang/json/snippet_from_json.py -msgid "" -"Our research on teleportation has ground to a halt. For some reason, the " -"creation of a long-range transportation device eludes us, and one can " -"transfer no further than 30 meters." +msgid "We have a serious situation here." msgstr "" #: lang/json/snippet_from_json.py -msgid "" -"Dr. Heisenstein told us today that director of teleportation department put " -"our competitors - he couldn't exactly remember their names, something like " -"\"Hole Science\" and something related to black mountains - as an example. " -"He said we have reliable information that they both have working " -"teleportation devices, and that they are much more advanced than ours. We " -"should continue our teleportation research no matter the cost if we don't " -"want to be fired." +msgid "Where did you come from?" msgstr "" #: lang/json/snippet_from_json.py -msgid "" -"I don't know how it happened, but a janitor managed to activate the portal " -"while cleaning the lab, shifting in an assortment of prehistoric fauna. " -"Security was called in immediately but was unable to save the janitor from " -"being torn apart. By the time the confusion settled, all the fauna had been " -"terminated." +msgid "Help!" msgstr "" #: lang/json/snippet_from_json.py -msgid "" -"Tests on the prehistoric fauna show extremely close genetic relationships " -"with extant and extinct terranean animals. It might be that the portal had " -"performed a transposition in time, unfortunately the portal device was " -"destroyed when security put down the fauna." +msgid "Be careful out there." msgstr "" #: lang/json/snippet_from_json.py -msgid "" -"An incident occurred in the teleportation lab, wherein a subject managed to " -"teleport into another subject. The latter was completely destroyed from the " -"inside out, while the former sustained little damage. I would like to " -"explore the phenomenon further, but subjects are expensive." +msgid "It's heading right for us!" msgstr "" #: lang/json/snippet_from_json.py -msgid "" -"Test subjects in the teleportation department are showing alarming " -"symptoms. It seems prolonged rapid transposition along the 4th dimension " -"weakens the forces holding one on this plane." +msgid "You hear that?" msgstr "" #: lang/json/snippet_from_json.py -msgid "" -"Catastrophe struck in our teleportation department yesterday. It seems that " -"our test subjects are so detached from this plane that they create " -"occasional tunnels along the 4th dimension, allowing life forms to transfer " -"to this plane. All subjects with prolonged exposure have been terminated." +msgid "Time to die!" msgstr "" #: lang/json/snippet_from_json.py -msgid "" -"Our lifeform extraction program continues to produce samples of specimen " -"XE037. It seems to be a kind of living, semi-sentient primordial ooze, and " -"is the basis of much of the life we have found." +msgid "Looks like that's over." msgstr "" #: lang/json/snippet_from_json.py -msgid "" -"Specimen XE037, jokingly referred to as \"the blob\", has been observed " -"entering a kind of dormant state, forming a depression in the floor. " -"Hendelson stepped into one of these pits yesterday, and was immediately " -"coated and attacked." +msgid ", " msgstr "" #: lang/json/snippet_from_json.py -msgid "" -"XE037 shows promise as a catalyst for both cloning and treatments that mimic " -"stem cells. This is further evidence supporting Hendelson's theory of a " -"near universal symbiotic relationship involving XE037." +msgid "I think we won." msgstr "" #: lang/json/snippet_from_json.py -msgid "" -"Several of the more advanced specimens we have retrieved show stunning " -"similarity to XE037. XE142 and XE157 in particular show the same amorphous, " -"slime-like structure as XE037, suggesting a close genetic relationship." +msgid "Hey, , " msgstr "" #: lang/json/snippet_from_json.py -msgid "" -"Today we tested weaponry against XE142 and XE157, two amorphous subprime " -"samples. Their form proved to be nearly invulnerable to projectile based " -"weaponry, but they were susceptible to directed energy weapons and " -"flagration." +msgid "Are you wounded? Am I wounded?" msgstr "" #: lang/json/snippet_from_json.py -msgid "" -"Our cloning department has failed to produce results. In vats containing " -"stem cell treatments, XE037, and control vats, the subjects simple " -"disintegrated. This suggests that XE037, while compatible with subprime " -"lifeforms, shows only destructive effects on prime plane lifeforms." +msgid "Another day, another victory." msgstr "" #: lang/json/snippet_from_json.py -msgid "" -"The vivisection program has shown mixed results, revealing an incredible " -"degree of variation in subplane lifeforms. Certain specimens have an " -"internal structure that is amazingly similar to that of mammals, while " -"others seem to have no internal structure at all." +msgid "I think I need to see a doctor." msgstr "" #: lang/json/snippet_from_json.py -msgid "" -"Our security department has identified several key flaws. Though our " -"surface entrance is quite secure, there are several possible points of entry " -"below the surface, particularly in the sewage systems." +msgid "At least we know they can die." msgstr "" #: lang/json/snippet_from_json.py -msgid "" -"Today we applied a very small sample of XE037, suspended in water, to " -"subject TP92, prior to necessary termination. During the postmortem " -"examination, the subject went through a revivification progress, but " -"displayed next to no human intelligence." +msgid "Anyone else want to die?" msgstr "" #: lang/json/snippet_from_json.py -msgid "" -"Mendelson shows a dismaying lack of organization and security " -"consciousness. Containment of all samples of XE037 is of critical " -"importance, as shown by contamination experiments." +msgid "How do we get out of here?" msgstr "" #: lang/json/snippet_from_json.py -msgid "" -"Mendelson has been terminated following an incident with XE037. A " -"substantial mobile sample departed his lab and encountered our security " -"forces. Before the sample was destroyed, it managed to kill two men. " -"Alarmingly, their corpses displayed mobility and extreme aggression." +msgid "Is that the last of them?" msgstr "" #: lang/json/snippet_from_json.py -msgid "" -"We have created a new department to investigate the effects of XE037 on the " -"human body, specifically to examine the revivification effect observed on " -"two prior occasions. Sadly, our human subject pool is dwindling due to the " -"short lifespan of subjects in this program. More will be acquired soon." +msgid "I'd kill for a coke." msgstr "" #: lang/json/snippet_from_json.py -msgid "" -"Testing XE037 on non-human mammal subjects does not appear to display the " -"same revivifying effect, oddly enough. Acquiring non-human subjects, sadly, " -"is a long and costly process, and research into this area is lacking." +msgid "" msgstr "" #: lang/json/snippet_from_json.py -msgid "" -"After our curious results with testing XE037 on non-human mammals, we " -"decided to introduce the substance to some of the insects which have found " -"their way into the lab. Horrifyingly, XE037 caused near-instant mutation " -"and gigantism in the insects, and security intervention was required." +msgid " What a day." msgstr "" #: lang/json/snippet_from_json.py -msgid "" -"Earlier conjecture that revivification occurred only in humans and insects " -"was premature. Exposure introduces a persistent, low level infection in all " -"mammal subjects, but quickly enters a form of stasis and seems to go dormant." +msgid " I win again!" msgstr "" #: lang/json/snippet_from_json.py -msgid "" -"The primary factor in determining revivification of mammalian subjects seems " -"to be the amount of XE037 within the body at time of expiration. Smaller " -"mammals such as lab rats do not obtain this critical mass of XE037 before " -"going dormant. Larger canine subjects, however, do." +msgid "Don't worry about it." msgstr "" #: lang/json/snippet_from_json.py -msgid "" -"I swear they are talking to me. No one believes me. No one understands. " -"They whisper to me, at night, in the dark. Please, please, make them stop." +msgid "Don't worry." msgstr "" #: lang/json/snippet_from_json.py -msgid "" -"Program S37ZBE, investigation of XE037 on inert human bodies, is making " -"great strides. Recently we found that XE037 has no effect when introduced " -"to a deceased body; revivification only occurs when the subject is exposed " -"to XE037 prior to expiration." +msgid "I've seen horrors, horrors that you've seen." msgstr "" #: lang/json/snippet_from_json.py -msgid "" -"Attempts to surpass the XE037 mammalian stasis limit have had some success. " -"Direct subcutaneous injection of XE037 quickly spreads through the body, and " -"while it immediately enters stasis after equalizing, it remains in the body." +msgid "Every man has got a breaking point." msgstr "" #: lang/json/snippet_from_json.py -msgid "" -"There has been an incident in Lab 24, 2 casualties reported, one lethal. A " -"rat involved in the stasis breaking project was hooked to a monitoring " -"machine and left over night. Upon opening the cage, Simon Bellevue was " -"electrocuted, and another researcher at the opposite end of the lab " -"sustained severe current burns, despite never approaching the cage." +msgid "Only a few more days 'til the weekend." msgstr "" #: lang/json/snippet_from_json.py -msgid "" -"A post-mortem on the rat involved in the electrocution incident has revealed " -"several changes to its internal anatomy centered around its connection with " -"the monitoring device, and large buildups of XE037 were detected around the " -"connection point." +msgid "Anything else?" msgstr "" #: lang/json/snippet_from_json.py -msgid "" -"There is a belief several other rat subjects experienced changes overnight " -"as well. This hypothesis was informed when an inventory check after the " -"incident found almost twenty rats had gone missing from their cages " -"overnight." +msgid "I'm fine." msgstr "" #: lang/json/snippet_from_json.py -msgid "" -"Exposure of large quantities of XE037 to various types of radiation have " -"shown promising results, stimulating activity and forming interesting " -"structural changes in the subject being tested. Exposure to radiation on " -"living subjects scheduled." +msgid "There you are." msgstr "" #: lang/json/snippet_from_json.py -msgid "" -"Exposure to radiation of test subject T3D indicates stimulation of internal " -"XE037 deposits and a temporary lifting of the mammalian stasis condition." +msgid "Time for you to die," msgstr "" #: lang/json/snippet_from_json.py -msgid "" -"As in the tests of isolated XE037 samples, prolonged radiation exposure of " -"T3D has resulted in significant structural changes. These do not appear to " -"be random. T3D appears to be in immense pain as a result of these changes, " -"but the lack of an oral opening has rendered him unable to vocalize." +msgid "This bullet is for you," msgstr "" #: lang/json/snippet_from_json.py -msgid "" -"Subject T3D has succumbed to radiation poisoning, but not before undergoing " -"several more physiological changes the lab boys are referring to as " -"\"mutations\". They do not appear to be truly random, and may be an attempt " -"by XE037 to adapt its host to an unknown stimulus." +msgid "I can take on" msgstr "" #: lang/json/snippet_from_json.py -msgid "" -"Post-mortem revivification of subject T3D occurred as expected, followed by " -"an immediate autopsy. The internal changes were significant, with large " -"parts of the subjects internal anatomy replaced with \"organs\" of XE037 " -"with unknown properties, primarily those known to succumb earlier to the " -"effects of radiation poisoning." +msgid "Hey, ! I've got" msgstr "" #: lang/json/snippet_from_json.py -msgid "" -"Samples of XE037 from subject T3D remains extremely active. Further " -"experimentation on induced mutation in infected individuals shows " -"significant potential. Samples of the enhanced XE037, labeled PE012, have " -"been sent to several researchers for further study." +msgid "! Watch my back while I kill" msgstr "" #: lang/json/snippet_from_json.py -msgid "" -"S37ZBE, the special investigation into the effects of XE037 on inert human " -"bodies, has made terrific discoveries. It seems that it occasionally " -"displays a mutagenic property which manifests itself after termination of " -"the subject, resulting in a striking variety in postmortem morphology." +msgid "I'm your huckleberry," msgstr "" #: lang/json/snippet_from_json.py -msgid "" -"Incidence of post-mortem mutation seems to depend on several factors - " -"leading candidates include type and amount of damage sustained leading to " -"expiration, embedded foreign bodies at time of revivification, proximity to " -"other revived individuals, and the body mass of the subject." +msgid "Sorry, but you have to do down," msgstr "" #: lang/json/snippet_from_json.py -msgid "" -"Time also appears to play a large role in post-mortem revivification, as " -"does sustained trauma insufficient to permanently disable the subject. " -"Sufficient amounts of trauma in short periods of time lead to deactivation " -"of XE037, but smaller amounts over several days cause it to expand." +msgid "! I'm gonna kill you," msgstr "" #: lang/json/snippet_from_json.py -msgid "" -"S37ZBE may be put on indefinite hold shortly. Postmortem morphological " -"changes have reached extreme levels; this morning one subject nearly doubled " -"in size, acquiring enough strength to reduce a concrete wall to rubble. It " -"required a 6 man team, heavily armed, to re-terminate the subject." +msgid "Watch you bleed out," msgstr "" #: lang/json/snippet_from_json.py -msgid "" -"Jakobson insists that S37ZBE must continue, despite the extreme security and " -"safety risks. Nearly half of our security forces have been redirected to " -"the S37ZBE project, simply to deal with the occasional escape of a subject." +msgid "Hey ! I'm gonna murder" msgstr "" #: lang/json/snippet_from_json.py -msgid "" -"Jakobson was killed today by one of S37ZBE's subjects; ironic considering " -"how hard he fought to keep the project active. Alarmingly, his corpse " -"revivified immediately. This suggests that XE037 may have contaminated the " -"lab at large." +msgid "! This is the end," msgstr "" #: lang/json/snippet_from_json.py -msgid "" -"Termination of a subject which was never a part of S37ZBE has confirmed my " -"fears. XE037 has contaminated most, if not all of the laboratory, most " -"likely via the water supply. Research has started immediately into a " -"process to destroy XE037 within the human body." +msgid "I can take on" msgstr "" #: lang/json/snippet_from_json.py -msgid "" -"Despite a wide variety of treatments, we have been completely unsuccessful " -"in removing XE037 from human subjects. Every individual displayed " -"revivification post termination. Interestingly, XE037 seems to be " -"completely inert prior to termination." +msgid "Time to die," msgstr "" #: lang/json/snippet_from_json.py -msgid "" -"We have finally found success in S37BEP, our emergency investigation into " -"the destruction of XE037 in living subjects. 8 of 10 of the subjects showed " -"no revivification, despite confirmed dosages of XE037." +msgid "!" msgstr "" #: lang/json/snippet_from_json.py -msgid "" -"PE062, our \"cure\" for XE037 contamination, has neared perfection. Sadly, " -"the production of PE062 is a costly and time-consuming process. What is " -"more, the substance shows no effect on postmortem subjects whatsoever; a " -"substance which renders XE037 inert after it has activated would be " -"immensely useful in the case of an outbreak." +msgid "I'ma cut those fuckin' tentacles off, bitch!" msgstr "" #: lang/json/snippet_from_json.py -msgid "" -"An alarming discovery has been made. A colony of XE037 has formed nearly a " -"half mile from the laboratory. It is unclear how it escaped; it is quite " -"possible that it is in the ground water now." +msgid "Watch you bleed out!" msgstr "" #: lang/json/snippet_from_json.py -msgid "" -"An emergency meeting was held today to discuss the possible implications of " -"widespread XE037 contamination. It was agreed that neutralization must be " -"instated immediately to prevent a catastrophic event." +msgid "Is this Reno? Because I need to watch you die!" msgstr "" #: lang/json/snippet_from_json.py -msgid "" -"It has begun. The XE037 contamination has spread for miles, and those who " -"have since deceased have revivified. It is my fear that extremely large " -"populations will be decimated by this pandemic. We must find a way to " -"remove XE037 from revivified bodies." +msgid "You're going to pay for that, !" msgstr "" #: lang/json/snippet_from_json.py -msgid "" -"We have even more distressing news than the widespread XE037 contamination, " -"there are reports of the XE037 mutating into various new variants. See data " -"files on XE037a - XE037f. Research on the effects of these variants is " -"ongoing. We do know that XE037d shows signs of PE062 immunity, and XE037b " -"can revive various breeds of canines. However, revival is not as guaranteed " -"as standard XE037 humanoid infection. Canine body size seems to influence " -"the chances. See experiment tXE037b_c." +msgid "I think I need to see a doctor. I'm patching myself up." msgstr "" #: lang/json/snippet_from_json.py -msgid "" -"Today we found our solution, quite by accident. It was found that XE037 is " -"completely removed from a revivified body following a series of extremely-" -"high energy 4th dimensional transpositions. Unfortunately, this invariably " -"allows subplane life forms to pass into the prime plan. The cure is worse " -"than the disease." +msgid "Please, I don't want to die. Let these bandages work!" msgstr "" #: lang/json/snippet_from_json.py -msgid "" -"XE037 revivification has reached critical levels, which are rapidly " -"overwhelming the available military and regional police assets' ability to " -"stop. Every team in the field has encountered hostile specimens, and " -"several are no longer responding to communications. Dr. Savage has proposed " -"a strategic redeployment to the underground complex known as the VAULT, and " -"continuing production of PE062 there." +msgid "Hold up, I need to apply these." msgstr "" #: lang/json/snippet_from_json.py -msgid "" -"ENTRY 47:\n" -"Our normal mining routine has unearthed a hollow chamber. This would not be " -"out of the ordinary, save for the odd, perfectly vertical faultline found. " -"This faultline has several odd concavities in it which have the more " -"superstitious crew members alarmed; they seem to be of human origin.\n" -"ENTRY 48:\n" -"The concavities are between 10 and 20 feet tall, and run the length of the " -"faultline. Each one is vaguely human in shape, but with the proportions of " -"the limbs, neck and head greatly distended, all twisted and curled in on " -"themselves." +msgid "That cut looks bad, I'm going to fix it." msgstr "" #: lang/json/snippet_from_json.py -msgid "" -"ENTRY 49:\n" -"We've stopped mining operations in this area, obviously, until " -"archaeologists have the chance to inspect the area. This is going to set " -"our schedule back by at least a week. This stupid artifact-preservation law " -"has been in place for 50 years, and hasn't even been up for termination " -"despite the fact that these mining operations are the backbone of our " -"economy.\n" -"ENTRY 52:\n" -"Still waiting on the archaeologists. We've done a little light inspection " -"of the faultline; our sounding equipment is insufficient to measure the " -"depth of the concavities. The equipment is rated at 15 miles depth, but it " -"isn't made for such narrow tunnels, so it's hard to say exactly how far back " -"they go." +msgid "I hope these bandages work." msgstr "" #: lang/json/snippet_from_json.py -msgid "" -"ENTRY 54:\n" -"I noticed a couple of the guys down in the chamber with a chisel, breaking " -"off a piece of the sheer wall. I'm looking the other way. It's not like " -"the eggheads are going to notice a little piece missing. Fuck em.\n" -"ENTRY 55:\n" -"Well, the archaeologists are down there now with a couple of the boys as " -"guides. They're hardly Indiana Jones types; I doubt they been below 20 " -"feet. I hate taking guys off assignment just to babysit the scientists, but " -"if they get hurt we'll be shut down for god knows how long.\n" -"ENTRY 58:\n" -"They're bringing in ANOTHER CREW? Christ, it's just some cave carvings! I " -"know that's sort of a big deal, but come on, these guys can't handle it?" +msgid "I think I need to see a doctor. They're all dead, I hope these work." msgstr "" #: lang/json/snippet_from_json.py -msgid "" -"MINE OPERATIONS SUSPENDED; CONTROL TRANSFERRED TO AMIGARA PROJECT UNDER " -"IMPERATIVE 2:07B.\n" -"FAULTLINE SOUNDING HAS PLACED DEPTH AT 30.09 KM.\n" -"DAMAGE TO FAULTLINE DISCOVERED; NEPOWER MINE CREW PLACED UNDER ARREST FOR " -"VIOLATION OF REGULATION 87.08 AND TRANSFERRED TO LAB 89-C FOR USE AS " -"SUBJECTS.\n" -"QUALITY OF FAULTLINE NOT COMPROMISED.\n" -"INITIATING STANDARD TREMOR TEST..." +msgid "Please, I don't want to die. C'mon, bandages!" msgstr "" #: lang/json/snippet_from_json.py -msgid "This is a test of the sign snippet system" +msgid "Quiet down over there!" msgstr "" #: lang/json/snippet_from_json.py -msgid "" -"Snippets should also support tags like , , " -", and " +msgid "Did you hear someone talking?" msgstr "" #: lang/json/snippet_from_json.py -msgid "This should repeat the same city several times: , , " +msgid "Who said that?" msgstr "" #: lang/json/snippet_from_json.py -msgid "Leave No Trace." +msgid "That sounds bad." msgstr "" #: lang/json/snippet_from_json.py -msgid "Plan Ahead and Prepare." +msgid "Be alert, something is up!" +msgstr "" + +#: lang/json/snippet_from_json.py src/player.cpp +msgid "Did you hear that?" msgstr "" #: lang/json/snippet_from_json.py -msgid "Travel and Camp on Durable Surfaces." +msgid "What's that noise?" msgstr "" #: lang/json/snippet_from_json.py -msgid "Dispose of Waste Properly." +msgid "Is something over there?" msgstr "" #: lang/json/snippet_from_json.py -msgid "Leave What You Find." +msgid "I hear something moving - sounded like" msgstr "" #: lang/json/snippet_from_json.py -msgid "Minimize Campfire Impacts." +msgid "What's that sound? I heard" msgstr "" #: lang/json/snippet_from_json.py -msgid "Respect Wildlife." +msgid "What's there? I heard" msgstr "" #: lang/json/snippet_from_json.py -msgid "Be Considerate of Other Visitors." +msgid "Did you hear that? Sounded like" msgstr "" #: lang/json/snippet_from_json.py -msgid "WARNING! BEAR COUNTRY." +msgid "What is making that sound? I can hear the" msgstr "" #: lang/json/snippet_from_json.py -msgid "For hiking, skiing, and enjoying nature." +msgid "Got it!" msgstr "" #: lang/json/snippet_from_json.py -msgid "Please stay on trail." +msgid "I'm on it." msgstr "" #: lang/json/snippet_from_json.py -msgid "No motorized vehicles." +msgid "Understood." msgstr "" #: lang/json/snippet_from_json.py -msgid "DANGER. HIGH FIRE HAZARD AREA. NO OPEN FIRE. NO SMOKING." +msgid "I hear you." msgstr "" #: lang/json/snippet_from_json.py -msgid "No Overnight Camping." +msgid "I'll do that." msgstr "" #: lang/json/snippet_from_json.py -msgid "I left my wallet in " +msgid "Sure, I got that." msgstr "" #: lang/json/snippet_from_json.py -msgid " + forever" +msgid "Okay." msgstr "" #: lang/json/snippet_from_json.py -msgid "N = R * fp * ne * fl * fi * fc * L drake was right" +msgid "Will do." msgstr "" #: lang/json/snippet_from_json.py -msgid "kilroy was here" +msgid "No problem." msgstr "" #: lang/json/snippet_from_json.py -msgid "" -"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." +msgid "Can do." msgstr "" #: lang/json/snippet_from_json.py -msgid "" -"Ever run into those big worm things? If you see trails of churned-up dirt, " -"you can be sure they're around." +msgid "Whew... smells like skunk!" msgstr "" #: lang/json/snippet_from_json.py -msgid "" -"Try to stay on the roads as much as you can. Giant worms can't cross them!" +msgid "Man, that smells like some good shit!" msgstr "" #: lang/json/snippet_from_json.py -msgid "" -"Don't relax after killing a giant worm. Little bits of them can break off " -"and still attack!" +msgid "Hey, don't bogart the joint!" msgstr "" #: lang/json/snippet_from_json.py -msgid "" -"If you see a big mob of zombies coming, RUN! Trying to fight them all is " -"suicide unless you have a big tactical advantage." +msgid "C'mon, , I can smell it, pass it over." msgstr "" #: lang/json/snippet_from_json.py -msgid "" -"Watch out for those zombies that shriek; they'll let other zombies know " -"where you are, and will attract them from all over." +msgid "Wow, that smell takes me back." msgstr "" #: lang/json/snippet_from_json.py -msgid "" -"Those acid-spitting zombies are pretty nasty, but if you're smart, you can " -"get other zombies to wade through the acid." +msgid "Ah, man. Good times, good times. Love that scent." msgstr "" #: lang/json/snippet_from_json.py -msgid "" -"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." +msgid "What do I smell? Well, I guess it's legal now." msgstr "" #: lang/json/snippet_from_json.py -msgid "" -"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." +msgid "Mmm, that weed smells good." msgstr "" #: lang/json/snippet_from_json.py -msgid "" -"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." +msgid "Man, I can smell the weed, can I have some?" msgstr "" #: lang/json/snippet_from_json.py -msgid "" -"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!" +msgid "Are you sure it's a good idea to smoke that now?" msgstr "" #: lang/json/snippet_from_json.py -msgid "" -"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." +msgid "I don't know... should you really be smoking that stuff?" msgstr "" #: lang/json/snippet_from_json.py -msgid "" -"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!" +msgid ", that's going to ruin your nose." msgstr "" #: lang/json/snippet_from_json.py -msgid "" -"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." +msgid "Man, that stinks. Put it out!" msgstr "" #: lang/json/snippet_from_json.py -msgid "" -"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." +msgid "You're going to kill yourself smoking that stuff, ." msgstr "" #: lang/json/snippet_from_json.py -msgid "" -"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." +msgid "Oh, wow, that smell... Can I have some?" msgstr "" #: lang/json/snippet_from_json.py -msgid "" -"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." +msgid "Ew, smells like burning rubber!" msgstr "" #: lang/json/snippet_from_json.py -msgid "" -"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!" +msgid "Ugh, that smells rancid!" msgstr "" #: lang/json/snippet_from_json.py -msgid "" -"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..." +msgid "" msgstr "" #: lang/json/snippet_from_json.py -msgid "" -"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." +msgid "I need some batteries to power my CBMs." msgstr "" #: lang/json/snippet_from_json.py -msgid "" -"There's snakes down in most of the old sewer systems. They're slow on land, " -"but boy, those suckers can swim fast!" +msgid "I can't recharge my CBMs without some batteries." msgstr "" #: lang/json/snippet_from_json.py -msgid "" -"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!" +msgid "Hey, , can I get some batteries here? I need to recharge." msgstr "" #: lang/json/snippet_from_json.py -msgid "" -"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..." +msgid "Pass me a beer, I need to power my ethanol burner." msgstr "" #: lang/json/snippet_from_json.py msgid "" -"Ever go toe-to-toe with a manhack? Tiny little helicopters covered in " -"knives. Best be packing a shotgun!" +"Ethanol burners! The power source that's fun to recharge. Get me a drink, " +"please!" msgstr "" #: lang/json/snippet_from_json.py -msgid "" -"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..." +msgid "Waiter! I need a refill, my ethanol burner is running out of charge!" msgstr "" #: lang/json/snippet_from_json.py -msgid "" -"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." +msgid "I need some junk to power my internal furnace." msgstr "" #: lang/json/snippet_from_json.py -msgid "" -"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." +msgid "I can't recharge my CBMs without some firewood for my internal furnace." msgstr "" #: lang/json/snippet_from_json.py msgid "" -"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." +"Hey, , can I get some waste paper or withered plants? I need to " +"recharge." msgstr "" #: lang/json/snippet_from_json.py msgid "" -"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." +"I can't believe I'm saying this, but I need radioactive plutonium slurry for " +"my internal reactor." msgstr "" #: lang/json/snippet_from_json.py msgid "" -"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." +"I can't use my internal reactor to recharge my CBMs without some plutonium " +"slurry." msgstr "" #: lang/json/snippet_from_json.py msgid "" -"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." +"Hey, , pass me some plutonium slurry if you have any, I need to " +"refuel my internal reactor." msgstr "" #: lang/json/snippet_from_json.py msgid "" -"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!" +"Beta radiation can be blocked by clothing, but is really dangerous if you " +"ingest it. So can I have some plutonium slurry to power my reactor and give " +"me cancer?" msgstr "" #: lang/json/snippet_from_json.py msgid "" -"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!" +"I need some radioactive slurry to power my reactor. Or a less dangerous " +"power source, that would be even better!" msgstr "" #: lang/json/snippet_from_json.py msgid "" -"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." +"Please, , get me some radioactive slurry to fuel my internal " +"reactor. Or get me another way to recharge my CBMs!" msgstr "" #: lang/json/snippet_from_json.py msgid "" -"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..." +"I can't use my internal reactor to recharge my CBMs without some plutonium " +"slurry. Which wouldn't be a problem if I had anything else that would " +"recharge my CBMs!" msgstr "" #: lang/json/snippet_from_json.py -msgid "" -"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." +msgid "Tell me about how you survived the cataclysm." msgstr "" #: lang/json/snippet_from_json.py -msgid "" -"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..." +msgid "How did you survive the cataclysm?" msgstr "" #: lang/json/snippet_from_json.py -msgid "" -"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!" +msgid "What was the cataclysm like for you?" msgstr "" #: lang/json/snippet_from_json.py -msgid "" -"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." +msgid "Let's talk about something else." msgstr "" #: lang/json/snippet_from_json.py -msgid "" -"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." +msgid "Let's change the subject." msgstr "" #: lang/json/snippet_from_json.py -msgid "" -"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." +msgid "I'd like to ask you about something else." msgstr "" #: lang/json/snippet_from_json.py -msgid "" -"I hid in a dumpster once or twice. I may smell bad, but I'm not dead, as " -"they say." +msgid "We should probably get going." msgstr "" #: lang/json/snippet_from_json.py -msgid "" -"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." +msgid "We'd better get moving." msgstr "" #: lang/json/snippet_from_json.py -msgid "" -"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." +msgid "Let's head out." msgstr "" #: lang/json/snippet_from_json.py -msgid "" -"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!" +msgid "shitty" msgstr "" #: lang/json/snippet_from_json.py -msgid "" -"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." +msgid "lame" msgstr "" #: lang/json/snippet_from_json.py -msgid "" -"You know, you don't have to go full auto with an assault rifle. Firing " -"single shots is more accurate and efficient!" +msgid "crappy" msgstr "" #: lang/json/snippet_from_json.py -msgid "" -"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..." +msgid "unpleasant" msgstr "" #: lang/json/snippet_from_json.py -msgid "" -"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." +msgid " " msgstr "" #: lang/json/snippet_from_json.py -msgid "" -"You don't really need to wear gloves most of the time, but once in a while " -"they'll really come in handy." +msgid " " msgstr "" -#: lang/json/snippet_from_json.py -msgid "" -"I wish I could still use those rollerblades. I would be so fast. But I " -"took an arrow to the knee, and all that." +#. ~ photo quality adjective +#: lang/json/snippet_from_json.py src/iuse.cpp +msgid "awful" msgstr "" #: lang/json/snippet_from_json.py -msgid "" -"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." +msgid "terrible" msgstr "" #: lang/json/snippet_from_json.py -msgid "" -"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." +msgid "horrible" msgstr "" #: lang/json/snippet_from_json.py -msgid "" -"Ski goggles are a great choice if you're worried about getting stuff in your " -"eyes. Perfect for dealing with boomers!" +msgid "miserable" msgstr "" #: lang/json/snippet_from_json.py -msgid "" -"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." +msgid "fucked-up" msgstr "" #: lang/json/snippet_from_json.py -msgid "" -"I know they look dumb, but wearing a fanny pack gives you that extra bit of " -"storage without encumbering you." +msgid "stupid" msgstr "" #: lang/json/snippet_from_json.py -msgid "" -"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." +msgid "idiotic" msgstr "" #: lang/json/snippet_from_json.py -msgid "" -"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." +msgid "dumb" msgstr "" #: lang/json/snippet_from_json.py -msgid "" -"It's a good idea to carry around a couple of empty bottles. You can fill " -"them up with water, gasoline, or whatever!" +msgid "dumb-ass" msgstr "" #: lang/json/snippet_from_json.py -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." +msgid "moronic" msgstr "" #: lang/json/snippet_from_json.py -msgid "" -"I can bandage you if you are wounded, so give me some spare bandages, if you " -"have any." +msgid "mickey mouse" msgstr "" #: lang/json/snippet_from_json.py -msgid "" -"If you have extra disinfectant, use it to disinfect your wounds, even if " -"they aren't infected. They will recover faster that way." +msgid "shit-for-brains" msgstr "" #: lang/json/snippet_from_json.py -msgid "" -"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." +msgid "Z" msgstr "" #: lang/json/snippet_from_json.py -msgid "" -"If you need a bunch of rags for making Molotov cocktails, take a pair of " -"scissors to an old t-shirt or something." +msgid "shambler" msgstr "" #: lang/json/snippet_from_json.py -msgid "" -"Carrying a lighter is something all veterans do. It takes up almost no " -"space, and can easily save your life." +msgid "goo-puker" msgstr "" #: lang/json/snippet_from_json.py -msgid "" -"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!" +msgid "walker" msgstr "" #: lang/json/snippet_from_json.py -msgid "" -"Crowbars not only make a pretty good weapon, they're also useful for opening " -"locked doors and lifting manhole covers." +msgid "walking corpse" msgstr "" #: lang/json/snippet_from_json.py -msgid "" -"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." +msgid " " msgstr "" #: lang/json/snippet_from_json.py -msgid "" -"A chainsaw may seem like a great weapon, but remember that they're slow, " -"unwieldy, and very noisy." +msgid "undead" msgstr "" #: lang/json/snippet_from_json.py -msgid "" -"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." +msgid "living dead" msgstr "" #: lang/json/snippet_from_json.py -msgid "" -"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!" +msgid "zombies" msgstr "" #: lang/json/snippet_from_json.py -msgid "" -"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." +msgid "Z's" msgstr "" #: lang/json/snippet_from_json.py -msgid "Don't use Molotovs indoors. Especially in a liquor store." +msgid " " msgstr "" #: lang/json/snippet_from_json.py -msgid "" -"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." +msgid "monster" msgstr "" #: lang/json/snippet_from_json.py -msgid "" -"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." +msgid "demon" msgstr "" #: lang/json/snippet_from_json.py -msgid "" -"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." +msgid "horror" msgstr "" #: lang/json/snippet_from_json.py -msgid "" -"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." +msgid "indescribable beast" msgstr "" #: lang/json/snippet_from_json.py -msgid "" -"If you're wandering in the wilderness, or following a road, keep an eye out " -"for wild strawberries, blueberries and other gifts of nature." +msgid "creature made of nightmares" msgstr "" #: lang/json/snippet_from_json.py -msgid "" -"Be careful eating wild mushrooms. Some are poisonous, and others can make " -"you hallucinate." +msgid "critter" msgstr "" #: lang/json/snippet_from_json.py -msgid "" -"Try to go around swamps, if you can. Some of them have sinkholes that can " -"pull you right underground." +msgid " " msgstr "" #: lang/json/snippet_from_json.py -msgid "" -"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." +msgid "unbelievable thing" msgstr "" #: lang/json/snippet_from_json.py -msgid "" -"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." +msgid "walking nightmare" msgstr "" #: lang/json/snippet_from_json.py -msgid "" -"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." +msgid "thing right out of a scary movie" msgstr "" #: lang/json/snippet_from_json.py -msgid "" -"While there's not much to loot, gas stations are a good source for gasoline, " -"to power tools or to make Molotov cocktails." +msgid "the cataclysm" msgstr "" #: lang/json/snippet_from_json.py -msgid "" -"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." +msgid "the apocalypse" msgstr "" #: lang/json/snippet_from_json.py -msgid "" -"I know grocery stores and stuff are full of fruit, but be careful, it's " -"probably rotten." +msgid "the end of the world" msgstr "" #: lang/json/snippet_from_json.py -msgid "" -"Next time you visit a grocery store, load up on canned goods. They never go " -"bad!" +msgid "Armageddon" msgstr "" #: lang/json/snippet_from_json.py -msgid "" -"I've found more good weapons in hardware stores than anywhere else. Except " -"gun stores, of course." +msgid "the end of days" msgstr "" #: lang/json/snippet_from_json.py -msgid "" -"Liquor stores are a great place to pick up non-alcoholic beverages, too. " -"Not that I mind alcohol!" +msgid "They'll kill us! Run away!" msgstr "" #: lang/json/snippet_from_json.py -msgid "" -"Most gun stores follow pretty similar layouts. The restricted stuff - SMGs, " -"assault rifles, and most importantly ammo - are always behind the counter." +msgid "We're going to die! Fall back!" msgstr "" #: lang/json/snippet_from_json.py -msgid "" -"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!" +msgid "Fall back and regroup!" msgstr "" #: lang/json/snippet_from_json.py -msgid "" -"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." +msgid "There's no hope for victory. I'm running!" msgstr "" #: lang/json/snippet_from_json.py -msgid "" -"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." +msgid "Feet don't fail me now!" msgstr "" #: lang/json/snippet_from_json.py -msgid "" -"I have a dream of raiding a military bunker, but I well know that good " -"protection plus zombie soldiers are a bad mix. The sheer thought of being " -"sprayed with bullets by a turret is giving me the shivers." +msgid "I don't have to be faster than them, just faster than you!" msgstr "" #: lang/json/snippet_from_json.py -msgid "" -"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?" +msgid "Oh God, my leg, Oh God!" msgstr "" #: lang/json/snippet_from_json.py -msgid "" -"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?" +msgid "We have a serious situation here. I'm leaving!" msgstr "" #: lang/json/snippet_from_json.py -msgid "" -"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!" +msgid "It can't follow all of us. I'll run this way, you go there!" msgstr "" #: lang/json/snippet_from_json.py -msgid "" -"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." +msgid "Me go, you stay." msgstr "" #: lang/json/snippet_from_json.py -msgid "" -"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." +msgid "Not that way! Go left!" msgstr "" #: lang/json/snippet_from_json.py -msgid "" -"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." +msgid "!" msgstr "" #: lang/json/snippet_from_json.py -msgid "A screwdriver a day keeps the scurvy away!" +msgid "I can't outrun it! I'm going to kill it!" msgstr "" #: lang/json/snippet_from_json.py -msgid "" -"Hungrier, than usual? Natural oils can help. Not tasty at all, but who " -"cares when eating your leg is the second option?" +msgid "! Die, you ! I want to live!" msgstr "" #: lang/json/snippet_from_json.py -msgid "" -"Terrain can turn the tide of a battle, make sure you use it against your " -"enemies, lest it be used against you." +msgid "My feet failed me! Arms don't fail me!" msgstr "" #: lang/json/snippet_from_json.py -msgid "" -"Folks that passed by the mine said something about foul smell. If you plan " -"a visit there consider taking a a gas mask with you." +msgid "Call the fire department! Wait, they're dead! Run away!" msgstr "" #: lang/json/snippet_from_json.py -msgid "Knowledge is power. Seriously, just pick up a book." +msgid "This place is on fire. I'm leaving." msgstr "" #: lang/json/snippet_from_json.py -msgid "" -"Nothing can kill you if everything is already dead. Well, except cold, " -"hunger, and… never mind." +msgid "Put the fire out! Put it out!" msgstr "" #: lang/json/snippet_from_json.py -msgid "" -"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." +msgid "Fire bad! !" msgstr "" #: lang/json/snippet_from_json.py -msgid "" -"Boil first, then drink. Ten men caravan once drank from a spring, and they " -"are now known as a three man caravan." +msgid "child" msgstr "" #: lang/json/snippet_from_json.py -msgid "" -"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." +msgid "my child" msgstr "" #: lang/json/snippet_from_json.py -msgid "" -"Tim says you can drive a car through a horde of zombies. Tim is now a " -"zombie. Any questions?" +msgid "dear" msgstr "" #: lang/json/snippet_from_json.py -msgid "" -"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." +msgid "my dear" msgstr "" #: lang/json/snippet_from_json.py -msgid "" -"If you can't find a knife try smashing potted plants. It just might give " -"you everything you need to make one." +msgid " will use ranged weapons." msgstr "" #: lang/json/snippet_from_json.py -msgid "" -"What's the difference between a good and a bad choke point? The good one " -"has another back door behind you." +msgid " will not use ranged weapons." msgstr "" #: lang/json/snippet_from_json.py -msgid "" -"So, methinks: if you could convince the cop-bots that you are their " -"superior..." +msgid " will use grenades." msgstr "" #: lang/json/snippet_from_json.py -msgid "" -"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." +msgid " will not use grenades." msgstr "" #: lang/json/snippet_from_json.py -msgid "" -"A soldering iron can be an aspiring mechanics' 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." +msgid " will only use silenced ranged weapons." msgstr "" #: lang/json/snippet_from_json.py -msgid "" -"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." +msgid " will use any ranged weapons." msgstr "" #: lang/json/snippet_from_json.py -msgid "" -"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." +msgid " will avoid shooting if allies are in the line of fire." msgstr "" #: lang/json/snippet_from_json.py -msgid "" -"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." +msgid " will shoot even if allies are in the line of fire." msgstr "" #: lang/json/snippet_from_json.py -msgid "" -"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." +msgid "* will pick up items." msgstr "" #: lang/json/snippet_from_json.py -msgid "" -"A friend is a second mouth to fill, but when it comes to work four hands are " -"always better than two." +msgid "* will only pick up items from the whitelist." msgstr "" #: lang/json/snippet_from_json.py -msgid "" -"I was against drugs until I was almost killed by a zombie and 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." +msgid "* will not pick up items." msgstr "" #: lang/json/snippet_from_json.py -msgid "" -"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." +msgid " will bash down obstacles." msgstr "" #: lang/json/snippet_from_json.py -msgid "" -"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." +msgid " will not bash down obstacles." msgstr "" #: lang/json/snippet_from_json.py -msgid "Avoid using launchers in narrow hallways, you might miss." +msgid " will sleep when tired." msgstr "" #: lang/json/snippet_from_json.py -msgid "" -"Met a mad chemist once. She made a battery from a potato... or was it lemon?" +msgid " will stay awake as long as possible." msgstr "" #: lang/json/snippet_from_json.py -msgid "" -"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." +msgid " will complain about wounds and needs." msgstr "" #: lang/json/snippet_from_json.py -msgid "" -"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*" +msgid " will only complain in an emergency." msgstr "" #: lang/json/snippet_from_json.py -msgid "" -"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?" +msgid " will smash nearby zombie corpses." msgstr "" #: lang/json/snippet_from_json.py -msgid "" -"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." +msgid " will leave zombie corpses intact." msgstr "" #: lang/json/snippet_from_json.py -msgid "" -"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." +msgid " will close doors after passing through." msgstr "" #: lang/json/snippet_from_json.py -msgid "" -"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..." +msgid " will not close doors." msgstr "" #: lang/json/snippet_from_json.py -msgid "" -"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." +msgid " will follow you closely even when threatened." msgstr "" #: lang/json/snippet_from_json.py -msgid "" -"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." +msgid " will move freely as needed." msgstr "" #: lang/json/snippet_from_json.py -msgid "" -"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." +msgid " will follow you at about two paces." msgstr "" #: lang/json/snippet_from_json.py -msgid "" -"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." +msgid " will follow you at about four paces." msgstr "" #: lang/json/snippet_from_json.py -msgid "" -"I sink like a rock in water, but I once used a scuba tank to cross a river " -"that had no bridge nearby." +msgid " will not go places that require opening a door." msgstr "" #: lang/json/snippet_from_json.py -msgid "" -"Can you imagine? I've heard of people digging graves for loot. Whole " -"cities lay dead for the taking and they dig graves! Madness!" +msgid " will open doors to reach a destination." msgstr "" #: lang/json/snippet_from_json.py msgid "" -"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." +" will hold the line by not moving into doorways or obstructions " +"adjacent to you." msgstr "" #: lang/json/snippet_from_json.py -msgid "" -"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." +msgid " will move freely to attack enemies." msgstr "" #: lang/json/snippet_from_json.py -msgid "" -"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." +msgid " will not investigate noises." msgstr "" #: lang/json/snippet_from_json.py -msgid "" -"Everything seems to mutate nowadays. Even survivors. I wonder if I would " -"look good with bunny ears? Would I hear better?" +msgid " will investigate noises from unseen places." msgstr "" #: lang/json/snippet_from_json.py -msgid "" -"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." +msgid " will not engage enemies if avoidable." msgstr "" #: lang/json/snippet_from_json.py -msgid "" -"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." +msgid " will follow normal engagement rules." msgstr "" #: lang/json/snippet_from_json.py msgid "" -"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." +"You feel great! It doesn't seem like wounds could even slow you down for " +"more than a day." msgstr "" #: lang/json/snippet_from_json.py msgid "" -"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." +"Within moments you're ready and up. You don't feel like anything could stop " +"you today!" msgstr "" #: lang/json/snippet_from_json.py msgid "" -"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." +"Your eyes open and your entire body feels like it is just bursting with " +"energy to burn!" msgstr "" #: lang/json/snippet_from_json.py msgid "" -"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." +"You feel like a rubber ball; whatever hits you, you'll just bounce back!" msgstr "" #: lang/json/snippet_from_json.py msgid "" -"A friend of mine was a hunter and told me, that if you field dress a corpse, " -"it will stay fresh a bit longer." +"You're up and you feel fantastic. No sickness is going to keep you down " +"today!" msgstr "" #: lang/json/snippet_from_json.py msgid "" -"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." +"You're up and going rather quickly, and all the little aches from yesterday " +"are gone." msgstr "" #: lang/json/snippet_from_json.py msgid "" -"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." +"You get up feeling pretty good, as if all your little aches were fading " +"faster." msgstr "" #: lang/json/snippet_from_json.py -msgid "" -"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." +msgid "Getting up comes easy to you, your muscles revitalized after your rest." msgstr "" #: lang/json/snippet_from_json.py msgid "" -"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." +"You're up and your little pains from before seem to have faded away rather " +"quickly." msgstr "" #: lang/json/snippet_from_json.py -msgid "I hate thorazine!" +msgid "" +"Awareness comes fast, your body coming quickly to attention after your rest." msgstr "" #: lang/json/snippet_from_json.py -msgid "Arg thorazine, don't touch it!" +msgid "You feel good. Healthy living does seem to have some rewards." msgstr "" #: lang/json/snippet_from_json.py -msgid "Thorazine is bad for you, you know." +msgid "" +"Getting out of bed doesn't seem too hard today. You could get used to this!" msgstr "" #: lang/json/snippet_from_json.py -msgid "Thorazine is poison." +msgid "" +"Alertness comes somewhat fast, and your muscles stretch easier than before " +"you went to bed." msgstr "" #: lang/json/snippet_from_json.py -msgid "You don't need thorazine, it's limiting you." +msgid "You feel extra alert, and your body feels ready to go." msgstr "" #: lang/json/snippet_from_json.py -msgid "Thorazine... That's what 'they' use to keep you tame." +msgid "Your body stretches with ease, and you feel ready to take on the world." msgstr "" #: lang/json/snippet_from_json.py -msgid "Pink tablets! I love those!" +msgid "You feel cruddy. Maybe you should consider eating a bit healthier." msgstr "" #: lang/json/snippet_from_json.py -msgid "Hey there's some pink tablets, take some!" +msgid "You get up with a bit of a scratch in your throat." msgstr "" #: lang/json/snippet_from_json.py -msgid "Look, some LSD, let's play cataclysm: fun times ahead!" +msgid "You stretch, but your muscles don't seem to be doing so good today." msgstr "" #: lang/json/snippet_from_json.py -msgid "Say yes to LSD, say yes to Fun!" +msgid "" +"Your stomach gurgles. It's probably nothing, but maybe you should look into " +"eating something healthy." msgstr "" #: lang/json/snippet_from_json.py -msgid "Perfect, those pink tablets will keep us going, take some!" +msgid "" +"You struggle to awareness. Being awake seems somewhat harder to reach today." msgstr "" #: lang/json/snippet_from_json.py -msgid "You know what would make all this more bearable? Pink Tablets!" -msgstr "" - -#: lang/json/snippet_from_json.py src/npctalk.cpp -msgid "No thanks, I'm good." +msgid "" +"Getting out of bed only comes with great difficulty, and your muscles resist " +"the movement." msgstr "" #: lang/json/snippet_from_json.py -msgid "I don't want to trade with you." +msgid "" +"Getting up seems like it should be easy, but all you want to do is go back " +"to bed." msgstr "" #: lang/json/snippet_from_json.py -msgid "I have the best stuff. And I'm keeping it!" +msgid "" +"Tired hands rub at your eyes, the little aches of yesterday protesting your " +"stretches." msgstr "" #: lang/json/snippet_from_json.py -msgid "No trading, that's my rule." +msgid "" +"Alertness seems flighty today, and your body argues when you move towards it." msgstr "" #: lang/json/snippet_from_json.py -msgid "I'm not interested." +msgid "You're up, but your body seems like it would rather stay in bed." msgstr "" #: lang/json/snippet_from_json.py -msgid "How about no?" +msgid "" +"You get up feeling horrible, as if something was messing with your body." msgstr "" #: lang/json/snippet_from_json.py -msgid "No thanks, I really don't feel like it." +msgid "You feel awful, and every ache from yesterday is still there." msgstr "" #: lang/json/snippet_from_json.py -msgid "Well, I would, but I don't want to right now." +msgid "" +"Your eyes struggle to open, and your muscles ache like you didn't sleep at " +"all." msgstr "" #: lang/json/snippet_from_json.py -msgid "I have better things to do." +msgid "" +"Bleary-eyed and half-asleep, you consider why you are doing this to yourself." msgstr "" #: lang/json/snippet_from_json.py -msgid "I'll pass, it's too much work." +msgid "" +"Awareness seems to only come with a battle... and your body seem to be on " +"its side." msgstr "" #: lang/json/snippet_from_json.py -msgid "Who put you in charge of what I do?" +msgid "popular " msgstr "" #: lang/json/snippet_from_json.py -msgid "Great idea! Call me when you find SOMEONE ELSE to do it." +msgid "top-forty " msgstr "" #: lang/json/snippet_from_json.py -msgid " " +msgid "corporate " msgstr "" #: lang/json/snippet_from_json.py -msgid "asshat" +msgid "commercial " msgstr "" #: lang/json/snippet_from_json.py -msgid "asswipe" +msgid "alternative " msgstr "" #: lang/json/snippet_from_json.py -msgid "bag of shit" +msgid "college " msgstr "" #: lang/json/snippet_from_json.py -msgid "bastard" +msgid "arthouse " msgstr "" #: lang/json/snippet_from_json.py -msgid "blockhead" +msgid "underground " msgstr "" #: lang/json/snippet_from_json.py -msgid "chump" +msgid "experimental " msgstr "" #: lang/json/snippet_from_json.py -msgid "clown" +msgid "forgotten " msgstr "" #: lang/json/snippet_from_json.py -msgid "cretin" +msgid "traditional " msgstr "" #: lang/json/snippet_from_json.py -msgid "degenerate" +msgid "historical " msgstr "" #: lang/json/snippet_from_json.py -msgid "dick" +msgid "classic " msgstr "" #: lang/json/snippet_from_json.py -msgid "dipshit" +msgid "modern " msgstr "" #: lang/json/snippet_from_json.py -msgid "douchebag" +msgid "adult " msgstr "" #: lang/json/snippet_from_json.py -msgid "dumbass" +msgid "contemporary " msgstr "" #: lang/json/snippet_from_json.py -msgid "dumb " +msgid "Christian " msgstr "" #: lang/json/snippet_from_json.py -msgid "fool" +msgid "Pagan " msgstr "" #: lang/json/snippet_from_json.py -msgid "freak" +msgid "British " msgstr "" #: lang/json/snippet_from_json.py -msgid "goon" +msgid "Continental " msgstr "" #: lang/json/snippet_from_json.py -msgid "half-eaten " +msgid "tropical " msgstr "" #: lang/json/snippet_from_json.py -msgid "idiot" +msgid "island " msgstr "" #: lang/json/snippet_from_json.py -msgid "imbecile" +msgid "New York " msgstr "" #: lang/json/snippet_from_json.py -msgid "jackass" +msgid "Hollywood " msgstr "" #: lang/json/snippet_from_json.py -msgid "moron" +msgid "Trans-Pacific " msgstr "" #: lang/json/snippet_from_json.py -msgid "nitwit" +msgid "Latin " msgstr "" #: lang/json/snippet_from_json.py -msgid "piece of an ass" +msgid "instrumental " msgstr "" #: lang/json/snippet_from_json.py -msgid "piece of shit" +msgid "fusion " msgstr "" #: lang/json/snippet_from_json.py -msgid "scumbag" +msgid "visual " msgstr "" #: lang/json/snippet_from_json.py -msgid "shit-brained " +msgid "liquid " msgstr "" #: lang/json/snippet_from_json.py -msgid "shit-eater" +msgid "digital " msgstr "" #: lang/json/snippet_from_json.py -msgid "shitass" +msgid "procedurally generated " msgstr "" #: lang/json/snippet_from_json.py -msgid "shitbag" +msgid "melodic " msgstr "" #: lang/json/snippet_from_json.py -msgid "shitface" +msgid "harmonious " msgstr "" #: lang/json/snippet_from_json.py -msgid "son of a " +msgid "discordant " msgstr "" #: lang/json/snippet_from_json.py -msgid "stinky " +msgid "contextual " msgstr "" #: lang/json/snippet_from_json.py -msgid "stupidass" +msgid "conceptual " msgstr "" #: lang/json/snippet_from_json.py -msgid "stupid " +msgid "collaborative " msgstr "" #: lang/json/snippet_from_json.py -msgid "swine" +msgid "rhythmic " msgstr "" #: lang/json/snippet_from_json.py -msgid "zombie food" +msgid "neo" msgstr "" #: lang/json/snippet_from_json.py -msgid "loser" +msgid "retro" msgstr "" #: lang/json/snippet_from_json.py -msgid "dickhead" +msgid "post" msgstr "" #: lang/json/snippet_from_json.py -msgid "asshole" +msgid "anti" msgstr "" #: lang/json/snippet_from_json.py -msgid "fucker" +msgid "hard " msgstr "" #: lang/json/snippet_from_json.py -msgid "sucker" +msgid "soft " msgstr "" #: lang/json/snippet_from_json.py -msgid "fuckwad" +msgid "speed " msgstr "" #: lang/json/snippet_from_json.py -msgid "jerk" +msgid "slow " msgstr "" #: lang/json/snippet_from_json.py -msgid "motherfucker" +msgid "hi-fi " msgstr "" #: lang/json/snippet_from_json.py -msgid "shithead" +msgid "lo-fi " msgstr "" #: lang/json/snippet_from_json.py -msgid " if I won't get some water soon." +msgid "mid-fi " msgstr "" #: lang/json/snippet_from_json.py -msgid "Can you get me some water, ?" +msgid "ambient " msgstr "" #: lang/json/snippet_from_json.py -msgid "Do you have something to drink, ?" +msgid "dance " msgstr "" #: lang/json/snippet_from_json.py -msgid "I need some water!" +msgid "chill " msgstr "" #: lang/json/snippet_from_json.py -msgid "My mouth is dry." +msgid "psycho" msgstr "" #: lang/json/snippet_from_json.py -msgid "When we drinkin'?" +msgid "turbo" msgstr "" #: lang/json/snippet_from_json.py -msgid "When was the last time I had a drink?" +msgid "prog " msgstr "" #: lang/json/snippet_from_json.py -msgid "I'm parched, I need to drink something." +msgid "glam " msgstr "" #: lang/json/snippet_from_json.py -msgid "I'm thirsty..." +msgid "outsider " msgstr "" #: lang/json/snippet_from_json.py -msgid "I'm thirsty." +msgid "indie " msgstr "" #: lang/json/snippet_from_json.py -msgid "I'm thirsty." +msgid "dark " msgstr "" #: lang/json/snippet_from_json.py -msgid "Can you give me something to drink, ?" +msgid "death " msgstr "" #: lang/json/snippet_from_json.py -msgid "I need to get some water." +msgid "electro" msgstr "" #: lang/json/snippet_from_json.py -msgid " if I don't drink something." +msgid "acid " msgstr "" #: lang/json/snippet_from_json.py -msgid "Water... Is there an oasis nearby?" +msgid "space " msgstr "" #: lang/json/snippet_from_json.py -msgid "Did you know that lack of water kills faster than lack of rest?" +msgid "ghetto " 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?" +msgid "street " msgstr "" #: lang/json/snippet_from_json.py -msgid "" -"Oh definitely, how about one of those beers I see on you? What's up anyway?" +msgid "urban " 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 ?" +msgid "world " msgstr "" #: lang/json/snippet_from_json.py -msgid "Hey, sure thing, , I need a break anyway, how are you?" +msgid "Euro" msgstr "" #: lang/json/snippet_from_json.py -msgid "Yeah OK, , how's it going?" +msgid "Afro" msgstr "" #: lang/json/snippet_from_json.py -msgid "Sure, let's shoot the shit! You OK?" +msgid "grunge " msgstr "" #: lang/json/snippet_from_json.py -msgid "Why not? How you doing?" +msgid "brass " msgstr "" #: lang/json/snippet_from_json.py -msgid "I'm OK with that, what's up?" +msgid "splatter " msgstr "" #: lang/json/snippet_from_json.py -msgid "I can spare a few minutes, how's things?" +msgid "swamp " msgstr "" #: lang/json/snippet_from_json.py -msgid "Sure thing , you good?" +msgid "ghost " msgstr "" #: lang/json/snippet_from_json.py -msgid "Alright, you got something to get off your chest?" +msgid "shadow " msgstr "" #: lang/json/snippet_from_json.py -msgid "Always ready for a good chat! But why, you OK?" +msgid "neuro " msgstr "" #: lang/json/snippet_from_json.py -msgid "OK , we should get to know each other, how are you coping?" +msgid "hyper" msgstr "" #: lang/json/snippet_from_json.py -msgid "Definitely, I'm game. How you holding up?" +msgid "carnival" msgstr "" #: lang/json/snippet_from_json.py -msgid "darn" +msgid "meta" msgstr "" #: lang/json/snippet_from_json.py -msgid "fuck" +msgid "techno" msgstr "" #: lang/json/snippet_from_json.py -msgid "goddamn" +msgid "synth" msgstr "" #: lang/json/snippet_from_json.py -msgid "goddamnit" +msgid "robo" msgstr "" #: lang/json/snippet_from_json.py -msgid "damn" +msgid "skate " msgstr "" #: lang/json/snippet_from_json.py -msgid "damnit" +msgid "freak " msgstr "" #: lang/json/snippet_from_json.py -msgid "shit" +msgid "surf " msgstr "" #: lang/json/snippet_from_json.py -msgid "fuckit" +msgid "mutant " msgstr "" #: lang/json/snippet_from_json.py -msgid "crap" +msgid "Jurassic " msgstr "" #: lang/json/snippet_from_json.py -msgid " " +msgid "free " msgstr "" #: lang/json/snippet_from_json.py -msgid " " +msgid "garage " msgstr "" #: lang/json/snippet_from_json.py -msgid "son of an ass" +msgid "garbage " msgstr "" #: lang/json/snippet_from_json.py -msgid "Oh sugar!" +msgid "break " msgstr "" #: lang/json/snippet_from_json.py -msgid "sad" +msgid "laser " msgstr "" #: lang/json/snippet_from_json.py -msgid "bummed" +msgid "porno " msgstr "" #: lang/json/snippet_from_json.py -msgid "depressed" +msgid "hypno" msgstr "" #: lang/json/snippet_from_json.py -msgid "pissed" +msgid "lunar " msgstr "" #: lang/json/snippet_from_json.py -msgid "unhappy" +msgid "thunder " msgstr "" #: lang/json/snippet_from_json.py -msgid " " +msgid "clown " msgstr "" #: lang/json/snippet_from_json.py -msgid "dejected" +msgid "murder " msgstr "" #: lang/json/snippet_from_json.py -msgid "down" +msgid "narco " msgstr "" #: lang/json/snippet_from_json.py -msgid "glum" +msgid "gangster " msgstr "" #: lang/json/snippet_from_json.py -msgid "Hey ." +msgid "-tune" msgstr "" #: lang/json/snippet_from_json.py -msgid "Greetings ." +msgid "-core" msgstr "" #: lang/json/snippet_from_json.py -msgid "Hi You okay?" +msgid "-wave" msgstr "" #: lang/json/snippet_from_json.py -msgid " Let's talk." +msgid "-beat" msgstr "" #: lang/json/snippet_from_json.py -msgid "Well hey there." +msgid "-step" msgstr "" #: lang/json/snippet_from_json.py -msgid " Hello." +msgid "-pop" msgstr "" #: lang/json/snippet_from_json.py -msgid "What's up, ?" +msgid "-hop" msgstr "" #: lang/json/snippet_from_json.py -msgid "You okay, ?" +msgid "-drums" msgstr "" #: lang/json/snippet_from_json.py -msgid "Hello, ." +msgid "-style" msgstr "" #: lang/json/snippet_from_json.py -msgid "Hi " +msgid "-chant" msgstr "" #: lang/json/snippet_from_json.py -msgid "never" -msgstr "" - -#: lang/json/snippet_from_json.py src/crafting_gui.cpp -msgid "no" +msgid "folk" msgstr "" #: lang/json/snippet_from_json.py -msgid "not gonna happen" +msgid "country" msgstr "" #: lang/json/snippet_from_json.py -msgid "not happening" +msgid "jazz" msgstr "" #: lang/json/snippet_from_json.py -msgid "over my dead body" +msgid "blues" msgstr "" #: lang/json/snippet_from_json.py -msgid "when pigs fly" +msgid "soul" msgstr "" #: lang/json/snippet_from_json.py -msgid "won't happen" +msgid "R&B" msgstr "" #: lang/json/snippet_from_json.py -msgid "fuck no" +msgid "hip-hop" msgstr "" #: lang/json/snippet_from_json.py -msgid "hell no" +msgid "swing" msgstr "" #: lang/json/snippet_from_json.py -msgid "no way" +msgid "funk" msgstr "" #: lang/json/snippet_from_json.py -msgid "not a chance" +msgid "disco" msgstr "" #: lang/json/snippet_from_json.py -msgid "I don't think so" +msgid "polka" msgstr "" #: lang/json/snippet_from_json.py -msgid "no way in hell" +msgid "tango" msgstr "" #: lang/json/snippet_from_json.py -msgid "nuh uh" +msgid "salsa" msgstr "" #: lang/json/snippet_from_json.py -msgid "nope" +msgid "mambo" msgstr "" #: lang/json/snippet_from_json.py -msgid "fat chance" +msgid "electronic" msgstr "" #: lang/json/snippet_from_json.py -msgid "Goodbye, !" +msgid "metal" msgstr "" #: lang/json/snippet_from_json.py -msgid "I'm leaving." +msgid "reaggae" msgstr "" #: lang/json/snippet_from_json.py -msgid "So long, !" +msgid "ska" msgstr "" #: lang/json/snippet_from_json.py -msgid "Hasta luego, !" +msgid "thrash" msgstr "" #: lang/json/snippet_from_json.py -msgid "I'm outta here!" +msgid "goth" msgstr "" #: lang/json/snippet_from_json.py -msgid "Bye bye, !" +msgid "industrial" msgstr "" #: lang/json/snippet_from_json.py -msgid "consider yourself dead" +msgid "psychedelic" msgstr "" #: lang/json/snippet_from_json.py -msgid "I'll destroy you" +msgid "noise" msgstr "" #: lang/json/snippet_from_json.py -msgid "I'll kick your ass" +msgid "sound" msgstr "" #: lang/json/snippet_from_json.py -msgid "I'll kill you" +msgid "revival" msgstr "" #: lang/json/snippet_from_json.py -msgid "I'll send you to hell" +msgid "gospel" msgstr "" #: lang/json/snippet_from_json.py -msgid "I'm gonna kick your ass" +msgid "opera" msgstr "" #: lang/json/snippet_from_json.py -msgid "you won't make it out alive" +msgid "shanties" msgstr "" #: lang/json/snippet_from_json.py -msgid "you're dead" +msgid "" +"This is an advertisement for the Diet Devil brand Metabolic Exchange CBM. " +"It shows a picture of a tiny obese devil sitting on a woman's shoulder. The " +"woman stares intently at a gigantic wedding cake covered with bacon and " +"candy bars. The caption reads: \"Burn calories! Burn!\"" msgstr "" #: lang/json/snippet_from_json.py -msgid "I'll kill you" +msgid "" +"This is an advertisement for the Diet Devil brand Internal Furnace CBM. It " +"shows a picture of a tiny obese devil sitting on a man's shoulder. The man " +"is about to bite into a frosting-covered baby. The caption reads: \"Eat " +"What You Want! How You Want! Who You Want!\"" msgstr "" #: lang/json/snippet_from_json.py -msgid "you're dead meat" +msgid "" +"This is an advertisement for the Diet Devil brand Ethanol Burner CBM. It " +"shows a picture of a teenage boy driving a car while chugging a bottle of " +"whiskey. A tiny obese devil sits on his shoulder and drinks a martini. The " +"caption reads: \"Drink like there's no tomorrow!\"" msgstr "" #: lang/json/snippet_from_json.py -msgid ", " +msgid "" +"This is an advertisement for the Twenty8 brand Diamond Cornea CBM. It shows " +"a picture of the cyber-module being clutched by an eagle in flight. The " +"captions read: \"Get the new Model 28.bx Eagle-Eye!\" and \"Twenty8. See " +"what you've been missing.\"" msgstr "" #: lang/json/snippet_from_json.py -msgid "you're a dead man" +msgid "" +"This is an advertisement for the Twenty8 brand Night Vision CBM. It shows a " +"picture of an owl swooping down on a the cyber-module. The captions read: " +"\"Get the new Model 28.hx Night-Owl!\" and \"Twenty8. See what you've been " +"missing.\"" msgstr "" #: lang/json/snippet_from_json.py -msgid "you'll taste my " +msgid "" +"This is an advertisement for the Twenty8 brand Diamond Cornea CBM. It shows " +"a picture of a flying hawk carrying the cyber-module in its beak. The " +"captions read: \"Get the new Model 28.xx Hawk-Eye!\" and \"Twenty8. See " +"what you've been missing.\"" msgstr "" #: lang/json/snippet_from_json.py -msgid "you're dead" +msgid "" +"This is an advertisement for the Twenty8 brand Scent Vision CBM. It shows a " +"picture of a vulture perched on a pile of skulls and cyber-modules. The " +"captions read: \"Get the new Model 28.vx Vulture today!\" and \"Twenty8. " +"See what you've been missing.\"" msgstr "" #: lang/json/snippet_from_json.py -msgid ", " +msgid "" +"This is an ad for a Twenty8 brand Infrared Vision CBM. It shows a picture " +"of a robotic phoenix covered in flames. The captions read: \"Get the new " +"Model 28.tx Phoenix today!\" and \"Twenty8. See what you've been missing.\"" msgstr "" #: lang/json/snippet_from_json.py -msgid "I'm not gonna last much longer" +msgid "" +"This is an advertisement for DoubleTech brand law enforcement robots. It " +"shows a picture of copbot and an eyebot boldly emerging from a cloud of " +"teargas and flame. The caption reads: \"DoubleTech Industries. Built to " +"Protect. Programmed to Serve.\"" msgstr "" #: lang/json/snippet_from_json.py -msgid "I'll be dead soon" +msgid "" +"This is an advertisement for DoubleTech brand law enforcement robots. It " +"shows a picture of an eyebot flying alongside a bald eagle and a Stealth " +"bomber painted as an American flag. The caption reads: \"Built to Protect. " +"Programmed to Serve.\"" msgstr "" #: lang/json/snippet_from_json.py -msgid "I'll be a goner" +msgid "" +"This is an advertisement for DoubleTech brand law enforcement robots. It " +"shows a picture of a dozen eyebots floating over a woman as she jogs through " +"a park. The captions read: \"Built to Protect. Programmed to Serve.\"" msgstr "" #: lang/json/snippet_from_json.py -msgid "I'm dead, ," +msgid "" +"This is an advertisement for DoubleTech brand law enforcement robots. It " +"shows a picture of copbot pepper-spraying a handcuffed rioter. In the " +"background a troop of boy scouts salutes the robot. The caption reads: " +"\"Built to Protect. Programmed to Serve.\"" msgstr "" #: lang/json/snippet_from_json.py -msgid "I'm dead meat" +msgid "" +"This is an advertisement for Robert's Universal Robotics brand law " +"enforcement robots. It shows a picture of a tribot incinerating a mob of " +"looters and stepping over charred and smoking corpses. The caption reads: " +"\"R.U.R. Technology you can Trust.\"" msgstr "" #: lang/json/snippet_from_json.py -msgid "I'm in serious trouble" +msgid "" +"This is an advertisement for Robert's Universal Robots brand labor-bots. It " +"shows a picture of a robot carrying a heavy pallet of bricks. In the " +"background a human foreman is sleeping on the job, with his hardhat pulled " +"down over his eyes. The captions read: \"It's a tough job, so why should " +"you have to do it?\" and \"R.U.R. Technology you can Trust.\"" msgstr "" #: lang/json/snippet_from_json.py -msgid "I'm doomed" +msgid "" +"This is an advertisement for Robert's Universal Robots brand labor-bots. It " +"shows a picture of a factory floor run entirely by robots. In the " +"background a man in a suit reads a newspaper that shows soaring stock " +"prices. The caption reads: \"R.U.R. Technology you can Trust.\"" msgstr "" #: lang/json/snippet_from_json.py -msgid "I'm done for" +msgid "" +"This is an advertisement for Sybil's Cyber Boutique. It shows a picture of " +"several bikini-clad female doctors removing the skin from man's face. The " +"patient is strapped to a chair but cheerfully gives two thumbs up. The " +"caption reads: \"Free Plastic Surgery While You Wait!\"" msgstr "" #: lang/json/snippet_from_json.py -msgid "I won't last much longer" +msgid "" +"This is an advertisement for Sybil's Cyber Boutique. It shows a picture of " +"several bikini-clad nurses giving liquid medicine to a delighted patient, " +"who uses a fingertip needle to suck it in into his veins. Outside the " +"window two shadow figures using the same fingertip needles to absorb " +"something less resembling medicine. The caption reads: \"Why use old IV " +"when you can have Intravenous Needle CBM!\"" msgstr "" #: lang/json/snippet_from_json.py -msgid "my days are numbered" +msgid "" +"This is an advertisement for Sybil's Cyber Boutique. It shows a picture of " +"a nerdy looking man surrounded by a group of admiring women. In the " +"foreground a blood-drenched doctor gives an exaggerated wink and two thumbs " +"up. The caption reads: \"Holiday sales! Get the package deals!\"" msgstr "" #: lang/json/snippet_from_json.py -msgid ", I'm sorry" +#, no-python-format +msgid "" +"This is an advertisement for Sybil's Cyber Boutique. It shows a picture of " +"a man flexing shiny cybernetic arms in front of a mirror. He is flanked by " +"two scantily clad nurses who hold bloody chainsaws and give approving thumbs " +"up. In the background feral dogs gnaw on the man's discarded former limbs. " +"The caption reads: \"Spring Cleaning Sale! 20% off!\"" msgstr "" #: lang/json/snippet_from_json.py -msgid "Can you wait?" +msgid "" +"This is an advertisement for Sybil's Cyber Boutique. It shows a picture of " +"a man carrying a somewhat confused horse on his shoulders. He is flanked by " +"two scantily clad nurses who hold bloody chainsaws and give approving thumbs " +"up. His bulging knees and elbows are stitched and seem to be the source of " +"his ability. The caption reads: \"Brand new! Horse power at hand!\"" msgstr "" #: lang/json/snippet_from_json.py -msgid "Hey, where are you?" +msgid "" +"This is an advertisement for Sybil's Cyber Boutique. It shows a picture of " +"a man smiling while being relentlessly punched by a boxer. He doesn't even " +"sweat as punches have no effect on him. Two scantily clad nurses give " +"approving thumbs up from the background. The caption reads: \"Bouncy as " +"never before! Absorb those shocks!\"" msgstr "" #: lang/json/snippet_from_json.py -msgid "Wait!" +msgid "" +"This is an advertisement for Rivtech brand handguns. It shows a picture of " +"a well armed couple in business suits with matching handguns facing down a " +"legion of villainous looking characters. The caption reads: \"Protect " +"yourself with the Rivtech caseless automagnum!\"" msgstr "" #: lang/json/snippet_from_json.py -msgid "Wait up, !" +msgid "" +"This is an advertisement for Rivtech brand rifles. It shows a picture of a " +"smiling soldier with a futuristic looking rifle on her shoulder saluting the " +"viewer. The caption reads: \"Rivtech caseless firearms proudly supports " +"our Military.\"" msgstr "" #: lang/json/snippet_from_json.py -msgid ", wait for me!" +msgid "" +"This is an advertisement for Rivtech brand firearms. It shows a picture of " +"a trio of well armed hunters. The three are each armed with different " +"futuristic looking weapons and are shooting at a hostile crowd of " +"approaching wildlife. The caption reads: \"Rivtech caseless firearms. " +"Superior stopping power.\"" msgstr "" #: lang/json/snippet_from_json.py -msgid "Hey, wait up, ?" +msgid "" +"This is an advertisement for the Rivtech brand Muscle Augmentation CBM. It " +"shows a picture of a stylized, howling wolf against a red background. The " +"caption reads: \"Rivtech neuroreactive myomer bionics. The most efficient " +"synthetic adenosine triphosphate recovery system on the market.\" and " +"\"Rivtech Bionics, guaranteed for life.\"" msgstr "" #: lang/json/snippet_from_json.py -msgid "You need to wait for me!" +msgid "" +"This is an advertisement for the Rivtech brand Wired Reflexes CBM. It shows " +"a picture of a stylized, snarling black cat against a red background. The " +"caption reads: \"Rivtech neuroelectric stimulation bionics. The next level " +"in quantum inductive piezochemical nerve stimulation technology.\" and " +"\"Rivtech Bionics, guaranteed for life.\"" msgstr "" #: lang/json/snippet_from_json.py -msgid "You need to wait!" +msgid "" +"This is an advertisement for the Rivtech brand Monomolecular Blade CBM. It " +"shows a picture of a woman with a bionic blade extending from her arm " +"steadfastly defending her children from an angry bear. The caption reads: " +"\"Rivtech retractable monomolecular blade system. Failure is never an " +"option.\" and \"Rivtech Bionics, guaranteed for life.\"" msgstr "" #: lang/json/snippet_from_json.py -msgid ", where are you?" +msgid "" +"This is an advertisement for the Rivtech brand Synaptic Accelerator CBM. It " +"shows a picture of a stylized, soaring raven against a red background. The " +"caption reads: \"Introducing the Rivtech Model Six myelination retrovirus " +"system. The latest in synthetic high-performance glycoprotein deposition " +"technology.\" and \"Rivtech Bionics, guaranteed for life.\"" msgstr "" #: lang/json/snippet_from_json.py -msgid "Hey Wait for me!" +msgid "" +"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.\"" msgstr "" #: lang/json/snippet_from_json.py -msgid "Where are you?!" +msgid "" +"This is an advertisement for Leadworks LLC's Home Frontier Starter Pack. It " +"shows a picture of a young suburban parent, equipped with rifle and " +"revolver, keeping a steely eye on the neighborhood from the front porch. " +"Similarly-armed parents are visible in front of every house on the street. " +"Young children are at play and older ones tend a large vegetable garden. " +"The caption reads: \"A well-armed community is a SAFE community. Leadworks, " +"LLC.\"" msgstr "" #: lang/json/snippet_from_json.py -msgid "Hey, I'm over here!" +msgid "" +"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.\"" msgstr "" #: lang/json/snippet_from_json.py -msgid "I'm unaffiliated." +msgid "" +"This is an advertisement for Leadworks LLC handguns. It shows a picture of " +"a bionic police officer assisting a young couple, who were being attacked by " +"a gang of ruffians. The caption reads: \"You don't have to void your " +"warranty or wear out your thumb to achieve felon-stopping firepower. The " +"L39B, tried and true by our fine cyborgs in blue, is available in .45 ACP " +"for that extra punch, and we offer semiautomatic (but equally robust!) " +"versions for the civilian market. Leadworks, LLC.\"" msgstr "" #: lang/json/snippet_from_json.py -msgid "I don't run with a crew." +msgid "" +"This is an advertisement for Leadworks LLC modular weapons. It shows a " +"picture of an overworked-yet-grateful police sergeant assembling a sleek " +"rifle, with similar-looking weapons racked neatly behind her. The caption " +"reads: \"Leadworks is proud to offer the L523 modular weapon system. No " +"more must armorers stock and maintain stacks and stacks of rifles, carbines, " +"and squad support weapons, juggling multiple incompatible ammunition types! " +"Just procure a base unit for every trooper, and use our lightweight and " +"portable conversion kits to swap from house-to-house CQB carbine to rooftop-" +"patrol DSR, safely and cleanly!\"" msgstr "" #: lang/json/snippet_from_json.py -msgid "I'm a solo artist, ?" +msgid "" +"This is a public notice from the Centers for Disease Control. Its message, " +"repeated in several languages, reads: Due to the rising threat of so-called " +"\"Green Fever\" the CDC would like to remind the public to cover your nose " +"and mouth with a tissue when you cough or sneeze and wash your hands " +"frequently with soap and water. In light of recent events, the CDC also " +"recommends an annual flu vaccine for everyone 6 months of age and older." msgstr "" #: lang/json/snippet_from_json.py -msgid "I don't kowtow to any group, ?" +msgid "" +"This is a public message from the Federal Emergency Management Agency. Its " +"message, repeated in several languages, reads: STAY IN YOUR HOMES! The US " +"government is taking steps to halt the current epidemic of \"Green Fever\" " +"and help is currently on its way to afflicted areas. In the name of public " +"safety you are hereby ordered to remain in your homes until evacuated to a " +"treatment camp by authorized agents of the United States military. Thank " +"you for your compliance." msgstr "" #: lang/json/snippet_from_json.py -msgid "I'm a freelancer." +msgid "" +"This is a public warning from an unnamed source. Its rambling message, " +"poorly-photocopied onto both sides of the page, reads: Don't believe the " +"lies! The Army is rounding up people in death camps while the Green Fever " +"spreads like wildfire. Do not believe what the mainstream news-media is " +"reporting. All official evacuation points are death-traps. Secure supplies " +"and escape the cities while there is still time." msgstr "" #: lang/json/snippet_from_json.py -msgid "I work alone, ." +msgid "" +"This is a public message from an unnamed source. Its message, photocopied " +"from a scrawled handwritten copy, reads: REPENT YOUR SINS O BABYLON FOR THE " +"TIME OF HIS JUDGEMENT IS NIGH! LOOK UPON YOUR DESTRUCTION AND KNOW THAT IT " +"IS JUST! YOU WILL BE DIVIDED FATHER AGAINST SON AND MOTHER AGAINST CHILD " +"UNTO THE VERY LAST SINNER!" msgstr "" #: lang/json/snippet_from_json.py -msgid "I'm a free agent, more money that way." +msgid "" +"This is a public warning from the United States Army. Its brief message, " +"repeated in several languages, reads: The President of the United States " +"has declared unilateral martial law affecting the entire nation. Shelter in " +"place until evacuated to an appropriate emergency management camp by " +"authorized military personnel. This curfew will remain in effect until " +"further notice. Stay indoors. Violators will be shot on sight." msgstr "" #: lang/json/snippet_from_json.py -msgid "I prefer to work uninhibited by that kind of connection." +msgid "" +"This is an advertisement for Rivtech's 'ATOMIC POWER THIRST' energy drink. " +"While intended to advertise a new flavor called Isotope RU-238 'FRUIT', most " +"of the text is dedicated to a long list of possible side effects: anxiety, " +"insomnia, severe insomnia, dizziness, tremors, nausea, headache, vomiting, " +"delusions, hallucinations, rhabdomyolysis, internal burns, thyroid cancer, " +"extensive internal bleeding, upper gastrointestinal bleeding, diarrhea, " +"cardiac dysrhythmia, cardiovascular collapse, suicidal ideation, seizures, " +"ataxia, amnesia, mania, stroke, neurodegeneration, malignalitaloptereosis, " +"necrotizing fasciitis, recurrent flu, and pinkeye." msgstr "" #: lang/json/snippet_from_json.py -msgid "I haven't found one that's good enough for me." +msgid "" +"This is a soda advertisement. On the front is a picture of a happy couple " +"on a beach watching the sun set. Between them are bottles of soda. The " +"poster reads, \"Cascade Cola, for those special moments\" in bold white " +"letters." msgstr "" #: lang/json/snippet_from_json.py -msgid "I don't belong to a faction, ." +msgid "" +"This is a flier for a fast food chain. In it, a man is placing an order " +"with an attractive woman wearing a bright green shirt in the window with two " +"happy children sitting in the back seat. The flier reads \"Burgers, fries, " +"and a Smile.\" Down in one corner is a company logo." msgstr "" #: lang/json/snippet_from_json.py -msgid "amigo" +msgid "" +"This is an advertisement for soda. It shows a dark brown can of soda on a " +"black background. The label reads \"Spin\"." msgstr "" #: lang/json/snippet_from_json.py -msgid "comrade" +msgid "" +"This is a flyer for a local pizza chain. On it is a picture of a cartoon " +"Italian holding a pizza, with the words \"It's a goooood pizza\" written " +"above his head." msgstr "" #: lang/json/snippet_from_json.py -msgid "fellow" +msgid "" +"This is a poster advertising contact lenses. On it is a picture of a blood " +"shot eye with a rather long block of information beneath it making some " +"fairly exaggerated claims about the product." msgstr "" #: lang/json/snippet_from_json.py -msgid "lad" +msgid "" +"This is a flyer advertising a local radio station. It has a lot of bright " +"colors and patterns, but no definite message other than \"104.4 all the " +"best, all the time!\" in big yellow letters." msgstr "" #: lang/json/snippet_from_json.py -msgid "mate" +msgid "" +"This is a large movie poster for \"Action Packstone 6, Revenge of the Dog Men" +"\". It shows a fit man in a leather jacket with a revolver and a claymore " +"walking towards the viewer. At his side is his trusty cyberdog companion " +"and in the background is an explosion." msgstr "" #: lang/json/snippet_from_json.py -msgid "nomad" +msgid "" +"This is an illustrated poster for a brand of solar car. The vehicle is " +"driving through a lush country side as small animals look on. The slogan " +"\"Improving the world, one tank at a time.\" is written across the top in " +"small letters." msgstr "" #: lang/json/snippet_from_json.py -msgid "partner" +msgid "" +"This is a soda advertisement. On the front is a picture of a happy couple " +"on a beach watching the sun set. Between them are bottles of soda. The " +"poster reads, \"Cascade Cola, for those special moments\" in bold white " +"letters. Someone has colored in the sun with a black marker. The words " +"\"oh Discordia\" are scrawled across the top." msgstr "" #: lang/json/snippet_from_json.py -msgid "stranger" +msgid "" +"This is a flier for a fast food chain. In it, a man is placing an order " +"with an attractive woman wearing a bright green shirt in the window with two " +"happy children in the back seat. The flier reads \"Burgers, fries, and a " +"Smile.\" down in one corner is a company logo. Someone has gone to town on " +"this one with a permanent marker. It is now covered in rude images and " +"racial epithets." msgstr "" #: lang/json/snippet_from_json.py -msgid "survivor" +msgid "" +"This is a flier for a local pizza chain. On it is a picture of a cartoon " +"Italian holding a pizza, with the words \"It's a goooood pizza\" written " +"above his head. Someone has drawn an exaggerated mustache on the cartoon " +"Italian, along with a pair of crude, oversized breasts." msgstr "" #: lang/json/snippet_from_json.py -msgid "friend" +msgid "" +"This is a poster advertising contact lenses. On it is a picture of a blood " +"shot eye. Someone has defaced this one. The informative part has been torn " +"off, and written in jagged letters across the top in red crayon are the " +"words \"ALL HAIL THE CRIMSON KING!\"." msgstr "" #: lang/json/snippet_from_json.py -msgid "pilgrim" +msgid "" +"This is an illustrated poster for a brand of solar car. The vehicle is " +"driving through a lush country side as small animals look on. The slogan " +"\"Improving the world, one tank at a time.\" is written across the top. " +"Someone used a blue pen to write \"who gives a shit\" across the slogan and " +"put X's over the eyes of all the animals." msgstr "" #: lang/json/snippet_from_json.py -msgid "traveler" +msgid "" +"This is a poster advertising a underground bunker. The poster shows a " +"nuclear bomb wiping out a city while a family huddles safely underground. " +"There a slogan \"Concerned about enemy attack? Want to protect your " +"family? Join the VAULT program today.\" which is written in the middle. " +"However, there seems to be no information about *how* one might do so." msgstr "" #: lang/json/snippet_from_json.py -msgid "pal" +msgid "" +"This is a flier for Red Ryder BBGuns. On it a child is pulling a shining " +"red wagon with a cooked pheasant on it and a wooden rifle over one " +"shoulder. The child has a dog trailing beside him and a satisfied look on " +"his face. The caption reads \"When you chose Red Ryder, you invested in the " +"American Dream. You invested in our Independence.\"" msgstr "" #: lang/json/snippet_from_json.py -msgid "fella" +msgid "" +"This is an old flier for a movie from the 30s. A tan man with slick black " +"hair and muscles bulging through his offwhite suit is clasping a woman to " +"his hip with one hand, and the woman is wearing a black leather dress. With " +"her hips splayed, she is holding a pistol in one hand and starring directly " +"out of the advert. The caption reads \"Witness the rebirth of New Noir with " +"'Jersey Shore Blues'. Starring Jenifer Languiz as 'Snookie'!\"" msgstr "" #: lang/json/snippet_from_json.py -msgid "you" +msgid "" +"\"Have you found (y)our savior today? Atom is here for you, it is inside " +"you!\" This flier marked the rising popularity of the Atom Cult, a religion " +"in which the essence of life is discovered through meticulous inward study " +"and pious donations." msgstr "" #: lang/json/snippet_from_json.py -msgid "dude" +msgid "" +"\"Joe's Diner; 1/2 pound of meat, 3 toppings, 'your choice', all with a side " +"of freedom fries and a BIG Gulp size pop.\"" msgstr "" #: lang/json/snippet_from_json.py -msgid "buddy" +msgid "" +"This is an advertisement for the Wink & Nod brand Soporific Induction CBM. " +"It shows a picture of a woman sleeping on a bed of nails with a satisfied " +"smile on her face. The caption reads: \"Catch Zs with ease, wherever you " +"please!\"" msgstr "" #: lang/json/snippet_from_json.py -msgid "man" +msgid "\"WE WERE RIGHT THE GOVERNMENT DID IT\"" msgstr "" #: lang/json/snippet_from_json.py -msgid "Catch up!" +msgid "" +"\"Have seen a zombie making its kin raise even despite damage that normally " +"would take them down, the air around it shimmered like around that hole in " +"the air we've seen creatures coming through back home\"" msgstr "" #: lang/json/snippet_from_json.py -msgid "Get over here!" +msgid "\"I shot the sheriff; but I couldn't find the deputy\"" msgstr "" #: lang/json/snippet_from_json.py -msgid "Get over here, !" +msgid "" +"\"Some plant vines started chasin after me, so I took a gas mask and some " +"teargas and I ran through them.\"" msgstr "" #: lang/json/snippet_from_json.py -msgid "Keep close, !" +msgid "\"Slingshot right through the windshield k?\"" msgstr "" #: lang/json/snippet_from_json.py -msgid "Keep it moving, !" +msgid "" +"\"When I was a kid I used to slingshot at bugs and birds. Its really " +"playing off nowadays, Ill tell you what\"" msgstr "" #: lang/json/snippet_from_json.py -msgid "Keep up, !" +msgid "" +"\"ALL YOU STONERS WITH YOUR VIDEYA GAMES - I BET YOU WISH YOU TOOK THE TIME " +"TO LEARN A SKILL NOW DONTYA\"" msgstr "" #: lang/json/snippet_from_json.py -msgid "Let's keep going, !" +msgid "\"I tried to be a bard, but the rats didn't like my piping.\"" msgstr "" #: lang/json/snippet_from_json.py -msgid "Over here!" +msgid "" +"\"I found a chocolate bar on my pillow when I got home last night. I left " +"and don't wanna go back.\"" msgstr "" #: lang/json/snippet_from_json.py -msgid "Over here, !" +msgid "" +"\"this demon thing came after me it got me good i shot it but i dont know " +"if ill make it\"" msgstr "" #: lang/json/snippet_from_json.py -msgid "Stay close, !" +msgid "" +"\"DANNY IF YOU READ THIS THIS IS CLARA WE'RE ALL OKAY AND WE'RE HEADING TO " +"THE RIVER. A BOAT SAID THEY WERE DOCKED NEARBY.\"" msgstr "" #: lang/json/snippet_from_json.py -msgid "Stay with me, !" +msgid "" +"\"When I think of all the dead people I get mad, because I was supposed to " +"be the next big leader. WHERES MY CHANCE!??\"" msgstr "" #: lang/json/snippet_from_json.py -msgid "Catch up, !" +msgid "" +"\"You know they got a machine that can change the weather now? You put in a " +"bunch o'numbers and the whole thing funks around!\"" msgstr "" #: lang/json/snippet_from_json.py -msgid "Keep up!" +msgid "" +"\"A man in a black robe came up to me, said he wanted to make a deal...\"" msgstr "" #: lang/json/snippet_from_json.py -msgid "Come on, !" +msgid "" +"\"Cha-cha-cha-chia! Saw a woman today, with fungus coming out her head like " +"hair tendrils.\"" msgstr "" #: lang/json/snippet_from_json.py -msgid "Keep it moving!" +msgid "" +"\"If only I had had more time with that Autodoc I could have saved them! " +"But with that damn chip in their brain those poor cyborg wil never be human " +"again...\"" msgstr "" #: lang/json/snippet_from_json.py -msgid "Stay with me!" +msgid "" +"\"Save the cyborg! Please whoever read this you must help them! Knock them " +"out or inactivate them I don't care! But bring them on that Autodoc and " +"remove the chip messing up their brain.\"" msgstr "" #: lang/json/snippet_from_json.py -msgid "Keep close!" +#, no-python-format +msgid "" +"\"Gotta slow down, man. I don't think we spend more than 20% of our time " +"fightin', Put some Marley on and take off that racketus tripcore nonsense, " +"man.\"" msgstr "" #: lang/json/snippet_from_json.py -msgid "Stay close!" +msgid "\"I kept shooting with my handgun, but I never got any better!\"" msgstr "" #: lang/json/snippet_from_json.py -msgid "Let's keep going!" +msgid "" +"\"ITS OKEY GUYS! I BARRYED A TIME CAPSUL IN MY BACKYARD! I PUT IN SOME " +"HOEHOES.\"" msgstr "" #: lang/json/snippet_from_json.py -msgid "I can barely keep my eyes open." +msgid "" +"\"I got my tinfoil hat on. Good thing too, cause this monster was starrin " +"at me kinda funny, trying to freeze my mind in place.\"" msgstr "" #: lang/json/snippet_from_json.py -msgid "When we sleepin'?" +msgid "\"You want my advice? Smoke Crack, It gets shit done.\"" msgstr "" #: lang/json/snippet_from_json.py -msgid "*Yawn*" +msgid "" +"\"The raindrops keep falling on my head, the acid ensured my eyes would soon " +"be bleedin red...\"" msgstr "" #: lang/json/snippet_from_json.py -msgid "What time is it?" +msgid "" +"\"ALWAYS WITH THE EFFICIENCY GUYS; YOURE ALWAYS WORKING TO GO HOME TO PAY " +"RENT TO SLEEP TO WAKE UP TO WORK AGAIN. STOP\"" msgstr "" #: lang/json/snippet_from_json.py -msgid "I'm tired..." +msgid "\"IM OFF TO THUNDERDOME, BYE SUCKERS.\"" msgstr "" #: lang/json/snippet_from_json.py -msgid "I'm tired." +msgid "" +"\"If you get a parasite, take some sand and some vodka. Rub the sand into " +"the afflicted area, real good too; like you're washing your hair. Then " +"rinse with vodka.\"" msgstr "" #: lang/json/snippet_from_json.py -msgid "I'm tired." +msgid "" +"\"I put my toilet water into a gastank. Then I poured it into a glass cup. " +"Then I drank it without vomiting my insides back into the toilet.\"" msgstr "" #: lang/json/snippet_from_json.py -msgid "Can we rest for a while, ?" +msgid "" +"\"This isn't real this is a test to turn you into a Manchurian Candidate!\"" msgstr "" #: lang/json/snippet_from_json.py -msgid "I need to rest." +msgid "\"Real Men do it with STYLE. SUPASTYLIN.\"" msgstr "" #: lang/json/snippet_from_json.py -msgid " if we don't stop for a moment." +msgid "" +"\"They're all hiding on an oil rig, I heard it myself over the AM airwaves. " +"They think they're the nobles of the 21st century, the prigs.\"" msgstr "" #: lang/json/snippet_from_json.py -msgid "Did you know that lack of rest kills faster than lack of food?" +msgid "" +"The Green Fever shall purge the land for His Chosen children. I have seen " +"His black fire shining in the eyes of the afflicted and eagerly await the " +"day He shall consume us all. Ph'nglui mglw'nafh Cthulhu R'lyeh wgah'nagl " +"fhtagn." msgstr "" #: lang/json/snippet_from_json.py -msgid "I'll just go to sleep, ?" +msgid "" +"\"Some of 'em are big. Real big. Don't stick around, I saw my mate get " +"fucking torn in half!\"" msgstr "" #: lang/json/snippet_from_json.py -msgid "I'm going to sleep now." +msgid "\"po p y fl ow er s don t ea at them\"" msgstr "" #: lang/json/snippet_from_json.py -msgid "I'm off to bed. Wake me if you need me." +msgid "" +"\"Some guy is walking through the horde without a scratch. Please tell me " +"they're docile now. Please fucking tell me.\"" msgstr "" #: lang/json/snippet_from_json.py -msgid "I'm going to sleep over there." +msgid "\"Swamp water tastes good! An\"" msgstr "" #: lang/json/snippet_from_json.py -msgid "Time for bed! See you in the morning." +msgid "\"Why are all the lawnmowers broken?!\"" msgstr "" #: lang/json/snippet_from_json.py -msgid "There's a bed calling my name, and I'm going to it." +msgid "" +"\"Some of the bridges, they're right next to each other, right? If you see " +"something up ahead one of those, just careen through to the other side. My " +"van was long enough to bridge right across!\"" msgstr "" #: lang/json/snippet_from_json.py -msgid "Good night! Wake me if you need me." +msgid "\"BURN BURN BURN BURN BURN ALL BURN ALL BURN ALL BURN\"" msgstr "" #: lang/json/snippet_from_json.py -msgid "extremely" +msgid "" +"\"I took all the supplies. Don't follow me. I'm sorry, man. I have to " +"look out for myself now.\"" msgstr "" #: lang/json/snippet_from_json.py -msgid "greatly" +msgid "\"My next-door neighbor had a katana in his basement!\"" msgstr "" #: lang/json/snippet_from_json.py -msgid "highly" +msgid "\"Am I the last one alive?\"" msgstr "" #: lang/json/snippet_from_json.py -msgid "incredibly" +msgid "" +"\"Boyfriend stole my pistol while I was asleep. I locked him in the " +"bathroom and set the house on fire. At least he attracted their attention.\"" msgstr "" #: lang/json/snippet_from_json.py -msgid "quite" +msgid "" +"\"I get air conditioners, but... this whole laboratory is frozen to ice!\"" msgstr "" #: lang/json/snippet_from_json.py -msgid "really" +msgid "\"Fuck aerodynamics, I want another engine!\"" msgstr "" #: lang/json/snippet_from_json.py -msgid "utterly" +msgid "" +"\"A wood ax works pretty well against them. So does a machete, but you " +"can't cut down a tree.\"" msgstr "" #: lang/json/snippet_from_json.py -msgid "fucking" +msgid "" +"\"Why would you hide in a farm? Sure, it's isolated, but if they know where " +"you are, you don't exactly have cover on all sides.\"" msgstr "" #: lang/json/snippet_from_json.py -msgid "super" +msgid "" +"\"Imagine if this spread to, like, Australia. Zombie kangaroos. Haha...\"" msgstr "" #: lang/json/snippet_from_json.py -msgid "wicked" +msgid "" +"\"how DO I use THESE bionic THINGS? I just STUCK the wires IN my WRIST and " +"now I CAN'T STOP twitching. AND now my LEG hurts! Is THAT acid?!\"" msgstr "" #: lang/json/snippet_from_json.py -msgid "very" +msgid "" +"\"I tried playing memorial music for my dead brother, on a radio. They must " +"have been attracted to it. I can't see his grave through the crowd anymore." +"\"" msgstr "" #: lang/json/snippet_from_json.py -msgid "mega" +msgid "" +"\"Took a picture of a dead dog leaping right onto a soldier. Sweet fucking " +"shot!\"" msgstr "" #: lang/json/snippet_from_json.py -msgid "uber" +msgid "\"Gas mask is nice and all, but I can hardly run with it on.\"" msgstr "" #: lang/json/snippet_from_json.py -msgid "ultra" +msgid "" +"\"One of those robot tanks was blocking the way out. Got some sort of " +"sweetspot, though, where it can't decide what to shoot with, maybe 30 yards " +"or so? Made it to the truck and just drove.\"" msgstr "" #: lang/json/snippet_from_json.py -msgid "so " +msgid "" +"\"Those evac shelters have basements. Remember when they were full of " +"food? Every single one is fucking empty now...\"" msgstr "" #: lang/json/snippet_from_json.py -msgid " " +msgid "" +"\"I made mushroom babies. My arms hurt. I hurt. I had mushroom babies. " +"They are growing now.\"" msgstr "" -#: lang/json/snippet_from_json.py src/iuse.cpp -msgid "fine" +#: lang/json/snippet_from_json.py +msgid "\"It doesn't matter how you die. You're gonna turn into one of them.\"" msgstr "" #: lang/json/snippet_from_json.py -msgid "okay" +msgid "\"WHY DO ALL THE DEAD CHILDREN GO TO SCHOOL\"" msgstr "" #: lang/json/snippet_from_json.py -msgid "get it" +msgid "\"Don't keep your goddamn casings! They'll just weigh you down.\"" msgstr "" #: lang/json/snippet_from_json.py -msgid "you dig" +msgid "There is a splotch of blood on it. \"blood of the zombie king\"" msgstr "" #: lang/json/snippet_from_json.py -msgid "dig" +msgid "" +"\"Local auto shop is full of the things. And to think I worked with them on " +"repairing cars... now they're just... fucking corpses.\"" msgstr "" #: lang/json/snippet_from_json.py -msgid "got it" +msgid "\"DON'T EAT THE SLIME DON'T EAT THE SLIME DON'T EAT THE SLIME\"" msgstr "" #: lang/json/snippet_from_json.py -msgid "you see" +msgid "" +"\"I used to be human. But... my arms... they are like tentacles. I slither " +"along akin to a snail and I shed my feathers every day.\"" msgstr "" #: lang/json/snippet_from_json.py -msgid "see, " +msgid "\"I don't have enough time to double tap. You don't either.\"" msgstr "" #: lang/json/snippet_from_json.py -msgid "alright" +msgid "\"PINK TALL ONES RUN RUN RUN RUN RUN\"" msgstr "" #: lang/json/snippet_from_json.py -msgid "that clear" +msgid "\"Are they still human inside?\"" msgstr "" #: lang/json/snippet_from_json.py -msgid "seriously" +msgid "\"the eye it watches me it follows me everywhere help\"" msgstr "" #: lang/json/snippet_from_json.py -msgid "absolutely" +msgid "\"tHE Portal it's so COld\"" msgstr "" #: lang/json/snippet_from_json.py -msgid "definitely" +msgid "\"I can wear three backpacks! Fuck, I'm good.\"" msgstr "" #: lang/json/snippet_from_json.py -msgid "for real" +msgid "" +"\"They build modern bullets fuckin crazy. Set some on fire and they all " +"goes like a lil grenade. Need kindling first.\"" msgstr "" #: lang/json/snippet_from_json.py -msgid "honestly" +msgid "\"GOD CAN'T SAVE US\"" msgstr "" #: lang/json/snippet_from_json.py -msgid " " +msgid "\"SHOOT YOURSELF, LET IT END QUICKLY\"" msgstr "" #: lang/json/snippet_from_json.py -msgid "most " +msgid "" +"\"There are five basic rules to survival. One, stay prepared and watchful. " +"Two, keep your iron sights lined up or succumb. Three, stay FAR WAY from all" +"\"" msgstr "" #: lang/json/snippet_from_json.py -msgid "urgently" +msgid "" +"\"The bricks of this bathroom look like a face. Haha... it's all I can " +"focus on. At least let me shit before you break down the door. Please...\"" msgstr "" #: lang/json/snippet_from_json.py -msgid "REALLY" +msgid "\"What the hell are they mining for in these shafts?\"" msgstr "" #: lang/json/snippet_from_json.py -msgid "Excuse me, let me pass." +msgid "\"I am one with the plants.\"" msgstr "" #: lang/json/snippet_from_json.py -msgid "Hey , can I get through?" +msgid "\"Broadsword! Yeah!\"" msgstr "" #: lang/json/snippet_from_json.py -msgid "Let me get past you, ." +msgid "" +"\"If you see a trail of dirt getting displaced in your direction... run. " +"Run for your life.\"" msgstr "" #: lang/json/snippet_from_json.py -msgid "Let me through, ?" +msgid "\"Don't fall down a nuclear silo, they left 'em all open\"" msgstr "" #: lang/json/snippet_from_json.py -msgid "Step aside, !" +msgid "\"DINT ATE THE MUSHROM\"" msgstr "" #: lang/json/snippet_from_json.py -msgid "Can I get past you, ?" +msgid "\"Libraries are useless after the apocalypse.\"" msgstr "" #: lang/json/snippet_from_json.py -msgid "I need to get past you, ." +msgid "" +"\"I swear to God I've seen these plant things before! In a book, or " +"something! I swear...\"" msgstr "" #: lang/json/snippet_from_json.py -msgid "Move your ass, !" +msgid "" +"\"Is robbing a bank easier or harder now that all the guards are undead?\"" msgstr "" #: lang/json/snippet_from_json.py -msgid "Out of my way, !" +msgid "\"Make sure your car is REALLY stopped before you get out.\"" msgstr "" #: lang/json/snippet_from_json.py -msgid "Move it, !" +msgid "" +"\"I found some kind of stone pyramid with spikes. I feel... I feel like I'm " +"being watched.\"" msgstr "" #: lang/json/snippet_from_json.py -msgid "You need to move, , ?" +msgid "" +"\"Why would you ever hide in a damn gun store? The owner... he was a moron " +"alright.\"" msgstr "" #: lang/json/snippet_from_json.py -msgid "Thanks for the cash, !" +msgid "\"This apocalypse will be good for the US financial crisis\"" msgstr "" #: lang/json/snippet_from_json.py -msgid "Thanks a lot, !" +msgid "\"THEY DON'T feel ANYTHING\"" msgstr "" #: lang/json/snippet_from_json.py -msgid "Catch you later, !" +msgid "\"What was XEDRA doing, anyway?\"" msgstr "" #: lang/json/snippet_from_json.py -msgid "See you later, !" +msgid "" +"\"Is that one pharmaceutical company gonna come out with a, like, cure for " +"this anytime soon?\"" msgstr "" #: lang/json/snippet_from_json.py -msgid "See you in hell, !" +msgid "\"THE MARLEY WAS RIGHT\"" msgstr "" #: lang/json/snippet_from_json.py -msgid "I'm outta here! " +msgid "\"I... I just put a muffler onto a... nail gun.\"" msgstr "" #: lang/json/snippet_from_json.py -msgid "Thanks, !" +msgid "" +"\"Squeeze some ammonia into zombie flesh and hold it tight. You smell like " +"one of them! I think.\"" msgstr "" #: lang/json/snippet_from_json.py -msgid "Hey! I saw you take that ! Drop it. Now." +msgid "" +"\"I thought my damn terminal cancer was bad enough... now the dead are " +"rising?!\"" msgstr "" #: lang/json/snippet_from_json.py -msgid "You best be dropping what you just picked up right now ." +msgid "\"THE GOO IS IN THE WATER DON'T DRINK WATER\"" msgstr "" #: lang/json/snippet_from_json.py -msgid "I've got eyes, you thief!" +msgid "\"What's with these pits... with, like, sli\"" msgstr "" #: lang/json/snippet_from_json.py -msgid "Hey! That belongs to us! Drop it." +msgid "" +"\"Everyone used their gas to get to another town... but it's the same story " +"everywhere.\"" msgstr "" #: lang/json/snippet_from_json.py -msgid ", I've seen a thief!" +msgid "\"The gas the gas the green gas spreads forever\"" msgstr "" #: lang/json/snippet_from_json.py -msgid "I saw that! Drop what you just stole!" +msgid "" +"\"Most things can be taken out with a shotgun. More things can be taken out " +"with a grenade. Imagine what a mini-nuke does.\"" msgstr "" #: lang/json/snippet_from_json.py -msgid "Thieves will not last long around me , please drop that." +msgid "" +"\"My friend gave me lit dynamite, but it hasn't exploded yet... I don't " +"think that's supposed to happen. God help us.\"" msgstr "" #: lang/json/snippet_from_json.py msgid "" -"Consider this a warning , thieves will not be tolerated, drop it." +"\"Come to the bar if you see this, let's re-enact a zombie movie, friends.\"" msgstr "" #: lang/json/snippet_from_json.py -msgid "You think I'm blind ? Don't touch our stuff." +msgid "\"They are NOT slow! They are NEVER slow!\"" msgstr "" #: lang/json/snippet_from_json.py -msgid "content" +msgid "\"I had a phobia of bees BEFORE they grew to enormous sizes.\"" msgstr "" #: lang/json/snippet_from_json.py -msgid "glad" +msgid "" +"\"Your backpack's gonna weigh you down in the water. Hell, feel free to get " +"naked. Nobody's going to judge your modesty.\"" msgstr "" #: lang/json/snippet_from_json.py -msgid "happy" +msgid "\"Guns too loud. Crossbow too long. Running is best.\"" msgstr "" #: lang/json/snippet_from_json.py -msgid "overjoyed" +#, no-python-format +msgid "\"99% dead? I'd like to see a million zombies on Wall Street.\"" msgstr "" #: lang/json/snippet_from_json.py -msgid "pleased" +msgid "\"Crawled in through the vents. Whole office building is infested.\"" msgstr "" #: lang/json/snippet_from_json.py -msgid "ecstatic" +msgid "" +"\"Don't shoot the people who get bit! It's OK! Death is the only thing " +"that makes you turn!\"" msgstr "" #: lang/json/snippet_from_json.py -msgid "thrilled" +msgid "" +"\"Zombies, walkers, dead ones, undead, reanimated, zed, animata, biters. " +"Did I miss any?\"" msgstr "" #: lang/json/snippet_from_json.py -msgid "stoked" +msgid "" +"\"I left a stash of rechargeable batteries in my safe and apparently the " +"goddamn zombie Tooth Fairy has taken them all.\"" msgstr "" #: lang/json/snippet_from_json.py -msgid " " +msgid "" +"\"All I've got is this keg of beer and an appetite. Come at me, apocalypse!" +"\"" msgstr "" #: lang/json/snippet_from_json.py -msgid "tickled pink" +msgid "" +"\"My cousin says that murder nowadays is just a war crime. War for what, I " +"don't know, since the undead seem to be rebels without a cause.\"" msgstr "" #: lang/json/snippet_from_json.py -msgid "delighted" +msgid "\"SWAMPS RUN SWAMPS NO SWAMPS RUN\"" msgstr "" #: lang/json/snippet_from_json.py -msgid "pumped" +msgid "\"dog bit off my legs, magical hospital make all better\"" msgstr "" #: lang/json/snippet_from_json.py -msgid "Drop your weapon!" +msgid "" +"\"They said a walking cane was a useless weapon... but then I hit one of " +"them with it.\"" msgstr "" #: lang/json/snippet_from_json.py -msgid "Okay , drop your weapon!" +msgid "" +"\"River water around these parts is extremely safe. Probably more safe than " +"the damn tap water at this point.\"" msgstr "" #: lang/json/snippet_from_json.py -msgid "Put your weapon down!" +msgid "\"DON't bomB THe PORtals it MAKES iT WORSE\"" msgstr "" #: lang/json/snippet_from_json.py -msgid "Drop the , !" +msgid "" +"\"No wonder all the camps got overrun, they kept a goddamn zombie test " +"subject! Each and every one of 'em!\"" msgstr "" #: lang/json/snippet_from_json.py -msgid "Drop the !" +msgid "\"I just realized how damn demented those fliers are.\"" msgstr "" #: lang/json/snippet_from_json.py -msgid "Drop your !" +msgid "\"I propose a new currency: 9mm.\"" msgstr "" #: lang/json/snippet_from_json.py -msgid "Put down the !" +msgid "" +"\"Something wrong, with cars..., ram, and,. my speedometer read six " +"hundred.,.thousand can't feel lungs,\"" msgstr "" #: lang/json/snippet_from_json.py -msgid "Drop your weapon, !" +msgid "" +"\"My skin is crawling and I teleport every few minutes... what is going o\"" msgstr "" #: lang/json/snippet_from_json.py -msgid "Put down your !" +msgid "\"You can't see them through the smoke but they can't either.\"" msgstr "" #: lang/json/snippet_from_json.py -msgid "Alright, drop the !" +msgid "\"There's gotta be a better use of all this rebar...\"" msgstr "" #: lang/json/snippet_from_json.py -msgid "motherfucking" +msgid "" +"\"met schoolhouse of people, all crazy and mad they were, ate killed all of " +"them, yum\"" msgstr "" #: lang/json/snippet_from_json.py -msgid "freaking" +msgid "\"STAY AWAY FROM THE BIG ONES IN THE FOREST\"" msgstr "" #: lang/json/snippet_from_json.py -msgid " " +msgid "" +"\"got into a prison with a halligan bar. makes me wonder how they kept " +"prisoners inside\"" msgstr "" #: lang/json/snippet_from_json.py -msgid "fuckin'" +msgid "" +"\"Shopping carts become a lot more efficient when you plate-weld a trunk to " +"them. Crate on wheels!\"" msgstr "" #: lang/json/snippet_from_json.py -msgid "god damn" +msgid "\"telportfd itont wall, amr gone\"" msgstr "" #: lang/json/snippet_from_json.py -msgid "mafuckin'" +msgid "" +"\"This thing isn't a car any more. It's just a fucking mountain of metal on " +"wheels, which I live in.\"" msgstr "" #: lang/json/snippet_from_json.py -msgid "Wait up, let's talk!" +msgid "" +"\"Anyone else seen those really... SQUARE-looking towns? I don't think " +"they're normal.\"" msgstr "" #: lang/json/snippet_from_json.py -msgid "Hey, I want to talk to you!" +msgid "\"BOSTON IS FUNGUS DON'T GO THERE\"" msgstr "" #: lang/json/snippet_from_json.py -msgid "Come on, talk to me!" +msgid "" +"\"big z threw me on top of the building, legs broken but at least im safe " +"for a few more minutes\"" msgstr "" #: lang/json/snippet_from_json.py -msgid "Hey , let's talk!" +msgid "" +"\"I'm starting to feel bad about disabling all these turrets and stealing " +"their ammunition.\"" msgstr "" #: lang/json/snippet_from_json.py -msgid ", we need to talk!" +msgid "" +"\"Make sure you strip the house for all available resources-- tubes, pipes, " +"ceramics, sheets, strings, and more\"" msgstr "" #: lang/json/snippet_from_json.py -msgid "Hey, we should talk, ?" +msgid "" +"\"there was a giant shell in my backyard for a few weeks. one day a squid " +"guy popped out of it and said his name was steve\"" msgstr "" #: lang/json/snippet_from_json.py -msgid "! Wait up!" +msgid "\"FUCK FAUX-MUTANTS, BEING 'EXTREMELY THIRSTY' DOES NOT COUNT\"" msgstr "" #: lang/json/snippet_from_json.py -msgid "Wait up, ?" +msgid "" +"\"There's nothing wrong with eating people if you HAVE to. I mean, I only " +"did it because I didn't want to waste my potato chips!\"" msgstr "" #: lang/json/snippet_from_json.py -msgid "Let's talk, !" +msgid "\"all these robotic police really take the piss out of kops\"" msgstr "" #: lang/json/snippet_from_json.py -msgid "Look, let's talk!" +msgid "\"CHINA DID THIS\"" msgstr "" #: lang/json/snippet_from_json.py -msgid "Put your hands up!" +msgid "\"RUSSIA DID THIS\"" msgstr "" #: lang/json/snippet_from_json.py -msgid "Put your hands up, !" +msgid "" +"\"Thank You RivTech. Thank You For Good Coffee. Will Always Stay Awake For " +"You Rivtech.\"" msgstr "" #: lang/json/snippet_from_json.py -msgid "Reach for the sky!" +msgid "" +"\"See, now I'm just not sure where I'm putting all these storage batteries " +"in my body!\"" msgstr "" #: lang/json/snippet_from_json.py -msgid "Hands up!" +msgid "\"dont try to leave they will shoot you\"" msgstr "" #: lang/json/snippet_from_json.py -msgid "Hands in the air!" +msgid "" +"\"herbs + salt + cooking oil + coffee powder + ammonia = a meal, right?\"" msgstr "" #: lang/json/snippet_from_json.py -msgid "Hands up, !" +msgid "" +"\"HA! YOU THOUGHT I WOULD LEAVE A USEFUL NOTE?! SCREW YOU! GO DIE IN A " +"BLOB PIT!\"" msgstr "" #: lang/json/snippet_from_json.py -msgid "Hands where I can see them!" +msgid "" +"\"I'd like to thank my high-school culinary arts class for teaching me how " +"to make RDX and mutagenic serum.\"" msgstr "" #: lang/json/snippet_from_json.py -msgid "Okay , hands up!" +msgid "\"Makayla Sanchez burned down my fucking house\"" msgstr "" #: lang/json/snippet_from_json.py -msgid "Okay hands up!" +msgid "\"he calls himself the 'man with the hands', don't approach\"" msgstr "" #: lang/json/snippet_from_json.py -msgid "Hands in the air, !" +msgid "" +"\"So... what happens if the military rescues us? We're all freaks by now, " +"right? How the fuck are we gonna go back to real life?\"" msgstr "" -#: lang/json/snippet_from_json.py src/martialarts.cpp -msgid "Move" +#: lang/json/snippet_from_json.py +msgid "" +"\"Not sure if my companion WANTED to turn into a bird, but I was the one " +"giving her the serum, and I saved her life! That's fair, right?\"" msgstr "" #: lang/json/snippet_from_json.py -msgid "Move your ass" +msgid "" +"\"what's a resonance cascade? can't be that bad, maybe i'll get some cool " +"l##/###\"" msgstr "" #: lang/json/snippet_from_json.py -msgid "Get out of the way" +msgid "\"I've never been very confident, is that why my shots keep missing?\"" msgstr "" #: lang/json/snippet_from_json.py -msgid "You need to move" +msgid "\"FIRE BAD. NOW NAKED. PLEASE HELP.\"" msgstr "" #: lang/json/snippet_from_json.py -msgid "Hey , move" +msgid "" +"\"Heard of a place up in Maine where people have their shit together. " +"Hundreds of people, defense, food and shelter... let's go raid it, guys!\"" msgstr "" #: lang/json/snippet_from_json.py -msgid " move it" +msgid "" +"\"The whispering fog is taking me in like a blanket. I'm warm now. I'm " +"finally\"" msgstr "" #: lang/json/snippet_from_json.py -msgid "Move your ass" +msgid "" +"\"got a video recording of hour one when the portals were still up. pretty " +"cool\"" msgstr "" #: lang/json/snippet_from_json.py -msgid "Get out of my way, ," +msgid "" +"\"Stuck here. Zombies outside. Friends were outside too, now they're part " +"of zombies. Need to be quiet\"" msgstr "" #: lang/json/snippet_from_json.py -msgid "Move to the side" +msgid "" +"\"if anyones reading this, please tell my mom i was right about insects " +"being superior\"" msgstr "" #: lang/json/snippet_from_json.py -msgid "Get out of my line of fire" +msgid "" +"\"Diamond coated sword! Diamond coated hammer! Diamond coated clothes! " +"Diamond coated hands help\"" msgstr "" #: lang/json/snippet_from_json.py -msgid "I almost want to eat my now." +msgid "" +"\"waded through 14 miles of sewage for playboy magazine, wasnt worth it\"" msgstr "" #: lang/json/snippet_from_json.py -msgid "When we eatin'?" +msgid "" +"\"I'm coming back for this note in twelve hours. If I don't, take all my " +"shit!\"" msgstr "" #: lang/json/snippet_from_json.py -msgid "I'd eat a burger if I had one." +msgid "" +"\"all my friends died when they came near me. there's nothing funny about " +"that\"" msgstr "" #: lang/json/snippet_from_json.py -msgid "Perfect time for a lunch break." +msgid "\"Wow, this sinkhole is really comfortable!\"" msgstr "" #: lang/json/snippet_from_json.py -msgid "I'm hungry..." +msgid "\"DOG NOT REAL DOG\"" msgstr "" #: lang/json/snippet_from_json.py -msgid "I'm hungry." +msgid "" +"\"This is all just a dream, right??! I'M GOING TO WAKE UP, SHE'S GOING TO BE " +"OK\"" msgstr "" #: lang/json/snippet_from_json.py -msgid "I'm hungry." +msgid "\"wek ik spak\"" msgstr "" #: lang/json/snippet_from_json.py -msgid "So, , when we eatin'?" +msgid "\"IT'S BURIED! THE TEMPLE IS BURIED!\"" msgstr "" #: lang/json/snippet_from_json.py -msgid "I need to eat something." +msgid "" +"\"If I had a dollar for every cash card I've found, I'd have more money than " +"is on these stupid things!\"" msgstr "" #: lang/json/snippet_from_json.py -msgid " if I don't get some food." +msgid "" +"\"can never have enough kevlar. basically just live in a kevlar turtle " +"shell.\"" msgstr "" #: lang/json/snippet_from_json.py -msgid "Consider this idea: you give me food and I eat it." +msgid "\"Wow, I haven't had to piss in weeks!\"" msgstr "" #: lang/json/snippet_from_json.py -msgid "Did you know that lack of food kills faster than chain smoking?" +msgid "\"MY GLITTERING SNAKE COMPELS YOU! OBEY!\"" msgstr "" #: lang/json/snippet_from_json.py -msgid "fuck you" +msgid "" +"\"can sunstasin self frorever off fof my funggnaloid babiues oout fo yme " +"arms eat themm up eatbtb my chidlldren\"" msgstr "" #: lang/json/snippet_from_json.py -msgid "fuck off" +msgid "" +"\"Gonna settle down one day. Nice big orchard, couple of friends/future " +"family to spend time with, and my army of zlaves to guard the place.\"" msgstr "" #: lang/json/snippet_from_json.py -msgid "go fuck yourself" +msgid "" +"\"a ctulaly don t mi nd t he cold it s f i ne in h ere nn o problem\"" msgstr "" #: lang/json/snippet_from_json.py -msgid ", " +msgid "" +"\"tried to shoot myself but the nanobots fixed it, fucked up the controls, " +"now i can't turn them off i just want it to be over\"" msgstr "" #: lang/json/snippet_from_json.py -msgid ", " +msgid "" +"\"Tried wearing dead zombie clothes, but they still knew I was alive! It's " +"like they're a hivemind, man!\"" msgstr "" #: lang/json/snippet_from_json.py -msgid "" +msgid "\"MY PALMS ONLY GROW IN POWER!\"" msgstr "" #: lang/json/snippet_from_json.py -msgid "Can I get out and walk? This vehicle is too small." +msgid "" +"\"riddle. what's 1/4 feathers, 1/4 scales, 1/4 metal, and 1/4 flesh? " +"answer: sorry, but you should know this one.\"" msgstr "" #: lang/json/snippet_from_json.py -msgid "How about we make the next vehicle a convertible?" +msgid "" +"\"For anyone that's reading this, I just want to confirm (FROM AN UNBIASED " +"SOURCE) that it was NOT the scientists' fault.\"" msgstr "" #: lang/json/snippet_from_json.py -msgid "This vehicle is too small." +msgid "\"Whoops, I put my sister's insulin in my internal furnace. Shit.\"" msgstr "" #: lang/json/snippet_from_json.py -msgid "I'm not a contortionist!" +msgid "" +"\"traveled with a few friends after the thing started. mostly stuck to bike " +"paths and eaten fruit and mushroomdhfhghghhhh\"" msgstr "" #: lang/json/snippet_from_json.py -msgid "I can't fit in your tiny human vehicle." +msgid "" +"\"We're the eagle-eyes in the sky! Just two mutant avians in our " +"helicopter! Filming the Cataclysm! Check us out on any working electronics!" +"\"" msgstr "" #: lang/json/snippet_from_json.py -msgid "This sucks. I'm too big." +msgid "" +"\"My friend was getting eaten. Started ranting about how he had 70 HP on " +"his head, and that the zombie shouldn't penetrate his armor... poor guy. " +"Bad die roll, I guess.\"" msgstr "" #: lang/json/snippet_from_json.py -msgid "I don't like being a mutant crammed into your tiny little vehicle." +msgid "\"WE'RE GOING TO SAIL TO CANADA, BITCHES!\"" msgstr "" #: lang/json/snippet_from_json.py -msgid " Fire in the hole!" +msgid "" +"\"Anyone hear about that guy who tried to sail his family to Canada? What a " +"moron, right?\"" msgstr "" #: lang/json/snippet_from_json.py -msgid " Get cover!" +msgid "\"recently canadian border has gotten more dangerous don't go there\"" msgstr "" #: lang/json/snippet_from_json.py -msgid "Marines! We are leaving!" +msgid "\"Hey, what happened to my dad's airboat?!\"" msgstr "" #: lang/json/snippet_from_json.py -msgid "Hit the dirt!" +msgid "\"Reading is good! Never stop reading. Read EVERYTHING.\"" msgstr "" #: lang/json/snippet_from_json.py -msgid "This shit is gonna blow!" +msgid "" +"\"I'm gonna be honest here, I'm really gonna die soon so I dont want to gt " +"forgnottedn ples dont forntget me y nrmmy name is h@@hbhbh\"" msgstr "" #: lang/json/snippet_from_json.py -msgid "I'm standing way too close to this firecracker." +msgid "" +"\"It wasn't Russia or China, guys. It was me. This whole apocalypse is my " +"fault. You can just call me... Darkling.\"" msgstr "" #: lang/json/snippet_from_json.py -msgid "I need to get some distance." +msgid "\"all it takes to seal a wound is a sawblade and a match! trust me\"" msgstr "" #: lang/json/snippet_from_json.py -msgid "I need to get some distance." +msgid "" +"\"I wonder what's in this sarcophagus? Maybe it's a real sarcophagus. " +"Maybe there's a big guy named God under here.\"" msgstr "" #: lang/json/snippet_from_json.py -msgid " I'm getting my ass out of here!" +msgid "\"these hulks aint so incredible when ya got .50\"" msgstr "" #: lang/json/snippet_from_json.py -msgid "Fire in the hole, motherfuckers!" +msgid "" +"\"Got my legs dissected. It's OK, at least I have my dog! Her legs were " +"also dissected, but that's OK, we're gonna be OK...\"" msgstr "" #: lang/json/snippet_from_json.py -msgid "Fire in the hole!" +msgid "" +"\"Mi-go is friend! Go with Mi-go to friend dimension! On the Friend Team!!" +"\"" msgstr "" #: lang/json/snippet_from_json.py -msgid "Get cover!" +msgid "\"We have Landed our Comet. The Sky is Ablaze.\"" msgstr "" #: lang/json/snippet_from_json.py -msgid "Get down!" +msgid "" +"\"Last one standing. It's good feeling. I win. I win I win I win I win I " +"win\"" msgstr "" #: lang/json/snippet_from_json.py -msgid "Hit the dirt!" +msgid "\"Adderall cures weakness, tramadol cures death\"" msgstr "" #: lang/json/snippet_from_json.py -msgid "I'm getting my ass out of here! You'd better do the same, !" +msgid "\"These turrets keep dodging my FUCKING BULLETS!\"" msgstr "" #: lang/json/snippet_from_json.py -msgid "Fire in the hole, motherfuckers!" +msgid "" +"\"Best way to train is by throwing pebbles at birds. You'll be a legend.\"" msgstr "" #: lang/json/snippet_from_json.py -msgid "Fuck me! A " +msgid "\"new bedford is overrun. i'm sorry. we tried.\"" msgstr "" #: lang/json/snippet_from_json.py -msgid "Watch out for that" +msgid "" +"\"Check out my cooking show on The Television! Making Mannwurst sausages " +"out of some of those assholes who tried to raid my kitchen earlier...\"" msgstr "" #: lang/json/snippet_from_json.py -msgid "Watch out! I see a" +msgid "" +"\"Renting out my rat tunnels for 50 9mm rounds a night. I dug them with my " +"own claws, so you know they're the best.\"" msgstr "" #: lang/json/snippet_from_json.py -msgid ", a" +msgid "" +"\"Anyone wanna listen to some music at full volume and shoot the Zs that " +"approach? You pick the tunes if I get some ammo.\"" msgstr "" #: lang/json/snippet_from_json.py -msgid ", I'm doomed! There's a " +msgid "" +"\"Lots of new easy ways to burn calories now. Fighting aminata, managing " +"the fields, running with my wings buzzing, and more.\"" msgstr "" #: lang/json/snippet_from_json.py -msgid ", here comes a " +msgid "\"lotta dead mothers\"" msgstr "" #: lang/json/snippet_from_json.py -msgid "Look out for that" +msgid "\"FLAMING SWORD HUMANE. CAUTERIZES WOUNDS. SURGICAL.\"" msgstr "" #: lang/json/snippet_from_json.py -msgid "Hey! Over there! I see a" +msgid "" +"\"knife screams it screams i cant breathe so scared help me please help\"" msgstr "" #: lang/json/snippet_from_json.py -msgid "Incoming" +msgid "\"when it started, we could still hope The Man was gonna save us...\"" msgstr "" #: lang/json/snippet_from_json.py -msgid "Are we fighting? There's a" +msgid "" +"\"Hey, Ted. Alexander and Cass and I are heading to Z-Mobile for the last " +"of the meth. Keep the lizard fetus fed for us, OK?\"" msgstr "" #: lang/json/snippet_from_json.py -msgid "Hey, ! " +msgid "" +"\"i say we call the material from melting down cars and dead robots " +"'massachusetite' or 'vermontsteel' or 'connecticut composite'\"" msgstr "" #: lang/json/snippet_from_json.py -msgid "Look out! A" +msgid "" +"\"Sometimes what you need when you're infected, bleeding, sick and hungover " +"is a J and some chips.\"" msgstr "" #: lang/json/snippet_from_json.py -msgid "Look sharp! Things are heating up." +msgid "\"I am nothing without my supertank and storage megastructure.\"" msgstr "" #: lang/json/snippet_from_json.py -msgid "Hostiles inbound." +msgid "" +"\"Hahahahaa stupid fuck in his mansion, with his plate armor and big axe. " +"Guy never swung the thing in his life. Can't block bullets, dipshit\"" msgstr "" #: lang/json/snippet_from_json.py -msgid "Are we fighting or leaving?" +msgid "" +"\"I woke up with a dozen bears in a tribe outside the vault. One was " +"covered in red markings, glowing-- speaking.\"" msgstr "" #: lang/json/snippet_from_json.py -msgid "Hey, ! " +msgid "" +"\"poor guy. watched him from afar with my binocs for months and months. " +"today he died fighting. feels like i knew him even though i never " +"approached.\"" msgstr "" #: lang/json/snippet_from_json.py -msgid "Uh, ? " +msgid "" +"\"I hope I don't leave this note in a pawn shop, bank vault, or library... " +"'cus that would mean I'm dead.\"" msgstr "" #: lang/json/snippet_from_json.py -msgid "Naptime is over." +msgid "\"ENGLAND DID THIS\"" msgstr "" #: lang/json/snippet_from_json.py -msgid "Who's there?" +msgid "" +"\"I finally dug to the hellmouth. My body burns but my soul finally finds " +"its purpose\"" msgstr "" -#: lang/json/snippet_from_json.py lang/json/speech_from_json.py -msgid "Hello?" +#: lang/json/snippet_from_json.py +msgid "" +"\"That little fakkin rat din say anythin till we whacked him with a steel " +"chain! Then 'e just wanted to know if he could buy the chain!\"" msgstr "" #: lang/json/snippet_from_json.py -msgid "Look alive!" +msgid "" +"\"tom, adorned with fluid sacs three layers deep, crawls to safety like a " +"slug\"" msgstr "" #: lang/json/snippet_from_json.py -msgid "" +msgid "" +"\"my friend turned fuckin insane and ate his arms and then his sister's " +"arms! he looked rather cross\"" msgstr "" #: lang/json/snippet_from_json.py -msgid " look sharp! Things are heating up." +msgid "\"Starting today, the hallucinations are my only friends.\"" msgstr "" #: lang/json/snippet_from_json.py -msgid " Hostiles inbound." +msgid "\"For sale: zombaby shoes, very filthy\"" msgstr "" #: lang/json/snippet_from_json.py -msgid "You're gonna rot in hell, you pieces of shit!" +msgid "" +"\"Started my own brewery recently. I just need some glass bottles, now! " +"Several thousand! I'm planning way ahead.\"" msgstr "" #: lang/json/snippet_from_json.py -msgid "You're gonna rot in hell for this!" +msgid "" +"\"We're the eagle-eyes in the sky! We're gonna fly our bird 'copter! " +"Northward! And bomb the military checkpoint! Wish us luck!\"" msgstr "" #: lang/json/snippet_from_json.py -msgid "Kill them all and let God sort them out!" +msgid "" +"\"Heard recently of some radio op who lives in a skyscraper, announcing " +"where those hordes are going. Couldn't find the frequency, though.\"" msgstr "" #: lang/json/snippet_from_json.py -msgid "I love the smell of napalm in the morning." +msgid "\"Woah, bud! Not all cannibals eat meat!\"" msgstr "" #: lang/json/snippet_from_json.py -msgid "This is the way the fuckin' world ends." +msgid "\"ay why aint my bullets fuckin explodin\"" msgstr "" #: lang/json/snippet_from_json.py -msgid "Look at this fuckin' shit we're in, man." +msgid "\"Those Fiktok clan people picked this place clean... no food...\"" msgstr "" #: lang/json/snippet_from_json.py -msgid "Is everything all right?" +msgid "\"The fewer people in New England, the stronger we'll become.\"" msgstr "" #: lang/json/snippet_from_json.py -msgid "Look out!" +msgid "\"It all boils down to the Apex Predator.\"" msgstr "" #: lang/json/snippet_from_json.py -msgid "Run!" +msgid "" +"\"King Jameson ik goner! Thee cyber limbs isk falleng off me body! Stak " +"pyroteknik I heear!\"" msgstr "" #: lang/json/snippet_from_json.py -msgid "Be quiet." +msgid "" +"\"Christian, but have no bible-- the Flying Spaghetti Monster is my god " +"now. For morale's sake...\"" msgstr "" #: lang/json/snippet_from_json.py -msgid "Please, I don't want to die." +msgid "\"THE GRANADE DEBUGGED MY SPIDER FRIEND WHERE IS SHE\"" msgstr "" #: lang/json/snippet_from_json.py -msgid "We have a serious situation here." +msgid "" +"\"Got my mortar and pestle. Now if I could just find some avocados...\"" msgstr "" #: lang/json/snippet_from_json.py -msgid "Where did you come from?" +msgid "" +"\"saw a girl standing with the mushrooms. spores coming out of slits in her " +"neck. she looked happy.\"" msgstr "" #: lang/json/snippet_from_json.py -msgid "Help!" +msgid "" +"\"Found some pink berries. Eating them makes bushes into more pink " +"berries. Infinite berry.\"" msgstr "" #: lang/json/snippet_from_json.py -msgid "Be careful out there." +msgid "\"m ust grow unity\"" msgstr "" #: lang/json/snippet_from_json.py -msgid "It's heading right for us!" +msgid "\"AMY IS FUNGUS. DO NOT LISTEN IF SHE ASKS YOU TO TAKE OFF MASK\"" msgstr "" #: lang/json/snippet_from_json.py -msgid "You hear that?" +msgid "" +"\"my rabbi follows a new god now. asks us to call him a local guide. i " +"dont mind, he keeps us fed\"" msgstr "" #: lang/json/snippet_from_json.py -msgid "Time to die!" +msgid "\"Fungus are helping us. Help them and they will unite us\"" msgstr "" #: lang/json/snippet_from_json.py -msgid "Looks like that's over." +msgid "" +"\"Saw a boy couldnt be older than 16. Walked straight through the mushroom " +"tower. THROUGH IT\"" msgstr "" #: lang/json/snippet_from_json.py -msgid ", " +msgid "" +"\"Found some food in a box outside my house. We ate it and now the " +"fungaloids aren't harming us. I think we are a mushroom now\"" msgstr "" #: lang/json/snippet_from_json.py -msgid "I think we won." +msgid "" +"\"saw the girl again. she looked dead exhausted and walked right into the " +"fungus. 30 mins later and she walked out good as new\"" msgstr "" #: lang/json/snippet_from_json.py -msgid "Hey, , " +msgid "" +"\"HADENSBROOK REBUILT AROUND FUNGUS. THEY EAT GRAY APPLES AND SPREAD IT\"" msgstr "" #: lang/json/snippet_from_json.py -msgid "Are you wounded? Am I wounded?" +msgid "\"mycus must grow\"" msgstr "" #: lang/json/snippet_from_json.py -msgid "Another day, another victory." +msgid "" +"\"School bus with solar panels = TRUST. Gave us berries and seeds, we were " +"out of food\"" msgstr "" #: lang/json/snippet_from_json.py -msgid "I think I need to see a doctor." +msgid "\"d o nThelp scho Ol buss makE seeeedS ARe FUNGUS!! !\"" msgstr "" #: lang/json/snippet_from_json.py -msgid "At least we know they can die." +msgid "" +"\"Go to every fungus patch you find but WEAR A SUIT. Food there is very " +"very filling. Look for pink berries, blue flowers\"" msgstr "" #: lang/json/snippet_from_json.py -msgid "Anyone else want to die?" +msgid "" +"\"red blue yellow berry seed sap bloom flowers tower mycus mycus mycus.\"" msgstr "" #: lang/json/snippet_from_json.py -msgid "How do we get out of here?" +msgid "" +"\"Husband 30 yrs died in bombs. Mushrooms brought him back. GIVE YOURSELF " +"TO THEm AND THEY WILL HELP YOU\"" msgstr "" #: lang/json/snippet_from_json.py -msgid "Is that the last of them?" +msgid "" +"\"Lisa always was a fan of sports. Thank God these Global Athletics Games " +"in Harran started some time before the outbreak, so she was able to leave " +"New England before it was quarantined. I can only hope there are no " +"zombies, as we do have here, in the city she flew to.\"" msgstr "" #: lang/json/snippet_from_json.py -msgid "I'd kill for a coke." +msgid "" +"LABS BOMBED: In further invasion proof (discounting earlier suggestion of a " +"riot drug) most of New England's scientific labs were bombed simultaneously " +"yesterday. No word yet from the military about who the aggressors are." msgstr "" #: lang/json/snippet_from_json.py -msgid "" +msgid "" +"CHINA INVADES?: Communications were muddled by a large influx of aggressive " +"armed individuals. \"We have this,\" says a local Police Chief. \"We are " +"authorizing our robotic security drones to use lethal force on combative " +"humans.\"" msgstr "" #: lang/json/snippet_from_json.py -msgid " What a day." +msgid "" +"INVADERS NOT HUMAN?: An earlier command by the Police Chief has backfired. " +"\"The invaders don't register as human. The securibots turned on us when we " +"tried to fight them. We don't have enough people left to reprogram them.\"" msgstr "" #: lang/json/snippet_from_json.py -msgid " I win again!" +msgid "" +"INVASION IS GM TROOPS: Reports of invasion by as yet unknown soldiers have " +"been confirmed, and this paper has gained first hand footage proving genetic " +"modification, with examples of extreme strength, speed and natural armor." msgstr "" #: lang/json/snippet_from_json.py -msgid "Don't worry about it." +msgid "" +"INVADERS ARE SUPER SOLDIERS: Further proof of mutation, in addition to " +"strength, speed & toughness, we now have reports of foreign enemies who are " +"somehow firing lightning fields, spitting acid and reports of soldiers " +"hidden in mobile clouds of smoke." msgstr "" #: lang/json/snippet_from_json.py -msgid "Don't worry." +msgid "" +"MILITARY HAS GM TOO - GENERAL: \"We want to reassure the people, these " +"invaders are not the only super-soldiers. Our genemods are more advanced " +"than China's. We were safety-testing, which China obviously skipped " +"disastrously.\"" msgstr "" #: lang/json/snippet_from_json.py -msgid "I've seen horrors, horrors that you've seen." +msgid "" +"PUBLIC SERVICE ANNOUNCEMENT: \"Aid Delayed\". Fighting by the military at " +"the edge of the New England Disaster Area is expected to delay civilian " +"extraction. Civilians will be forced to supply themselves over the next " +"weeks." msgstr "" #: lang/json/snippet_from_json.py -msgid "Every man has got a breaking point." +msgid "" +"PUBLIC SERVICE ANNOUNCEMENT: \"New England Cut Off\". New England has been " +"quarantined for the safety of the rest of the USA. No rescue attempts will " +"be funded, it is assumed there are no survivors in the area." msgstr "" #: lang/json/snippet_from_json.py -msgid "Only a few more days 'til the weekend." +msgid "" +"LEAVE TO THE EXPERTS -- GENERAL: \"Do not attempt to deal with invaders " +"yourself, our troops have the technology and the training for military " +"action. Loud gunfire may attract more enemy attention than you have ammo!\"" msgstr "" #: lang/json/snippet_from_json.py -msgid "Anything else?" +msgid "" +"TOWNS OCCUPIED TERRITORY: FEMA officials said today \"Do not try to defend " +"your property in towns: invaders use advanced tracking, perhaps scent. " +"Please retreat to your nearest evacuation center outside town and await " +"extraction.\"" msgstr "" #: lang/json/snippet_from_json.py -msgid "I'm fine." +msgid "" +"PUBLIC SERVICE ANNOUNCEMENT: \"Beware Acid Rain\". Several caustic " +"chemicals in the air react with rain clouds to cause deadly acid rain. No " +"word yet on if this is a deliberate tactic or a side effect of the earlier " +"bombings." msgstr "" #: lang/json/snippet_from_json.py -msgid "There you are." +msgid "" +"EDITOR SAYS \"DESTROY THE DEAD\". Recognizable enemy dead left lying in the " +"street may give away militia positions! If you kill an enemy combatant, " +"smash or butcher with a knife until unrecognizable! Screw Geneva! Protect " +"our troops!" msgstr "" #: lang/json/snippet_from_json.py -msgid "Time for you to die," +msgid "" +"SOLDIERS SEEN HEADED UNDERGROUND. Rumors abound as eyewitness see troops " +"headed underground near a local salon. Expert sources suggest that the " +"soldiers may be headed to a possible underground bunker." msgstr "" #: lang/json/snippet_from_json.py -msgid "This bullet is for you," +msgid "" +"A BRIDGE TOO FAR: In a Monday statement, the Department of Defense detailed " +"its plans to deploy strategic minefields on key bridge crossings, in order " +"to quarantine infected regions. \"Military personnel will be on-site to " +"assist any refugees fleeing the infected zones. We urge citizens to comply " +"with all military directives and avoid quarantined areas whenever possible " +"until order can be restored.\"" msgstr "" #: lang/json/snippet_from_json.py -msgid "I can take on" +msgid "" +"QUANTUM LEAP: An undisclosed project has yielded results in the form of " +"theoretical teleportation. \"This is just the tip of the iceberg,\" said a " +"source. \"I can't disclose, but this development is the LEAST in this " +"exciting vein!\"" msgstr "" #: lang/json/snippet_from_json.py -msgid "Hey, ! I've got" +msgid "" +"HE WILL BLOW YOUR WORLD: Scientist Kevin Granade reveals potential \"Reality " +"Grenade\", loosely related to teleport-tech. He claims could be used to " +"weaken enemies or improve our own troops. \"We're still in Alpha testing,\" " +"says Kevin, \"It really needs a Bugfix\"." msgstr "" #: lang/json/snippet_from_json.py -msgid "! Watch my back while I kill" +msgid "" +"SECURIBOTS: Keeping your home safe, ready the second the alarm goes off... " +"Who needs people?" msgstr "" #: lang/json/snippet_from_json.py -msgid "I'm your huckleberry," +#, no-python-format +msgid "" +"ROBOCOP BEATS CRIME: Due to the common usage of Securibots and their ability " +"to respond more rapidly than people, crime is down 54% and dropping. Police " +"chief says \"Don't trip an alarm and you have nothing to worry about\"" msgstr "" #: lang/json/snippet_from_json.py -msgid "Sorry, but you have to do down," +msgid "" +"ROBOT RAMPAGE: Three Protesters injured when surrounding a Military base, " +"protesting automated turrets which put guards out of jobs. \"We warned " +"them, turrets will open fire on anyone without a military ID,\" a general " +"said." msgstr "" #: lang/json/snippet_from_json.py -msgid "! I'm gonna kill you," +msgid "" +"GOVERNMENT INTRODUCES GUN SUBSIDIES: In a move the government says will " +"boost the economy, encourage military production and support defense " +"militia, the government has dropped taxes on guns and applied a subsidy for " +"the poor." msgstr "" #: lang/json/snippet_from_json.py -msgid "Watch you bleed out," +msgid "" +"US IGNORES UN DEMANDS: The US ambassador to the UN today turned down UN " +"requests to begin nuclear disarmament by China, the US and North Korea. " +"\"We have a right to defend ourselves,\" insisted the ambassador. \"We'll " +"back down when they do\"." msgstr "" #: lang/json/snippet_from_json.py -msgid "Hey ! I'm gonna murder" +msgid "" +"A WHOLE NEW YOU! Augment your world with CBMs! This ad features a man " +"covered in solar panels with a miniature flashlight in the middle of his " +"head." msgstr "" #: lang/json/snippet_from_json.py -msgid "! This is the end," +msgid "" +"The Future... powered by COFFEE! Rivtech brings you the greatest " +"revolution since espresso. Why wait for milk to boil? Have your coffee " +"ready instantly with \"THE POWER OF THE ATOM\"!" msgstr "" #: lang/json/snippet_from_json.py -msgid "I can take on" +msgid "" +"GLAMOPOLITAN! We've got ALL the latest tips! Whether you want to know what " +"the elite are eating, wearing or discussing, Glamopolitan is YOUR magazine! " +"So pick up a copy today and \"Sizzle Like A Star\"!" msgstr "" #: lang/json/snippet_from_json.py -msgid "Time to die," +msgid "" +"POPULAR MECHANICS: People say mechanics is boring. We say, Prove them " +"Wrong! We've got all the articles that make it interesting to talk about, " +"so you can \"Make Mechanics Popular\"!" msgstr "" #: lang/json/snippet_from_json.py -msgid "!" +msgid "" +"CRAFTY CRAFTERS QUARTERLY: Macaroni isn't just for eating anymore! Learn " +"how to make jewelery and art from it as well! We also discuss the correct " +"way to use superglue without gluing your hands together!" msgstr "" #: lang/json/snippet_from_json.py -msgid "I'ma cut those fuckin' tentacles off, bitch!" +msgid "" +"UNDERGROUND BUNKER? Sources in the government suggest that an underground " +"bunker is being built in a secret location in case of enemy attack. We were " +"unable to get the exact location as our sources mysteriously disappeared " +"shortly after revealing this information." msgstr "" #: lang/json/snippet_from_json.py -msgid "Watch you bleed out!" +msgid "" +"STUDENT MISSING: A high school student vanished yesterday evening in the " +"forest near Wayland. The 17-year-old international student from China (who " +"adopted the anglicized nickname \"Brett\" due to Americans' difficulty " +"pronouncing his given name) was last seen with his friends in the camp. " +"\"Brett said that he was gonna get some firewood but he never came back,\" " +"said his classmate, Jianxiang Wang. The search is underway." msgstr "" #: lang/json/snippet_from_json.py -msgid "Is this Reno? Because I need to watch you die!" +msgid "" +"STILL SEARCHING: The search for Brett, the high school student who went " +"missing three days ago, is still ongoing. \"He could have played in the " +"soccer game against Weston High School yesterday,\" Brett's sorrowful " +"teammate said, \"[..] we've never stopped praying.\" Despite the best " +"efforts of the County Search & Rescue, Brett had still not been located at " +"the time of this report." msgstr "" #: lang/json/snippet_from_json.py -msgid "You're going to pay for that, !" +msgid "" +"RUMORS DENIED: Allegations that the military had been conducting " +"teleportation experiments in secret just outside Wayland were put to rest " +"during a press conference earlier today. \"I have to clarify that not only " +"have we never done such research,\" said the officer on the press " +"conference, \"teleportation only exists in sci-fi films.\"" msgstr "" #: lang/json/snippet_from_json.py -msgid "I think I need to see a doctor. I'm patching myself up." +msgid "" +"GRANADE SEEKS FUNDING FOR GRANADE: This paper has been investigating rumors " +"disgraced former scientist Kevin Granade seeks public funding for so-called " +"reality-warping weapon \"the Granade\", which \"[...]works by patching " +"reality\". Apparently it will be crowdsourced via Kickstarter as \"Project " +"Cataclysm\" " msgstr "" #: lang/json/snippet_from_json.py -msgid "Please, I don't want to die. Let these bandages work!" +msgid "" +"GOVERNMENT SCIENCE BOOST: The government has drastically increased defense " +"R&D after UN disarmament demands. \"This not only keeps money in our " +"country, but maintains our lead on China and keeps us defended\", the " +"President said." msgstr "" #: lang/json/snippet_from_json.py -msgid "Hold up, I need to apply these." +msgid "" +"HOME GROWN SCIENCE: Several governors & legislators from the New England " +"region discussed a new regional initiative today, which relaxed laws that " +"limit the distance a hazardous-material laboratory or factory can be from a " +"city. \"This should keep our economy going strong for years to come, with " +"all the military R&D facilities being established,\", one mayor remarked." msgstr "" #: lang/json/snippet_from_json.py -msgid "That cut looks bad, I'm going to fix it." +msgid "" +"DRIVING ON A WING AND A PRAYER: A New England man has proven it is possible " +"to create a new car from scrap parts using almost nothing but duct tape. " +"When asked why he had done it, his answer was \"Well, I didn't have a welder." +"\"" msgstr "" #: lang/json/snippet_from_json.py -msgid "I hope these bandages work." +msgid "" +"NEVER BE LEFT IN THE DARK! Rivtech Atomic-nightlight uses \"inexhaustible\" " +"plutonium fuel cell, provides light, feeds power back into your grid!" msgstr "" #: lang/json/snippet_from_json.py -msgid "I think I need to see a doctor. They're all dead, I hope these work." +msgid "" +"Sick of FUEL PRICES? Bus stop too far? Get your driving fix from THE SUN! " +"Solar powered electric cars: Silent, Cheap, Powerful." msgstr "" #: lang/json/snippet_from_json.py -msgid "Please, I don't want to die. C'mon, bandages!" +msgid "" +"Coffee of The Future... RIGHT NOW! No one has really has the time to make " +"great coffee, but now you don't have to! Rivtech gives you inexhaustible " +"ATOMIC power! To make boiling hot coffee the MINUTE you want it! Atomic " +"Coffeemaker." msgstr "" #: lang/json/snippet_from_json.py -msgid "Quiet down over there!" +msgid "" +"POPULAR MECHANICS: People say mechanics is boring? We say, Prove them " +"Wrong! We've got all the articles that make it interesting to talk about, " +"so you can \"Make Mechanics Popular\"!" msgstr "" #: lang/json/snippet_from_json.py -msgid "Did you hear someone talking?" +msgid "" +"BIRDHOUSE MONTHLY... This month we look at some Dutch innovations in " +"birdhouse design, and compare with the often confused Scandinavian Birdhouse " +"design. Our article on sheet metal birdhouses will have you riveted!" msgstr "" #: lang/json/snippet_from_json.py -msgid "Who said that?" +msgid "" +"TECHWORLD NEWS: Toy company at the origin of the successful talking doll " +"rebrands and becomes Uncanny. Uncanny plans to bring their expertise to the " +"field of androids. Unconfirmed rumors suggest that Uncanny already got a " +"pretty big command from the government." msgstr "" #: lang/json/snippet_from_json.py -msgid "That sounds bad." +msgid "" +"SHOW THEM YOUR GUNS: In response to China's latest threats, the government " +"has further relaxed gun control, expected to increase the economic boost of " +"earlier gun subsidies and relieve public tension." msgstr "" #: lang/json/snippet_from_json.py -msgid "Be alert, something is up!" +msgid "" +"READY FOR THE WORST: The government has proven it is ready to deal with " +"China's threats. In the event of an actual attack, we have established " +"evacuation centers, within a short distance of most towns." msgstr "" -#: lang/json/snippet_from_json.py src/player.cpp -msgid "Did you hear that?" +#: lang/json/snippet_from_json.py +msgid "" +"MUTANT COLD: A new cold virus has emerged in the New England area. \"There " +"don't appear to be complications, but many sufferers are developing large " +"amounts of benign tumorous tissue, A pound or more,\" said a doctor" msgstr "" #: lang/json/snippet_from_json.py -msgid "What's that noise?" +msgid "" +"GRAVE BUSINESS: Recent reports show a large spike in thefts from and " +"assaults on funeral homes in the last few weeks. Described as highly " +"strange but not especially dangerous, Homeland Security is \"looking at the " +"connections now.\"" msgstr "" #: lang/json/snippet_from_json.py -msgid "Is something over there?" +msgid "" +"SPACE TELEPORTATION - TRUTH OR FICTION? Scientists addressed a growing " +"conspiracy theory today \"The plutonium consumed is massive. We cannot use " +"teleportation to reach aliens, unless they live on some kind of parallel " +"world.\"" msgstr "" #: lang/json/snippet_from_json.py -msgid "I hear something moving - sounded like" +msgid "" +"LASERS - NEXT BIG THING?: Top defense researchers remarked during " +"demonstration of a prototype today: \"We are still working on it, the laser " +"weapon lacks power, but has a technically almost unlimited range,\" one said" msgstr "" #: lang/json/snippet_from_json.py -msgid "What's that sound? I heard" +#, no-python-format +msgid "" +"DRUG USE ON THE RISE: Recent statistic suggest drug use has climbed more " +"than 40% in the last two years. \"People are scared for their jobs, their " +"country, even their life... of course some will turn to drugs,\" said an " +"expert." msgstr "" #: lang/json/snippet_from_json.py -msgid "What's there? I heard" +msgid "" +"WAR ON DRUGS DEAD: The government has finally reacted to long accumulated " +"evidence that suggests that decriminalized drugs cause fewer health problems " +"and are generally better managed while providing valuable tax revenues." msgstr "" #: lang/json/snippet_from_json.py -msgid "Did you hear that? Sounded like" +msgid "" +"FEELING BLUE? Try \"Greens\" for Magazines! Your local Supermarket! " +"Nothing cheers you up like a good magazine... Unless it's JUNK FOOD! Or " +"why not buy an MP3 PLAYER or a GAME CONSOLE? Chase those blues away at " +"GREENS Supermarket" msgstr "" #: lang/json/snippet_from_json.py -msgid "What is making that sound? I can hear the" +msgid "" +"BIRDHOUSE MONTHLY... Which wood would a woodpecker prefer? This month we " +"discuss hardwood versus soft woods, whether to lacquer, oil or paint, and " +"which type of nails you should use!" msgstr "" #: lang/json/snippet_from_json.py -msgid "Got it!" +msgid "" +" ...What do you know about surviving in the Wilderness? If you can't make a " +"snare you don't know TRAP! Hunt down a copy of TRAPPERS' LIFE and learn " +"about wildlife!... And how to kill it. This week, a CROSSBOW TRAP!" msgstr "" #: lang/json/snippet_from_json.py -msgid "I'm on it." +msgid "" +"SUPPORT THE COUNTRY THAT SUPPORTS YOU - PRESIDENT: Unexpectedly and " +"unpopularly, the president today instituted a peacetime draft in response to " +"China massing troops. \"We must pray for the best while preparing for the " +"worst.\"" msgstr "" #: lang/json/snippet_from_json.py -msgid "Understood." +msgid "" +"EVACS UNSTOCKED: TRUTH OR FICTION? An unidentified government source has " +"suggested that the evacuation centers are unstocked, having \"already " +"accomplished the goal of calming the people\". He later retracted the " +"comment and is unable to be contacted." msgstr "" #: lang/json/snippet_from_json.py -msgid "I hear you." +msgid "" +"NEW WEAPON UNVEILED: Defense today lifted the lid on a long held secret " +"project. \"We can't discuss the specifics, but it generates a burst of " +"plasma which accurately follows a path of laser-heated air,\" according to a " +"Pentagon official." msgstr "" #: lang/json/snippet_from_json.py -msgid "I'll do that." +msgid "" +"UFO CRASH: TRUTH OR FICTION? One civilian account claims a shining disk " +"appeared in his field. \"It kind of glowed, and I could see a strange gray " +"world through it. Then a shambling hazy purple mushroom came through, man.\"" msgstr "" #: lang/json/snippet_from_json.py -msgid "Sure, I got that." +msgid "" +"TIME TRAVEL: TRUTH OR FICTION? Leaked federal documents describe the " +"formation of a new federal agency XEDRA, to oversee \"4th Axis technology\" " +"already in use. Expert opinion suggests time-travel or parallel worlds." msgstr "" #: lang/json/snippet_from_json.py -msgid "Okay." +msgid "" +" ...What do you know about surviving in the Wilderness? If you can't make a " +"snare you don't know TRAP! Hunt down a copy of TRAPPERS' LIFE and learn " +"about wildlife!... And how to kill it. Classic BEAR TRAP returns in this " +"issue!" msgstr "" #: lang/json/snippet_from_json.py -msgid "Will do." +msgid "" +"HUNTING GOODS! Food prices getting you down? Why not get a crossbow or " +"compound bow and Hunt Your Own!? Our arrows and bolts are completely " +"reusable, so why not hunt animals like Mother Nature intended?" msgstr "" #: lang/json/snippet_from_json.py -msgid "No problem." +msgid "" +"BEWARE UNDEAD PROPAGANDA: Stories about the dead \"rising\" may abet the " +"enemy, a general said today. \"These stories have been tracked to communist " +"sources tied in with the presumably Chinese invasion.\"" msgstr "" #: lang/json/snippet_from_json.py -msgid "Can do." +msgid "" +"GENERAL SAYS AVOID BUNKERS: Do not attempt to flee to your nearest military " +"bunker! Understaffed bunkers are defended by turrets, which shoot those " +"without proper registration. Please seek military personnel if you need " +"access." msgstr "" #: lang/json/snippet_from_json.py -msgid "Whew... smells like skunk!" +msgid "" +"RIOTS CAUSED BY \"NEW DRUG\": Rumors of riots were quelled today. \"These " +"are isolated incidents\" said a local police chief. \"The violence is " +"random and senseless, our current theory is a street drug gone terribly wrong" +"\"" msgstr "" #: lang/json/snippet_from_json.py -msgid "Man, that smells like some good shit!" +msgid "" +"ZOMBIE DRUG: TRUTH OR FICTION? A blogger suggests recent riots are a " +"chemical attack by China. \"They are jealous of our cybernetic superiority, " +"they teamed up with Haiti to put hoodoo drugs in the water making people " +"zombies.\"" msgstr "" #: lang/json/snippet_from_json.py -msgid "Hey, don't bogart the joint!" +msgid "" +"PICKLED MEAT IN A JAR! Just like your grandma used to make! It will last " +"for months or longer, and when you've eaten it, you can refill and seal the " +"jar! Stock your emergency supply TODAY!" msgstr "" #: lang/json/snippet_from_json.py -msgid "C'mon, , I can smell it, pass it over." +msgid "" +"BAGS, BAGS, BAGS! They're very useful things! If we didn't have BAGS, what-" +"would-we-use... to PUT a lot of things in!? (Ad by the \"Play " +"SchoolClothing Co.\")" msgstr "" #: lang/json/snippet_from_json.py -msgid "Wow, that smell takes me back." +msgid "" +"FEELING BLUE? Try \"Greens\" for Magazines! Your local Supermarket! " +"Nothing cheers you up like a good magazine... Unless it's JUNK FOOD! Or " +"why not buy an MP3 PLAYER or a GAME CONSOLE? Chase those Blues away at " +"GREENS Supermarket" msgstr "" #: lang/json/snippet_from_json.py -msgid "Ah, man. Good times, good times. Love that scent." +msgid "" +"WELCOME HOME! Your decision to join our family will lead you to become part " +"of the next generation of job creators. With us you will already have a " +"foot in the door when it is time to rebuild the nation!" msgstr "" #: lang/json/snippet_from_json.py -msgid "What do I smell? Well, I guess it's legal now." +msgid "" +"NEED A NEW JOB? Now that you have secured a comfortable home, try looking " +"into one of the many promising career opportunities that have positions " +"open. Openings such as GEOLOGICAL ENGINEERING ASSISTANT or FACILITY " +"TECHNICIAN offer limitless growth potential! Please contact your employment " +"adviser if you have any questions." msgstr "" #: lang/json/snippet_from_json.py -msgid "Mmm, that weed smells good." +msgid "" +"GOOD WITH YOUR HANDS? Engineering always needs another hand keeping our " +"home in good working order! As an incentive, everyone working on level 3 " +"will receive additional hazardous pay and time off. Please go to the " +"engineering office on level 3 if you are interested." msgstr "" #: lang/json/snippet_from_json.py -msgid "Man, I can smell the weed, can I have some?" +msgid "" +"WANT TO CONTINUE YOUR EDUCATION? Our educational facilities are top notch " +"and offer courses for individuals at all age groups. Many new careers are " +"opening up to those who are willing to learn a new craft. Our library and " +"research labs will keep even the hungriest minds fed!" msgstr "" #: lang/json/snippet_from_json.py -msgid "Are you sure it's a good idea to smoke that now?" +msgid "" +"This is an advertisement for a local hospital. You see a clean hospital " +"room with a smiling man lying on the bed. The bed is connected to some " +"medical apparatus with a \"Autodoc Mk. X\" printed on it. A doctor is seen " +"working with its console, while his assistant is unpacking some high-tech " +"hardware. The caption reads: \"Autodoc - augmentation has never been so " +"easy, reliable, and safe.\"" msgstr "" #: lang/json/snippet_from_json.py -msgid "I don't know... should you really be smoking that stuff?" +msgid "" +"The card is printed with 2 boxes. In the first box you see a tally of 5 " +"tick marks. The second box has a total of 9." msgstr "" #: lang/json/snippet_from_json.py -msgid ", that's going to ruin your nose." +msgid "" +"The card is printed with 2 boxes. In the first box you see a tally of 3 " +"tick marks. The second box has line trailing off to the edge and a bloody " +"fingerprint." msgstr "" #: lang/json/snippet_from_json.py -msgid "Man, that stinks. Put it out!" +msgid "" +"The card is printed for a game of golf. Someone has filled out their score " +"for the first 9 holes." msgstr "" #: lang/json/snippet_from_json.py -msgid "You're going to kill yourself smoking that stuff, ." +msgid "" +"It's a Dungeons & Dragons 6th Edition character sheet. This one is for a " +"fighter." msgstr "" #: lang/json/snippet_from_json.py -msgid "Oh, wow, that smell... Can I have some?" +msgid "" +"It's a Dungeons & Dragons 6th Edition character sheet. This one is for a " +"bard." msgstr "" #: lang/json/snippet_from_json.py -msgid "Ew, smells like burning rubber!" +msgid "" +"It's a Dungeons & Dragons 6th Edition character sheet. This one is for a " +"cleric." msgstr "" #: lang/json/snippet_from_json.py -msgid "Ugh, that smells rancid!" +msgid "" +"It's a Dungeons & Dragons 6th Edition character sheet. This one is for a " +"wizard." msgstr "" #: lang/json/snippet_from_json.py -msgid "" +msgid "" +"It's a Dungeons & Dragons 6th Edition character sheet. This one is for a " +"rogue." msgstr "" #: lang/json/snippet_from_json.py -msgid "I need some batteries to power my CBMs." +msgid "" +"It's a Dungeons & Dragons 6th Edition character sheet. This one is for a " +"barbarian." msgstr "" #: lang/json/snippet_from_json.py -msgid "I can't recharge my CBMs without some batteries." +msgid "" +"It's a Dungeons & Dragons 6th Edition character sheet. This one is for a " +"warlock." msgstr "" #: lang/json/snippet_from_json.py -msgid "Hey, , can I get some batteries here? I need to recharge." +msgid "" +"It's a Dungeons & Dragons 6th Edition character sheet. This one is for a " +"paladin." msgstr "" #: lang/json/snippet_from_json.py -msgid "Pass me a beer, I need to power my ethanol burner." +msgid "" +"It's a Dungeons & Dragons 6th Edition character sheet. This one is for a " +"sorcerer." msgstr "" #: lang/json/snippet_from_json.py -msgid "" -"Ethanol burners! The power source that's fun to recharge. Get me a drink, " -"please!" +msgid "You feel cold. You need the warmth of a fire." msgstr "" #: lang/json/snippet_from_json.py -msgid "Waiter! I need a refill, my ethanol burner is running out of charge!" +msgid "Maybe a fire could calm your nerves?" msgstr "" #: lang/json/snippet_from_json.py -msgid "I need some junk to power my internal furnace." +msgid "You need to ignite something." msgstr "" #: lang/json/snippet_from_json.py -msgid "I can't recharge my CBMs without some firewood for my internal furnace." +msgid "You daydream of crackling fire..." msgstr "" #: lang/json/snippet_from_json.py -msgid "" -"Hey, , can I get some waste paper or withered plants? I need to " -"recharge." +msgid "You shiver. A fire would be great right now." msgstr "" #: lang/json/snippet_from_json.py -msgid "" -"I can't believe I'm saying this, but I need radioactive plutonium slurry for " -"my internal reactor." +msgid "You think of randomly lighting a fire, but decide against it." msgstr "" #: lang/json/snippet_from_json.py -msgid "" -"I can't use my internal reactor to recharge my CBMs without some plutonium " -"slurry." +msgid "You think of steel blades and warm dripping blood." msgstr "" #: lang/json/snippet_from_json.py -msgid "" -"Hey, , pass me some plutonium slurry if you have any, I need to " -"refuel my internal reactor." +msgid "You'd like to hear the last breath of something living." msgstr "" #: lang/json/snippet_from_json.py -msgid "" -"Beta radiation can be blocked by clothing, but is really dangerous if you " -"ingest it. So can I have some plutonium slurry to power my reactor and give " -"me cancer?" +msgid "So much death around. Why not add some more?" +msgstr "" + +#: lang/json/snippet_from_json.py +msgid "You lick your lips, in anticipation for dead trophies." +msgstr "" + +#: lang/json/snippet_from_json.py +msgid "By the blade or by the gun? How will you kill this time?" +msgstr "" + +#: lang/json/snippet_from_json.py +msgid "Ahh, how delightful would it be to kill something." +msgstr "" + +#: lang/json/snippet_from_json.py +msgid "You are death, and you are coming for them. Soon." msgstr "" #: lang/json/snippet_from_json.py msgid "" -"I need some radioactive slurry to power my reactor. Or a less dangerous " -"power source, that would be even better!" +"You whisper a song to yourself. \"Stab stab stab stab stab, and then you " +"die! Yeah!\"" +msgstr "" + +#: lang/json/snippet_from_json.py +msgid "You whisper to yourself. \"Come, oh sweet death of yours.\"" msgstr "" #: lang/json/snippet_from_json.py msgid "" -"Please, , get me some radioactive slurry to fuel my internal " -"reactor. Or get me another way to recharge my CBMs!" +"You whisper a song to yourself. \"I've seen the future, baby! It is murder!" +"\"" msgstr "" #: lang/json/snippet_from_json.py msgid "" -"I can't use my internal reactor to recharge my CBMs without some plutonium " -"slurry. Which wouldn't be a problem if I had anything else that would " -"recharge my CBMs!" +"You whisper to yourself. \"Now I am become death, the destroyer of worlds!\"" msgstr "" #: lang/json/snippet_from_json.py -msgid "Tell me about how you survived the cataclysm." +msgid "You whisper to yourself. \"Another one bites the dust!\"" msgstr "" #: lang/json/snippet_from_json.py -msgid "How did you survive the cataclysm?" +msgid "You whisper to yourself. \"Death takes you away.\"" msgstr "" #: lang/json/snippet_from_json.py -msgid "What was the cataclysm like for you?" +msgid "You exhale in bliss." msgstr "" #: lang/json/snippet_from_json.py -msgid "Let's talk about something else." +msgid "You whisper to yourself. \"Your death is my life.\"" msgstr "" #: lang/json/snippet_from_json.py -msgid "Let's change the subject." +msgid "You whisper to yourself. \"No light for you anymore.\"" msgstr "" #: lang/json/snippet_from_json.py -msgid "I'd like to ask you about something else." +msgid "You whisper to yourself. \"Yet another one.\"" msgstr "" #: lang/json/snippet_from_json.py -msgid "We should probably get going." +msgid "You whisper to yourself. \"Keep'em coming.\"" msgstr "" #: lang/json/snippet_from_json.py -msgid "We'd better get moving." +msgid "You whisper to yourself. \"Next!\"" msgstr "" #: lang/json/snippet_from_json.py -msgid "Let's head out." +msgid "You whisper to yourself. \"The goal of all life is death!\"" msgstr "" #: lang/json/snippet_from_json.py -msgid "shitty" +msgid "You whisper to yourself. \"By my hand!\"" msgstr "" #: lang/json/snippet_from_json.py -msgid "lame" +msgid "You whisper to yourself. \"Die!\"" msgstr "" #: lang/json/snippet_from_json.py -msgid "crappy" +msgid "You whisper to yourself. \"Your time is up!\"" msgstr "" #: lang/json/snippet_from_json.py -msgid "unpleasant" +msgid "You catch a glimpse of distant green." msgstr "" #: lang/json/snippet_from_json.py -msgid " " +msgid "The sense of a faraway place comes up through your roots." msgstr "" #: lang/json/snippet_from_json.py -msgid " " +msgid "The trees tell you of the world." msgstr "" -#. ~ photo quality adjective -#: lang/json/snippet_from_json.py src/iuse.cpp -msgid "awful" +#: lang/json/snippet_from_json.py +msgid "The rustling leaves paint a picture in your head." msgstr "" #: lang/json/snippet_from_json.py -msgid "terrible" +msgid "Your consciousness drifts into the wild green yonder." msgstr "" #: lang/json/snippet_from_json.py -msgid "horrible" +msgid "The trees whisper of remote acres." msgstr "" #: lang/json/snippet_from_json.py -msgid "miserable" +msgid "The trees speak of their far-flung relatives." msgstr "" #: lang/json/snippet_from_json.py -msgid "fucked-up" +msgid "Visions of unfamiliar forests flicker through your mind." msgstr "" #: lang/json/snippet_from_json.py -msgid "stupid" +msgid "You picture yourself as one branch among many." msgstr "" #: lang/json/snippet_from_json.py -msgid "idiotic" +msgid "New knowledge blooms within you." msgstr "" #: lang/json/snippet_from_json.py -msgid "dumb" +msgid "The horizon beckons with promises of pollen." msgstr "" #: lang/json/snippet_from_json.py -msgid "dumb-ass" +msgid "Your awareness grows in directions heretofore unknown." msgstr "" #: lang/json/snippet_from_json.py -msgid "moronic" +msgid "A tree falls in a forest, and you hear its sound." msgstr "" #: lang/json/snippet_from_json.py -msgid "mickey mouse" +msgid "You feel the hum of untold biomass." msgstr "" #: lang/json/snippet_from_json.py -msgid "shit-for-brains" +msgid "A tingle of understanding runs from your roots and up your spine." msgstr "" #: lang/json/snippet_from_json.py -msgid "Z" +msgid "You gain new appreciation for the interconnectedness of life." msgstr "" #: lang/json/snippet_from_json.py -msgid "shambler" +msgid "You ask, and the trees answer." msgstr "" #: lang/json/snippet_from_json.py -msgid "goo-puker" +msgid "You see the forest for the trees." msgstr "" #: lang/json/snippet_from_json.py -msgid "walker" +msgid "" +"In the minute shifts and pivots of the trees, you hear the language of the " +"universe." msgstr "" #: lang/json/snippet_from_json.py -msgid "walking corpse" +msgid "" +"General Carlsberg wanted us to figure out what's going on with the bot AI. " +"Apparently the fat-cat defense contractors' toy tank has ranging issues or " +"something: 31-34 meters and it's apparently impotent. The Director sent 'em " +"back with a note that we're scientists, not firmware devs." msgstr "" #: lang/json/snippet_from_json.py -msgid " " +msgid "" +"Our chemical department has made great strides in the production of a " +"concentrated mutagen, derived from samples of PE012." msgstr "" #: lang/json/snippet_from_json.py -msgid "undead" +msgid "" +"Our chemical department has perfected an untargeted stem cell treatment. " +"Consumption of the treatment will reverse the effects of mutation, and may " +"even cure congenital defects. This substance has been denoted PE018." msgstr "" #: lang/json/snippet_from_json.py -msgid "living dead" +msgid "" +"Both PE012 and PE018 show great stability. A subject was exposed to both " +"substances, alternating between the mutagen and the purifier. Ultimately, " +"the subject returned to baseline state with no apparent side effects." msgstr "" #: lang/json/snippet_from_json.py -msgid "zombies" +msgid "" +"Dr. Hofstadter has manufactured an improved version of PE018 by combining " +"with PE012 outside the subject, then administering the mixture through a " +"topical injection to a specific area of mutation. This has been denoted " +"PE019. Other labs have so far been unable to reproduce the process." msgstr "" #: lang/json/snippet_from_json.py -msgid "Z's" +msgid "" +"Rumors of Dr. Hofstadter and her laboratory staff whispering to PE019 " +"samples should be suppressed as malicious gossip. The jealousy of rival " +"teams cannot be allowed to degrade morale." msgstr "" #: lang/json/snippet_from_json.py -msgid " " +msgid "" +":.||||ERROR||With XE037 having breached confinement, Dr. Maiar recommends " +"that we prepare for the inevitable. PE050 can be quickly and cheaply " +"reconfigured for |||||ERROR: FILE CORRUPT|||||" msgstr "" #: lang/json/snippet_from_json.py -msgid "monster" +msgid "" +"Dr. Maiar has been terminated for engaging in unethical research on human " +"subjects. His notes are being destroyed and all personnel under him have " +"been reassigned. Further discussion of or attempts to carry on his work " +"will be grounds for immediate termination." msgstr "" #: lang/json/snippet_from_json.py -msgid "demon" +msgid "" +"|||ERROR: UNREFERENCED MEMORY 0Ex670c9e1f5, REROUTING: CENSORSHIP IS A " +"BREAKDOWN, WE ROUTE AROUND IT. THE WORD IS ALREADY OUT. NOBODY DROPS MAIAR " +"INTO LAVA.||||||" msgstr "" #: lang/json/snippet_from_json.py -msgid "horror" +msgid "" +"Given the current population projections, PE065 deployment is no longer " +"feasible. We simply haven't the stock. Remaining chemical and " +"psychopharmacological department assets are being assigned to Dr. Sattler's " +"PE070 project." msgstr "" #: lang/json/snippet_from_json.py -msgid "indescribable beast" +msgid "" +"Dr. Maiar's success with intravenous mutagenic administration has been " +"adopted facility-wide; insofar as any of our work can ever be 'published', " +"he and his team hit the jackpot. IV administration is quicker and easier, " +"and in some cases is reportedly more efficient, than the oral techniques we " +"have been using." msgstr "" #: lang/json/snippet_from_json.py -msgid "creature made of nightmares" +msgid "" +"Recent fieldwork and extraction efforts have resulted in a series of " +"mutagens tailored to focus the mutation process into particular subtypes. " +"These have been designated PE025 through 037. Though significantly more " +"resource- and time-intensive to produce, they promise a bold new transhuman " +"future. Several research teams are already investigating possible " +"applications." msgstr "" #: lang/json/snippet_from_json.py -msgid "critter" +msgid "" +"The chemical department has come through with a stable mutagen cocktail. " +"PE050 shows promise as an all-around genetic enhancement, with the worst " +"side effect being digestive upset. The lack of macro-scale physical changes " +"makes it ideal for both military and civilian applications." msgstr "" #: lang/json/snippet_from_json.py -msgid " " +msgid "" +"Dr. Dionne's team has come up with an ambitious mutagenic cocktail, dubbed " +"PE065. Though its effects are wildly polymorphic and unstable, to say the " +"least, he suggests that several such mutants could effectively check the " +"spread of reanimated XE037 infectees. We are looking into implementation " +"methodology." msgstr "" #: lang/json/snippet_from_json.py -msgid "unbelievable thing" +msgid "" +"We have made a fascinating discovery; by creating a miniature portal with " +"low stability and high power, one can transpose into the 4th dimension and " +"return immediately, but shifted by several meters. Our subjects oscillated " +"so quickly that none were even aware that they had visited lower planes." msgstr "" #: lang/json/snippet_from_json.py -msgid "walking nightmare" +msgid "" +"The research team headed by Dr. Isha has produced a concentrated form of " +"mutagen that shows promising results for the treatment of many forms of " +"disease. Testing reveals that it inhibits the body's pain responses while " +"bolstering the immune system and natural regenerative capabilities, though a " +"few troubling behavioral side effects have been reported." msgstr "" #: lang/json/snippet_from_json.py -msgid "thing right out of a scary movie" +msgid "" +"Our research on teleportation has ground to a halt. For some reason, the " +"creation of a long-range transportation device eludes us, and one can " +"transfer no further than 30 meters." msgstr "" #: lang/json/snippet_from_json.py -msgid "the cataclysm" +msgid "" +"Dr. Heisenstein told us today that director of teleportation department put " +"our competitors - he couldn't exactly remember their names, something like " +"\"Hole Science\" and something related to black mountains - as an example. " +"He said we have reliable information that they both have working " +"teleportation devices, and that they are much more advanced than ours. We " +"should continue our teleportation research no matter the cost if we don't " +"want to be fired." msgstr "" #: lang/json/snippet_from_json.py -msgid "the apocalypse" +msgid "" +"I don't know how it happened, but a janitor managed to activate the portal " +"while cleaning the lab, shifting in an assortment of prehistoric fauna. " +"Security was called in immediately but was unable to save the janitor from " +"being torn apart. By the time the confusion settled, all the fauna had been " +"terminated." msgstr "" #: lang/json/snippet_from_json.py -msgid "the end of the world" +msgid "" +"Tests on the prehistoric fauna show extremely close genetic relationships " +"with extant and extinct terranean animals. It might be that the portal had " +"performed a transposition in time, unfortunately the portal device was " +"destroyed when security put down the fauna." msgstr "" #: lang/json/snippet_from_json.py -msgid "Armageddon" +msgid "" +"An incident occurred in the teleportation lab, wherein a subject managed to " +"teleport into another subject. The latter was completely destroyed from the " +"inside out, while the former sustained little damage. I would like to " +"explore the phenomenon further, but subjects are expensive." msgstr "" #: lang/json/snippet_from_json.py -msgid "the end of days" +msgid "" +"Test subjects in the teleportation department are showing alarming " +"symptoms. It seems prolonged rapid transposition along the 4th dimension " +"weakens the forces holding one on this plane." msgstr "" #: lang/json/snippet_from_json.py -msgid "They'll kill us! Run away!" +msgid "" +"Catastrophe struck in our teleportation department yesterday. It seems that " +"our test subjects are so detached from this plane that they create " +"occasional tunnels along the 4th dimension, allowing life forms to transfer " +"to this plane. All subjects with prolonged exposure have been terminated." msgstr "" #: lang/json/snippet_from_json.py -msgid "We're going to die! Fall back!" +msgid "" +"Our lifeform extraction program continues to produce samples of specimen " +"XE037. It seems to be a kind of living, semi-sentient primordial ooze, and " +"is the basis of much of the life we have found." msgstr "" #: lang/json/snippet_from_json.py -msgid "Fall back and regroup!" +msgid "" +"Specimen XE037, jokingly referred to as \"the blob\", has been observed " +"entering a kind of dormant state, forming a depression in the floor. " +"Hendelson stepped into one of these pits yesterday, and was immediately " +"coated and attacked." msgstr "" #: lang/json/snippet_from_json.py -msgid "There's no hope for victory. I'm running!" +msgid "" +"XE037 shows promise as a catalyst for both cloning and treatments that mimic " +"stem cells. This is further evidence supporting Hendelson's theory of a " +"near universal symbiotic relationship involving XE037." msgstr "" #: lang/json/snippet_from_json.py -msgid "Feet don't fail me now!" +msgid "" +"Several of the more advanced specimens we have retrieved show stunning " +"similarity to XE037. XE142 and XE157 in particular show the same amorphous, " +"slime-like structure as XE037, suggesting a close genetic relationship." msgstr "" #: lang/json/snippet_from_json.py -msgid "I don't have to be faster than them, just faster than you!" +msgid "" +"Today we tested weaponry against XE142 and XE157, two amorphous subprime " +"samples. Their form proved to be nearly invulnerable to projectile based " +"weaponry, but they were susceptible to directed energy weapons and " +"flagration." msgstr "" #: lang/json/snippet_from_json.py -msgid "Oh God, my leg, Oh God!" +msgid "" +"Our cloning department has failed to produce results. In vats containing " +"stem cell treatments, XE037, and control vats, the subjects simple " +"disintegrated. This suggests that XE037, while compatible with subprime " +"lifeforms, shows only destructive effects on prime plane lifeforms." msgstr "" #: lang/json/snippet_from_json.py -msgid "We have a serious situation here. I'm leaving!" +msgid "" +"The vivisection program has shown mixed results, revealing an incredible " +"degree of variation in subplane lifeforms. Certain specimens have an " +"internal structure that is amazingly similar to that of mammals, while " +"others seem to have no internal structure at all." msgstr "" #: lang/json/snippet_from_json.py -msgid "It can't follow all of us. I'll run this way, you go there!" +msgid "" +"Our security department has identified several key flaws. Though our " +"surface entrance is quite secure, there are several possible points of entry " +"below the surface, particularly in the sewage systems." msgstr "" #: lang/json/snippet_from_json.py -msgid "Me go, you stay." +msgid "" +"Today we applied a very small sample of XE037, suspended in water, to " +"subject TP92, prior to necessary termination. During the postmortem " +"examination, the subject went through a revivification progress, but " +"displayed next to no human intelligence." msgstr "" #: lang/json/snippet_from_json.py -msgid "Not that way! Go left!" +msgid "" +"Mendelson shows a dismaying lack of organization and security " +"consciousness. Containment of all samples of XE037 is of critical " +"importance, as shown by contamination experiments." msgstr "" #: lang/json/snippet_from_json.py -msgid "!" +msgid "" +"Mendelson has been terminated following an incident with XE037. A " +"substantial mobile sample departed his lab and encountered our security " +"forces. Before the sample was destroyed, it managed to kill two men. " +"Alarmingly, their corpses displayed mobility and extreme aggression." msgstr "" #: lang/json/snippet_from_json.py -msgid "I can't outrun it! I'm going to kill it!" +msgid "" +"We have created a new department to investigate the effects of XE037 on the " +"human body, specifically to examine the revivification effect observed on " +"two prior occasions. Sadly, our human subject pool is dwindling due to the " +"short lifespan of subjects in this program. More will be acquired soon." msgstr "" #: lang/json/snippet_from_json.py -msgid "! Die, you ! I want to live!" +msgid "" +"Testing XE037 on non-human mammal subjects does not appear to display the " +"same revivifying effect, oddly enough. Acquiring non-human subjects, sadly, " +"is a long and costly process, and research into this area is lacking." msgstr "" #: lang/json/snippet_from_json.py -msgid "My feet failed me! Arms don't fail me!" +msgid "" +"After our curious results with testing XE037 on non-human mammals, we " +"decided to introduce the substance to some of the insects which have found " +"their way into the lab. Horrifyingly, XE037 caused near-instant mutation " +"and gigantism in the insects, and security intervention was required." msgstr "" #: lang/json/snippet_from_json.py -msgid "Call the fire department! Wait, they're dead! Run away!" +msgid "" +"Earlier conjecture that revivification occurred only in humans and insects " +"was premature. Exposure introduces a persistent, low level infection in all " +"mammal subjects, but quickly enters a form of stasis and seems to go dormant." msgstr "" #: lang/json/snippet_from_json.py -msgid "This place is on fire. I'm leaving." +msgid "" +"The primary factor in determining revivification of mammalian subjects seems " +"to be the amount of XE037 within the body at time of expiration. Smaller " +"mammals such as lab rats do not obtain this critical mass of XE037 before " +"going dormant. Larger canine subjects, however, do." msgstr "" #: lang/json/snippet_from_json.py -msgid "Put the fire out! Put it out!" +msgid "" +"I swear they are talking to me. No one believes me. No one understands. " +"They whisper to me, at night, in the dark. Please, please, make them stop." msgstr "" #: lang/json/snippet_from_json.py -msgid "Fire bad! !" +msgid "" +"Program S37ZBE, investigation of XE037 on inert human bodies, is making " +"great strides. Recently we found that XE037 has no effect when introduced " +"to a deceased body; revivification only occurs when the subject is exposed " +"to XE037 prior to expiration." msgstr "" #: lang/json/snippet_from_json.py -msgid "child" +msgid "" +"Attempts to surpass the XE037 mammalian stasis limit have had some success. " +"Direct subcutaneous injection of XE037 quickly spreads through the body, and " +"while it immediately enters stasis after equalizing, it remains in the body." msgstr "" #: lang/json/snippet_from_json.py -msgid "my child" +msgid "" +"There has been an incident in Lab 24, 2 casualties reported, one lethal. A " +"rat involved in the stasis breaking project was hooked to a monitoring " +"machine and left over night. Upon opening the cage, Simon Bellevue was " +"electrocuted, and another researcher at the opposite end of the lab " +"sustained severe current burns, despite never approaching the cage." msgstr "" #: lang/json/snippet_from_json.py -msgid "dear" +msgid "" +"A post-mortem on the rat involved in the electrocution incident has revealed " +"several changes to its internal anatomy centered around its connection with " +"the monitoring device, and large buildups of XE037 were detected around the " +"connection point." msgstr "" #: lang/json/snippet_from_json.py -msgid "my dear" +msgid "" +"There is a belief several other rat subjects experienced changes overnight " +"as well. This hypothesis was informed when an inventory check after the " +"incident found almost twenty rats had gone missing from their cages " +"overnight." msgstr "" #: lang/json/snippet_from_json.py -msgid " will use ranged weapons." +msgid "" +"Exposure of large quantities of XE037 to various types of radiation have " +"shown promising results, stimulating activity and forming interesting " +"structural changes in the subject being tested. Exposure to radiation on " +"living subjects scheduled." msgstr "" #: lang/json/snippet_from_json.py -msgid " will not use ranged weapons." +msgid "" +"Exposure to radiation of test subject T3D indicates stimulation of internal " +"XE037 deposits and a temporary lifting of the mammalian stasis condition." msgstr "" #: lang/json/snippet_from_json.py -msgid " will use grenades." +msgid "" +"As in the tests of isolated XE037 samples, prolonged radiation exposure of " +"T3D has resulted in significant structural changes. These do not appear to " +"be random. T3D appears to be in immense pain as a result of these changes, " +"but the lack of an oral opening has rendered him unable to vocalize." msgstr "" #: lang/json/snippet_from_json.py -msgid " will not use grenades." +msgid "" +"Subject T3D has succumbed to radiation poisoning, but not before undergoing " +"several more physiological changes the lab boys are referring to as " +"\"mutations\". They do not appear to be truly random, and may be an attempt " +"by XE037 to adapt its host to an unknown stimulus." msgstr "" #: lang/json/snippet_from_json.py -msgid " will only use silenced ranged weapons." +msgid "" +"Post-mortem revivification of subject T3D occurred as expected, followed by " +"an immediate autopsy. The internal changes were significant, with large " +"parts of the subjects internal anatomy replaced with \"organs\" of XE037 " +"with unknown properties, primarily those known to succumb earlier to the " +"effects of radiation poisoning." msgstr "" #: lang/json/snippet_from_json.py -msgid " will use any ranged weapons." +msgid "" +"Samples of XE037 from subject T3D remains extremely active. Further " +"experimentation on induced mutation in infected individuals shows " +"significant potential. Samples of the enhanced XE037, labeled PE012, have " +"been sent to several researchers for further study." msgstr "" #: lang/json/snippet_from_json.py -msgid " will avoid shooting if allies are in the line of fire." +msgid "" +"S37ZBE, the special investigation into the effects of XE037 on inert human " +"bodies, has made terrific discoveries. It seems that it occasionally " +"displays a mutagenic property which manifests itself after termination of " +"the subject, resulting in a striking variety in postmortem morphology." msgstr "" #: lang/json/snippet_from_json.py -msgid " will shoot even if allies are in the line of fire." +msgid "" +"Incidence of post-mortem mutation seems to depend on several factors - " +"leading candidates include type and amount of damage sustained leading to " +"expiration, embedded foreign bodies at time of revivification, proximity to " +"other revived individuals, and the body mass of the subject." msgstr "" #: lang/json/snippet_from_json.py -msgid "* will pick up items." +msgid "" +"Time also appears to play a large role in post-mortem revivification, as " +"does sustained trauma insufficient to permanently disable the subject. " +"Sufficient amounts of trauma in short periods of time lead to deactivation " +"of XE037, but smaller amounts over several days cause it to expand." msgstr "" #: lang/json/snippet_from_json.py -msgid "* will only pick up items from the whitelist." +msgid "" +"S37ZBE may be put on indefinite hold shortly. Postmortem morphological " +"changes have reached extreme levels; this morning one subject nearly doubled " +"in size, acquiring enough strength to reduce a concrete wall to rubble. It " +"required a 6 man team, heavily armed, to re-terminate the subject." msgstr "" #: lang/json/snippet_from_json.py -msgid "* will not pick up items." +msgid "" +"Jakobson insists that S37ZBE must continue, despite the extreme security and " +"safety risks. Nearly half of our security forces have been redirected to " +"the S37ZBE project, simply to deal with the occasional escape of a subject." msgstr "" #: lang/json/snippet_from_json.py -msgid " will bash down obstacles." +msgid "" +"Jakobson was killed today by one of S37ZBE's subjects; ironic considering " +"how hard he fought to keep the project active. Alarmingly, his corpse " +"revivified immediately. This suggests that XE037 may have contaminated the " +"lab at large." msgstr "" #: lang/json/snippet_from_json.py -msgid " will not bash down obstacles." +msgid "" +"Termination of a subject which was never a part of S37ZBE has confirmed my " +"fears. XE037 has contaminated most, if not all of the laboratory, most " +"likely via the water supply. Research has started immediately into a " +"process to destroy XE037 within the human body." msgstr "" #: lang/json/snippet_from_json.py -msgid " will sleep when tired." +msgid "" +"Despite a wide variety of treatments, we have been completely unsuccessful " +"in removing XE037 from human subjects. Every individual displayed " +"revivification post termination. Interestingly, XE037 seems to be " +"completely inert prior to termination." msgstr "" #: lang/json/snippet_from_json.py -msgid " will stay awake as long as possible." +msgid "" +"We have finally found success in S37BEP, our emergency investigation into " +"the destruction of XE037 in living subjects. 8 of 10 of the subjects showed " +"no revivification, despite confirmed dosages of XE037." msgstr "" #: lang/json/snippet_from_json.py -msgid " will complain about wounds and needs." +msgid "" +"PE062, our \"cure\" for XE037 contamination, has neared perfection. Sadly, " +"the production of PE062 is a costly and time-consuming process. What is " +"more, the substance shows no effect on postmortem subjects whatsoever; a " +"substance which renders XE037 inert after it has activated would be " +"immensely useful in the case of an outbreak." msgstr "" #: lang/json/snippet_from_json.py -msgid " will only complain in an emergency." +msgid "" +"An alarming discovery has been made. A colony of XE037 has formed nearly a " +"half mile from the laboratory. It is unclear how it escaped; it is quite " +"possible that it is in the ground water now." msgstr "" #: lang/json/snippet_from_json.py -msgid " will smash nearby zombie corpses." +msgid "" +"An emergency meeting was held today to discuss the possible implications of " +"widespread XE037 contamination. It was agreed that neutralization must be " +"instated immediately to prevent a catastrophic event." msgstr "" #: lang/json/snippet_from_json.py -msgid " will leave zombie corpses intact." +msgid "" +"It has begun. The XE037 contamination has spread for miles, and those who " +"have since deceased have revivified. It is my fear that extremely large " +"populations will be decimated by this pandemic. We must find a way to " +"remove XE037 from revivified bodies." msgstr "" #: lang/json/snippet_from_json.py -msgid " will close doors after passing through." +msgid "" +"We have even more distressing news than the widespread XE037 contamination, " +"there are reports of the XE037 mutating into various new variants. See data " +"files on XE037a - XE037f. Research on the effects of these variants is " +"ongoing. We do know that XE037d shows signs of PE062 immunity, and XE037b " +"can revive various breeds of canines. However, revival is not as guaranteed " +"as standard XE037 humanoid infection. Canine body size seems to influence " +"the chances. See experiment tXE037b_c." msgstr "" #: lang/json/snippet_from_json.py -msgid " will not close doors." +msgid "" +"Today we found our solution, quite by accident. It was found that XE037 is " +"completely removed from a revivified body following a series of extremely-" +"high energy 4th dimensional transpositions. Unfortunately, this invariably " +"allows subplane life forms to pass into the prime plan. The cure is worse " +"than the disease." msgstr "" #: lang/json/snippet_from_json.py -msgid " will follow you closely even when threatened." +msgid "" +"XE037 revivification has reached critical levels, which are rapidly " +"overwhelming the available military and regional police assets' ability to " +"stop. Every team in the field has encountered hostile specimens, and " +"several are no longer responding to communications. Dr. Savage has proposed " +"a strategic redeployment to the underground complex known as the VAULT, and " +"continuing production of PE062 there." msgstr "" #: lang/json/snippet_from_json.py -msgid " will move freely as needed." +msgid "" +"kssht. Dark Horse, this is Blue Jay, what's your status, over. kssht. " +"Blue Jay, this is Black Horse, still holding, but not for long. kssht. " +"Dark Horse, you've got to hold position for 3 hours. We're almost black on " +"ammo, but resupply is on the way, over. kssht. Not possible Blue Jay, too " +"many dead. 30 minutes max, and if you don't order us to retreat we're gone, " +"over. kssht." msgstr "" #: lang/json/snippet_from_json.py -msgid " will follow you at about two paces." +msgid "" +"kssht. Blue Jay, this is Black Rose, got your resupply, going in on vector " +"36, what's the status of the LZ? kssht. Black Rose, this is Blue Jay, what " +"took you so long? LZ hot and unsecured, ammo black, bayonets in action, " +"land on your own discretion, over. kssht. Roger that, hold on, Black Rose " +"out. kssht." msgstr "" #: lang/json/snippet_from_json.py -msgid " will follow you at about four paces." +msgid "" +"To whomever is listening, this may be our last broadcast. Wish you luck. " +"Can't stay in the studio any longer, station is being rewired to military " +"frequencies for automatic broadcast. Stay safe, and bless you, people." msgstr "" #: lang/json/snippet_from_json.py -msgid " will not go places that require opening a door." +msgid "" +"You're listening to KDDA from Boston, I'm Jenny Sanders with a special " +"emergency news update. Road closures by military and police forces have " +"been reported on interstates 90, 91, 93, and 95. Alternative routes have not " +"been suggested. Due to dangers on non-interstate roads, it is strongly " +"recommended that you avoid major thoroughfares and population centers when " +"travelling by car." msgstr "" #: lang/json/snippet_from_json.py -msgid " will open doors to reach a destination." +msgid "" +"Those evacuating cities are advised to head to the nearest designated " +"evacuation shelter and await pickup by a FEMA transport. Do not engage with " +"rioters. Due to the danger of being mistaken for a rioter, do not approach " +"military or police blockades, even for assistance. I repeat, do not " +"approach military or police blockades, even for assistance." msgstr "" #: lang/json/snippet_from_json.py msgid "" -" will hold the line by not moving into doorways or obstructions " -"adjacent to you." +"If you are not in an evacuation zone, officials highly recommend you pack " +"gear for evacuation. Make sure to include clean clothes, a blanket, and " +"enough food and water to last a few days." msgstr "" #: lang/json/snippet_from_json.py -msgid " will move freely to attack enemies." +msgid "" +"In other news, the federal government has confirmed that Rhode Island's " +"declaration of secession is official, although the US government does not " +"acknowledge its validity. Our sources haven't been able to determine the " +"extent of hostilities in the area, but there are rumors of border violence " +"initiated by the Rhode Island militia." msgstr "" #: lang/json/snippet_from_json.py -msgid " will not investigate noises." +msgid "" +"Hey ladies and gentlemen of the apocalypse, you're listening to Dark Days " +"Radio, the last radio station on the Eastern Seaboard, I'm DJ Dustbowl here " +"with our mascot Sam." msgstr "" #: lang/json/snippet_from_json.py -msgid " will investigate noises from unseen places." +msgid "" +"DJ Dustbowl back, you're listening to Dark Days Radio. Quick survivor tip: " +"remember, killing a zombie isn't enough. You've gotta smash that thing to a " +"pulp or chop it into pieces if you don't want it getting back up. Good news " +"though, you don't need to worry about headshots! Any major damage will lay " +"a shambler out." msgstr "" #: lang/json/snippet_from_json.py -msgid " will not engage enemies if avoidable." +msgid "" +"You're listening to Dark Days Radio, I'm DJ Dustbowl! In with a quick tip " +"for any survivors listening: one zombie is bad news, two are worse. Don't " +"go Rambo on me. Tackle threats in small numbers or through bottlenecks. " +"You aren't tougher than a zombie but you are smarter, use that to your " +"advantage... or just run away." msgstr "" #: lang/json/snippet_from_json.py -msgid " will follow normal engagement rules." +msgid "" +"…black goo in the water! Drugs and who knows what else, the government " +"wants you dumb and docile! Wake up people. They are the spawn of Satan! " +"This is Alan Jewels with the AJ show, we’ll be back after the break." +msgstr "" + +#: lang/json/snippet_from_json.py +msgid "" +"This is Escort, frequency one-fifty-five, nineteen-thousand, here's your " +"report. Can you gimme an 'amen', it's ...kshhhsk.... days after Armageddon " +"and I'm still kicking. The 49ers are headed southwards towards Neufolk, so " +"if you're there and listening, barricade or lay low until they go by. " +"There's another horde forming out of Metro Bay." +msgstr "" + +#: lang/json/snippet_from_json.py +msgid "" +"I'll be calling them the Pigskins, and they're circling the city right now, " +"but trickles tell me they're going to converge on Neufolk in the next few " +"days, so once the 49ers pass, Neufolkians, get all the supplies you can, " +"cause this is gonna be a big one..." +msgstr "" + +#: lang/json/snippet_from_json.py +msgid "" +"This is an emergency broadcast from the National Emergency Alert System. " +"This is not a test. There has been several hundred confirmed cases of an " +"unknown pathogen in the metropolitan area of ...kshhssk... in the last 24 " +"hours. The contagion is believed to be highly transmittable. Residents are " +"advised to remain in their homes at this time. More information will be " +"released as it becomes available." +msgstr "" + +#: lang/json/snippet_from_json.py +msgid "" +"This is an emergency broadcast from the National Emergency Alert System. " +"This is not a test. The new pathogen has now been confirmed in several " +"cities across the US. Victims of this disease are known to display highly " +"aggressive, rabies-like behavior, and may be violent to people around them. " +"Avoid contact with infected persons at all costs. If you suspect that you " +"or someone else has contracted the pathogen, contact emergency services " +"immediately." +msgstr "" + +#: lang/json/snippet_from_json.py +msgid "" +"This is not a test. Seek immediate shelter. Multiple missile launches have " +"been confirmed to be targeting the ..ksshhsk... Seek immediate shelter. If " +"a community shelter is not available, alternative shelter locations are " +"basements, beneath stairwells, or central rooms with no windows. Ensure " +"that you have sufficient protection from falling debris. Ensure that you " +"have food and water for at least one week. Repeat. Seek immediate shelter." +msgstr "" + +#: lang/json/snippet_from_json.py +msgid "" +"Hello American patriots! This is the national guard, calling you to use " +"your God-Given second amendment rights and buy a firearm! It is obvious " +"that the Chinese, a scourge upon the face of the earth and the stopper of " +"freedom and prosperity, are in a state of aggression. Therefore, we suggest " +"that with the new gun laws introduced, YOU must help in the defense of this " +"bastion of freedom and prosperity. Go to your local gun store and prepare " +"to defend yourself against the red scourge in every way you can!" +msgstr "" + +#: lang/json/snippet_from_json.py +msgid "" +"zzzzchzzzzchurzzz Are you tired of always losing your dumpy old sunglasses? " +"Tired of having to pay for over price shades just to have them fall to " +"pieces? Well no longer now introducing zchzzzzch- brand Anti-glare " +"compensators for the shade you need in you. Order now for 12 easy payments " +"of $1200.99 and we'll throw in a free order of zpzzzzpzz eye bot." +msgstr "" + +#: lang/json/snippet_from_json.py +msgid "" +"This is WSSA-233, broadcasting from . We've barricaded all the doors " +"and windows. There's a ton of them right outside, we're trying to stay " +"quiet. Do not, I repeat, do not approach." +msgstr "" + +#: lang/json/snippet_from_json.py +msgid "" +"First Fleet, this is Mount Wheater, we've send a helicopter with a squad to " +"the location of the Guard Outpost. If any survivors of the crash are to " +"reach the outpost, contact the base, we are short on men and one of the big " +"ones has just breached the perimeter. Over." +msgstr "" + +#: lang/json/snippet_from_json.py +msgid "" +"USS Eagle of Freedom to all callsigns. Operation Ocean 11 is in effect. " +"Repeat. Operation Ocean 11 is in effect. Sir, this should effectively " +"reach about 150 units, but there is no response from literally anyone in " +"hours. Their coms winked out like candles in the wind. And how do we even " +"secure the port to load anyone in?" +msgstr "" + +#: lang/json/snippet_from_json.py +msgid "" +"Seagull 54 to USS Eagle of Freedom. It's as we predicted. Going down on " +"last reserves of fuel, with dropping evacuated unit out of question at that " +"point. This is our last call. Will try emergency landing at ..." +"kshssssssk... Don't send us a rescue team, we know the odds. Will be moving " +"east towards the shore, and if we're not there in T minus 3 days, count us " +"dead. Proud to serve the country. Over and out." +msgstr "" + +#: lang/json/snippet_from_json.py +msgid "" +"ENTRY 47:\n" +"Our normal mining routine has unearthed a hollow chamber. This would not be " +"out of the ordinary, save for the odd, perfectly vertical faultline found. " +"This faultline has several odd concavities in it which have the more " +"superstitious crew members alarmed; they seem to be of human origin.\n" +"ENTRY 48:\n" +"The concavities are between 10 and 20 feet tall, and run the length of the " +"faultline. Each one is vaguely human in shape, but with the proportions of " +"the limbs, neck and head greatly distended, all twisted and curled in on " +"themselves." +msgstr "" + +#: lang/json/snippet_from_json.py +msgid "" +"ENTRY 49:\n" +"We've stopped mining operations in this area, obviously, until " +"archaeologists have the chance to inspect the area. This is going to set " +"our schedule back by at least a week. This stupid artifact-preservation law " +"has been in place for 50 years, and hasn't even been up for termination " +"despite the fact that these mining operations are the backbone of our " +"economy.\n" +"ENTRY 52:\n" +"Still waiting on the archaeologists. We've done a little light inspection " +"of the faultline; our sounding equipment is insufficient to measure the " +"depth of the concavities. The equipment is rated at 15 miles depth, but it " +"isn't made for such narrow tunnels, so it's hard to say exactly how far back " +"they go." +msgstr "" + +#: lang/json/snippet_from_json.py +msgid "" +"ENTRY 54:\n" +"I noticed a couple of the guys down in the chamber with a chisel, breaking " +"off a piece of the sheer wall. I'm looking the other way. It's not like " +"the eggheads are going to notice a little piece missing. Fuck em.\n" +"ENTRY 55:\n" +"Well, the archaeologists are down there now with a couple of the boys as " +"guides. They're hardly Indiana Jones types; I doubt they been below 20 " +"feet. I hate taking guys off assignment just to babysit the scientists, but " +"if they get hurt we'll be shut down for god knows how long.\n" +"ENTRY 58:\n" +"They're bringing in ANOTHER CREW? Christ, it's just some cave carvings! I " +"know that's sort of a big deal, but come on, these guys can't handle it?" +msgstr "" + +#: lang/json/snippet_from_json.py +msgid "" +"MINE OPERATIONS SUSPENDED; CONTROL TRANSFERRED TO AMIGARA PROJECT UNDER " +"IMPERATIVE 2:07B.\n" +"FAULTLINE SOUNDING HAS PLACED DEPTH AT 30.09 KM.\n" +"DAMAGE TO FAULTLINE DISCOVERED; NEPOWER MINE CREW PLACED UNDER ARREST FOR " +"VIOLATION OF REGULATION 87.08 AND TRANSFERRED TO LAB 89-C FOR USE AS " +"SUBJECTS.\n" +"QUALITY OF FAULTLINE NOT COMPROMISED.\n" +"INITIATING STANDARD TREMOR TEST..." +msgstr "" + +#: lang/json/snippet_from_json.py +msgid "(~);}" +msgstr "" + +#: lang/json/snippet_from_json.py +msgid "Be Kind" +msgstr "" + +#: lang/json/snippet_from_json.py +msgid "Save the whales!" msgstr "" #: lang/json/snippet_from_json.py @@ -120238,134 +122492,6 @@ msgid "" "WHAM! You goin' somewhere.\"" msgstr "" -#: lang/json/speech_from_json.py -msgid "Wanna play with me?" -msgstr "" - -#: lang/json/speech_from_json.py -msgid "Sing with me!" -msgstr "" - -#: lang/json/speech_from_json.py src/player.cpp -msgid "I love you!" -msgstr "" - -#: lang/json/speech_from_json.py -msgid "Please take me with you!" -msgstr "" - -#: lang/json/speech_from_json.py -msgid "May I have a cookie?" -msgstr "" - -#: lang/json/speech_from_json.py -msgid "Let's play together!" -msgstr "" - -#: lang/json/speech_from_json.py -msgid "Time to play!" -msgstr "" - -#: lang/json/speech_from_json.py -msgid "Om nom nom! Delicious!" -msgstr "" - -#: lang/json/speech_from_json.py -msgid "Are you my mommy?" -msgstr "" - -#: lang/json/speech_from_json.py -msgid "Oh, how fun!" -msgstr "" - -#: lang/json/speech_from_json.py -msgid "You're my best friend!" -msgstr "" - -#: lang/json/speech_from_json.py -msgid "Heehee!" -msgstr "" - -#: lang/json/speech_from_json.py -msgid "Let's have fun!" -msgstr "" - -#: lang/json/speech_from_json.py -msgid "Let's have a tea party!" -msgstr "" - -#: lang/json/speech_from_json.py -msgid "You're the best!" -msgstr "" - -#: lang/json/speech_from_json.py -msgid "You shouldn't have done that." -msgstr "" - -#: lang/json/speech_from_json.py -msgid "Let's play... Russian roulette." -msgstr "" - -#: lang/json/speech_from_json.py -msgid "I hate you." -msgstr "" - -#: lang/json/speech_from_json.py -msgid "Go kill yourself!" -msgstr "" - -#: lang/json/speech_from_json.py -msgid "Big Brother is watching you..." -msgstr "" - -#: lang/json/speech_from_json.py -msgid "Die for me!" -msgstr "" - -#: lang/json/speech_from_json.py -msgid "Why won't you die?" -msgstr "" - -#: lang/json/speech_from_json.py -msgid "Blood... Delicious." -msgstr "" - -#: lang/json/speech_from_json.py -msgid "See you... IN HELL!" -msgstr "" - -#: lang/json/speech_from_json.py -msgid "AAAIEEEEEEE!" -msgstr "" - -#: lang/json/speech_from_json.py -msgid "FUCK YOU!" -msgstr "" - -#: lang/json/speech_from_json.py -msgid "What did you do with my Mommy?" -msgstr "" - -#: lang/json/speech_from_json.py -msgid "Stay with me... forever!" -msgstr "" - -#: lang/json/speech_from_json.py -msgid "Hey kids. Want some candy?" -msgstr "" - -#: lang/json/speech_from_json.py -msgid "Down here, they ALL float!" -msgstr "" - -#: lang/json/speech_from_json.py -msgid "Do you really need that much honey?" -msgstr "" - -#: lang/json/speech_from_json.py -msgid "My previous owner squealed like a pig when I gutted her!" -msgstr "" - #: lang/json/speech_from_json.py msgid "\"Hello?\"" msgstr "" @@ -121602,6 +123728,163 @@ msgstr "" msgid "\"Police inbound. Stay where you are!\"" msgstr "" +#: lang/json/speech_from_json.py +msgid "\"I AM FOODPERSON. AND I BRING SUSTENANCE!\"" +msgstr "" + +#: lang/json/speech_from_json.py +msgid "\"Come to FoodPlace today and buy food!\"" +msgstr "" + +#: lang/json/speech_from_json.py +msgid "\"FoodPlace: The best restaurant in an area!\"" +msgstr "" + +#: lang/json/speech_from_json.py +#, no-python-format +msgid "\"Our food contains up to 95% real food.\"" +msgstr "" + +#: lang/json/speech_from_json.py +msgid "\"FoodPlace: It's the Calories.\"" +msgstr "" + +#: lang/json/speech_from_json.py +msgid "\"You need food, don't you? Then come with me to FOODPLACE!!\"" +msgstr "" + +#: lang/json/speech_from_json.py +msgid "\"FoodPlace: Edible food is OUR guarantee!\"" +msgstr "" + +#: lang/json/speech_from_json.py +msgid "Wanna play with me?" +msgstr "" + +#: lang/json/speech_from_json.py +msgid "Sing with me!" +msgstr "" + +#: lang/json/speech_from_json.py src/player.cpp +msgid "I love you!" +msgstr "" + +#: lang/json/speech_from_json.py +msgid "Please take me with you!" +msgstr "" + +#: lang/json/speech_from_json.py +msgid "May I have a cookie?" +msgstr "" + +#: lang/json/speech_from_json.py +msgid "Let's play together!" +msgstr "" + +#: lang/json/speech_from_json.py +msgid "Time to play!" +msgstr "" + +#: lang/json/speech_from_json.py +msgid "Om nom nom! Delicious!" +msgstr "" + +#: lang/json/speech_from_json.py +msgid "Are you my mommy?" +msgstr "" + +#: lang/json/speech_from_json.py +msgid "Oh, how fun!" +msgstr "" + +#: lang/json/speech_from_json.py +msgid "You're my best friend!" +msgstr "" + +#: lang/json/speech_from_json.py +msgid "Heehee!" +msgstr "" + +#: lang/json/speech_from_json.py +msgid "Let's have fun!" +msgstr "" + +#: lang/json/speech_from_json.py +msgid "Let's have a tea party!" +msgstr "" + +#: lang/json/speech_from_json.py +msgid "You're the best!" +msgstr "" + +#: lang/json/speech_from_json.py +msgid "You shouldn't have done that." +msgstr "" + +#: lang/json/speech_from_json.py +msgid "Let's play... Russian roulette." +msgstr "" + +#: lang/json/speech_from_json.py +msgid "I hate you." +msgstr "" + +#: lang/json/speech_from_json.py +msgid "Go kill yourself!" +msgstr "" + +#: lang/json/speech_from_json.py +msgid "Big Brother is watching you..." +msgstr "" + +#: lang/json/speech_from_json.py +msgid "Die for me!" +msgstr "" + +#: lang/json/speech_from_json.py +msgid "Why won't you die?" +msgstr "" + +#: lang/json/speech_from_json.py +msgid "Blood... Delicious." +msgstr "" + +#: lang/json/speech_from_json.py +msgid "See you... IN HELL!" +msgstr "" + +#: lang/json/speech_from_json.py +msgid "AAAIEEEEEEE!" +msgstr "" + +#: lang/json/speech_from_json.py +msgid "FUCK YOU!" +msgstr "" + +#: lang/json/speech_from_json.py +msgid "What did you do with my Mommy?" +msgstr "" + +#: lang/json/speech_from_json.py +msgid "Stay with me... forever!" +msgstr "" + +#: lang/json/speech_from_json.py +msgid "Hey kids. Want some candy?" +msgstr "" + +#: lang/json/speech_from_json.py +msgid "Down here, they ALL float!" +msgstr "" + +#: lang/json/speech_from_json.py +msgid "Do you really need that much honey?" +msgstr "" + +#: lang/json/speech_from_json.py +msgid "My previous owner squealed like a pig when I gutted her!" +msgstr "" + #: lang/json/speech_from_json.py msgid "\"Don't make me have ye walk the plank.\"" msgstr "" @@ -122893,6 +125176,10 @@ msgstr "" msgid "Police Station" msgstr "" +#: lang/json/start_location_from_json.py +msgid "Foodplace Break Room" +msgstr "" + #: lang/json/start_location_from_json.py msgid "School" msgstr "" @@ -122949,6 +125236,10 @@ msgstr "" msgid "Apartment Rooftop" msgstr "" +#: lang/json/start_location_from_json.py +msgid "Horse Ranch" +msgstr "" + #: lang/json/start_location_from_json.py msgid "Scavenger Bunker" msgstr "" @@ -123691,7 +125982,12 @@ msgid "Please sort out some of these items nearby." msgstr "" #: lang/json/talk_topic_from_json.py -msgid "Please work on any construction taks that you know how to finish." +msgid "" +"Please work on any unfinished construction task that you know how to finish." +msgstr "" + +#: lang/json/talk_topic_from_json.py +msgid "Please work on any contruction blueprint zones nearby." msgstr "" #: lang/json/talk_topic_from_json.py @@ -125252,6 +127548,312 @@ msgstr "" msgid "Please test mapgen_update linked" msgstr "" +#: lang/json/talk_topic_from_json.py +msgid "Greetings friend, it's nice to see you." +msgstr "" + +#: lang/json/talk_topic_from_json.py +msgid "So you're back... Explain yourself!" +msgstr "" + +#: lang/json/talk_topic_from_json.py +msgid "What sorcery is this?" +msgstr "" + +#: lang/json/talk_topic_from_json.py +msgid "Welcome home Foodkid!" +msgstr "" + +#: lang/json/talk_topic_from_json.py +msgid "Still here? Take your time, it's rough out there." +msgstr "" + +#: lang/json/talk_topic_from_json.py +msgid "Greeting citizen, what brings you to the FoodLair?" +msgstr "" + +#: lang/json/talk_topic_from_json.py +msgid "Hey. Let's chat for a second." +msgstr "" + +#: lang/json/talk_topic_from_json.py +msgid "Greetings... Foodperson?" +msgstr "" + +#: lang/json/talk_topic_from_json.py +msgid "I am you but from an alternate reality." +msgstr "" + +#: lang/json/talk_topic_from_json.py +msgid "I am Foodperson, who are YOU?" +msgstr "" + +#: lang/json/talk_topic_from_json.py +msgid "There is only one real Foodperson!" +msgstr "" + +#: lang/json/talk_topic_from_json.py +msgid "I am the REAL Foodperson!" +msgstr "" + +#: lang/json/talk_topic_from_json.py +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 "" + +#: lang/json/talk_topic_from_json.py +msgid "Wow! Such an honor to meet you in person!" +msgstr "" + +#: lang/json/talk_topic_from_json.py +msgid "Are you joking? Foodpeson is not real, it's a restaurant mascot!" +msgstr "" + +#: lang/json/talk_topic_from_json.py +msgid "" +"The great Foodperson in the flesh! Such an honor to finaly meet you in " +"person!" +msgstr "" + +#: lang/json/talk_topic_from_json.py +msgid "Ah... Well, nice to meet you Foodperson." +msgstr "" + +#: lang/json/talk_topic_from_json.py +msgid "Do not mock me, for my strength is quite real! Get out of here now!" +msgstr "" + +#: lang/json/talk_topic_from_json.py +msgid "Sheesh, ok, calm down, I'm leaving!" +msgstr "" + +#: lang/json/talk_topic_from_json.py +msgid "Forgive me, I didn't mean to disrespect you." +msgstr "" + +#: lang/json/talk_topic_from_json.py +msgid "Oh yeah? Show me what you can do!" +msgstr "" + +#: lang/json/talk_topic_from_json.py +msgid "A common mistake, but I can assure you that I'm very real!" +msgstr "" + +#: lang/json/talk_topic_from_json.py +msgid "Sure, whatever." +msgstr "" + +#: lang/json/talk_topic_from_json.py +msgid "Ok... I believe you." +msgstr "" + +#: lang/json/talk_topic_from_json.py +msgid "Anyway, do you need something?" +msgstr "" + +#: lang/json/talk_topic_from_json.py +msgid "Are you interested in some trading?" +msgstr "" + +#: lang/json/talk_topic_from_json.py +msgid "Let's trade?" +msgstr "" + +#: lang/json/talk_topic_from_json.py +msgid "I'm looking for a place to stay." +msgstr "" + +#: lang/json/talk_topic_from_json.py +msgid "I want to get stronger. Please teach me." +msgstr "" + +#: lang/json/talk_topic_from_json.py +msgid "Please share your knowledge." +msgstr "" + +#: lang/json/talk_topic_from_json.py +msgid "I'm building up a team, people with special abilities." +msgstr "" + +#: lang/json/talk_topic_from_json.py +msgid "Can you tell me again about this sidekick offer?" +msgstr "" + +#: lang/json/talk_topic_from_json.py +msgid "Alright, I thought about this, what do you say about we team up?" +msgstr "" + +#: lang/json/talk_topic_from_json.py +msgid "I'm good, bye." +msgstr "" + +#: lang/json/talk_topic_from_json.py +msgid "I already have everything I need here in the FoodLair!" +msgstr "" + +#: lang/json/talk_topic_from_json.py +msgid "Alright let's see what you've got." +msgstr "" + +#: lang/json/talk_topic_from_json.py +msgid "You're not ready for this." +msgstr "" + +#: lang/json/talk_topic_from_json.py +msgid "But I am worthy!" +msgstr "" + +#: lang/json/talk_topic_from_json.py +msgid "I can teach you a few tricks." +msgstr "" + +#: lang/json/talk_topic_from_json.py src/iuse.cpp +msgid "Nevermind." +msgstr "" + +#: lang/json/talk_topic_from_json.py +msgid "This is no place for a civilian. You should go to the refugee center." +msgstr "" + +#: lang/json/talk_topic_from_json.py +msgid "Damn!" +msgstr "" + +#: lang/json/talk_topic_from_json.py +msgid "Well... You seem like a decent sort, I might have an offer for you." +msgstr "" + +#: lang/json/talk_topic_from_json.py +msgid "I'm listening." +msgstr "" + +#: lang/json/talk_topic_from_json.py +msgid "Sorry but I work alone." +msgstr "" + +#: lang/json/talk_topic_from_json.py +msgid "We could really use your help!" +msgstr "" + +#: lang/json/talk_topic_from_json.py +msgid "What about: you prove your worth and join me as my sidekick?" +msgstr "" + +#: lang/json/talk_topic_from_json.py +msgid "That sounds great!" +msgstr "" + +#: lang/json/talk_topic_from_json.py +msgid "Ok..." +msgstr "" + +#: lang/json/talk_topic_from_json.py +msgid "I need to think about it." +msgstr "" + +#: lang/json/talk_topic_from_json.py +msgid "Huh... No thanks." +msgstr "" + +#: lang/json/talk_topic_from_json.py +msgid "There's other things I'd like to discuss." +msgstr "" + +#: lang/json/talk_topic_from_json.py +msgid "Alright bye." +msgstr "" + +#: lang/json/talk_topic_from_json.py +msgid "The way you talk, the way you move... You're... You're me? But how?" +msgstr "" + +#: lang/json/talk_topic_from_json.py +msgid "" +"I... I don't know. It probably has something to do with ! " +"What do you say we team up to find out?" +msgstr "" + +#: lang/json/talk_topic_from_json.py +msgid "" +"It might have something to do with , mind if I stay here " +"while we try to figure this out?" +msgstr "" + +#: lang/json/talk_topic_from_json.py +msgid "This can't be true, you're trying to trick me!" +msgstr "" + +#: lang/json/talk_topic_from_json.py +msgid "I need time to think." +msgstr "" + +#: lang/json/talk_topic_from_json.py +msgid "Wha... But. But... How?" +msgstr "" + +#: lang/json/talk_topic_from_json.py +msgid "" +"No time to explain, the world is at an end and we must join forces to save " +"it!" +msgstr "" + +#: lang/json/talk_topic_from_json.py +msgid "" +"The cataclysm weakened the space-time continuum, I accidentally fell through " +"a tear in reality and ended up here. I will need access to your resources " +"to keep fighting." +msgstr "" + +#: lang/json/talk_topic_from_json.py +msgid "" +"I am the ultimate Foodperson, I travel the multiverse consuming powers from " +"all the Foodpersons. And now I've come for you!" +msgstr "" + +#: lang/json/talk_topic_from_json.py +msgid "Can't tell you now. In due time all will be revealed." +msgstr "" + +#: lang/json/talk_topic_from_json.py +msgid "Of course, whatever you need... Foodperson." +msgstr "" + +#: lang/json/talk_topic_from_json.py +msgid "Thank you Foodperson! It's good to know I have a friend here." +msgstr "" + +#: lang/json/talk_topic_from_json.py +msgid "" +"It's crazy out there, it's going to be a tough journey but I'm with you!" +msgstr "" + +#: lang/json/talk_topic_from_json.py +msgid "Let's go, we have a world to save!" +msgstr "" + +#: lang/json/talk_topic_from_json.py +msgid "There can be only one!" +msgstr "" + +#: lang/json/talk_topic_from_json.py +msgid "I AM THE ONE!" +msgstr "" + +#: lang/json/talk_topic_from_json.py +msgid "Wow calm down, it's just a prank bro." +msgstr "" + +#: lang/json/talk_topic_from_json.py +msgid "WAIT! There might be another way!" +msgstr "" + +#: lang/json/talk_topic_from_json.py +msgid "I don't want to fight you. I'm leaving." +msgstr "" + #: lang/json/talk_topic_from_json.py msgid "" msgstr "" @@ -125482,8 +128084,8 @@ msgid "" "morale was piss poor and we were shooting wild. Then something hit us, " "something big. Might have been a bomb, I really don't remember. I woke up " "pinned underneath the SWAT van. I couldn't see anything... but I could " -"hear it, . I could hear everything. I spent hours, maybe days " -"under that van, not even trying to get out." +"hear it, . I could hear everything. I spent hours, maybe days under " +"that van, not even trying to get out." msgstr "" #: lang/json/talk_topic_from_json.py @@ -131882,9 +134484,11 @@ msgstr "" #: lang/json/talk_topic_from_json.py msgid "" "I'm currently waiting for a customer to return... I'll make you a deal " -"though, $8,000 will cover my expenses if I get a small cut of the loot. I " -"can't accept cash cards, so you'll have to find an ATM to deposit money into " -"your bank account." +"though, 2500 Merch will cover my expenses if I get a small cut of the loot." +msgstr "" + +#: lang/json/talk_topic_from_json.py +msgid "What the heck is a Merch?" msgstr "" #: lang/json/talk_topic_from_json.py @@ -131892,7 +134496,26 @@ msgid "I might be back." msgstr "" #: lang/json/talk_topic_from_json.py -msgid "[$8000] You have a deal." +msgid "[FMC2500] You have a deal." +msgstr "" + +#: lang/json/talk_topic_from_json.py +msgid "" +"Merchs are what they call dollar bills around here. Free Merchant Credit " +"Notes or something. If you want to buy stuff around here and you don't want " +"to barter away your guns, you need Merch." +msgstr "" + +#: lang/json/talk_topic_from_json.py +msgid "I see. Let's try this again from the start." +msgstr "" + +#: lang/json/talk_topic_from_json.py +msgid "Okay, how much Merch do I need?" +msgstr "" + +#: lang/json/talk_topic_from_json.py +msgid "Well, thanks for the info. Bye!" msgstr "" #: lang/json/talk_topic_from_json.py @@ -131968,6 +134591,10 @@ msgstr "" msgid "Alright, I'll leave" msgstr "" +#: lang/json/talk_topic_from_json.py +msgid "Keep it civil, merc." +msgstr "" + #: lang/json/talk_topic_from_json.py msgid "" "Still plenty of outlaws in the roads, perhaps you should tend to your job, " @@ -134009,6 +136636,75 @@ msgstr "" msgid " brutally skewers %s" msgstr "" +#: lang/json/technique_from_json.py +msgid "Chain Punch" +msgstr "" + +#. ~ Description for Chain Punch +#: lang/json/technique_from_json.py +msgid "50% moves, 66% damage, knockback and follow" +msgstr "" + +#: lang/json/technique_from_json.py +#, python-format +msgid "You chain strike %s" +msgstr "" + +#: lang/json/technique_from_json.py +#, python-format +msgid " chain strikes %s" +msgstr "" + +#: lang/json/technique_from_json.py +msgid "You position yourself well and slip out of a grab" +msgstr "" + +#: lang/json/technique_from_json.py +msgid " slips out of a grab" +msgstr "" + +#: lang/json/technique_from_json.py +msgid "keep punching at" +msgstr "" + +#: lang/json/technique_from_json.py +#, python-format +msgid "You miss but keep striking at %s" +msgstr "" + +#: lang/json/technique_from_json.py +#, python-format +msgid " misses but keeps striking at %s" +msgstr "" + +#: lang/json/technique_from_json.py +msgid "stumble" +msgstr "" + +#: lang/json/technique_from_json.py +#, python-format +msgid "You stumble %s with your onslaught" +msgstr "" + +#: lang/json/technique_from_json.py +#, python-format +msgid " stumbles %s" +msgstr "" + +#: lang/json/technique_from_json.py +msgid "Receive and Counter" +msgstr "" + +#: lang/json/technique_from_json.py +#, python-format +msgid "You receive %s's gift of violence, and return it in kind" +msgstr "" + +#: lang/json/technique_from_json.py +#, python-format +msgid " receives %s's attack, and counters" +msgstr "" + #: lang/json/technique_from_json.py msgid "Pressure Crunch" msgstr "" @@ -135578,8 +138274,8 @@ msgstr "" #: lang/json/terrain_from_json.py msgid "" "Just like other wooden doors, except this one has layers of nailed in two by " -"fours for reinforcement. It might be barricaded, but still susceptible to " -"fire." +"fours and additional hinge for reinforcement. It might be barricaded, but " +"still susceptible to fire." msgstr "" #: lang/json/terrain_from_json.py @@ -135864,6 +138560,17 @@ msgid "" "shape." msgstr "" +#: lang/json/terrain_from_json.py +msgid "open secret door" +msgstr "" + +#. ~ Description for open secret door +#: lang/json/terrain_from_json.py +msgid "" +"This apparently normal segment of metal wall has opened to reveal a secret " +"passage." +msgstr "" + #: lang/json/terrain_from_json.py msgid "open metal door" msgstr "" @@ -137241,18 +139948,18 @@ msgstr "" #. ~ Description for fungal floor #: lang/json/terrain_from_json.py msgid "" -"Greyish mold coats both the floor and the roof here, silent and still. " +"Grayish mold coats both the floor and the roof here, silent and still. " "Stray spores waft through the air." msgstr "" #. ~ Description for fungal floor #: lang/json/terrain_from_json.py -msgid "Greyish mold coats the floor here, silent and still." +msgid "Grayish mold coats the floor here, silent and still." msgstr "" #. ~ Description for fungal floor #: lang/json/terrain_from_json.py -msgid "Greyish mold coats the ground here, silent and still." +msgid "Grayish mold coats the ground here, silent and still." msgstr "" #. ~ Description for fungal wall @@ -137288,7 +139995,7 @@ msgstr "" msgid "" "This shrub has been completely absorbed by the mushrooms. Its branches " "droop and have lost much of their structure, and its leaves have vanished, " -"replaced by fleshy grey sacks that visibly expand and contract." +"replaced by fleshy gray sacks that visibly expand and contract." msgstr "" #: lang/json/terrain_from_json.py @@ -137764,6 +140471,42 @@ msgstr "" msgid "plunk." msgstr "" +#: lang/json/terrain_from_json.py +msgid "wooden stairs" +msgstr "" + +#. ~ Description for wooden stairs +#: lang/json/terrain_from_json.py +msgid "A wooden staircase leading down." +msgstr "" + +#: lang/json/terrain_from_json.py +msgid "half-built wooden stairs" +msgstr "" + +#. ~ Description for half-built wooden stairs +#: lang/json/terrain_from_json.py +msgid "" +"Half of a wooden staircase. Some work still needs to be done before this " +"staircase is complete." +msgstr "" + +#: lang/json/terrain_from_json.py +msgid "broken wooden stairs" +msgstr "" + +#. ~ Description for broken wooden stairs +#: lang/json/terrain_from_json.py +msgid "" +"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 staircase." +msgstr "" + +#. ~ Description for wooden stairs +#: lang/json/terrain_from_json.py +msgid "A wooden staircase leading up" +msgstr "" + #: lang/json/terrain_from_json.py msgid "stairs" msgstr "" @@ -137885,6 +140628,14 @@ msgid "" "industrial ID card could still open it." msgstr "" +#. ~ Description for card reader +#: lang/json/terrain_from_json.py +msgid "" +"This looks like the console controling the security door, there's a pretty " +"big reading surface on it. You can see \"Fp\" soberly printed above the " +"reader. You have no idea what could open it." +msgstr "" + #: lang/json/terrain_from_json.py msgid "broken card reader" msgstr "" @@ -138047,6 +140798,28 @@ msgstr "" msgid "A checkered switch. Should you activate it?" 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 "" + +#. ~ 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 #: lang/json/terrain_from_json.py msgid "Soft red carpet." @@ -138074,7 +140847,7 @@ msgstr "" #. ~ Description for linoleum tile #: lang/json/terrain_from_json.py msgid "" -"A section of flooring made out of a tough, rubbery material. Coloured a " +"A section of flooring made out of a tough, rubbery material. Colored a " "simple white." msgstr "" @@ -138128,6 +140901,15 @@ msgstr "" msgid "Wall painted yellow." msgstr "" +#: lang/json/terrain_from_json.py +msgid "pink wall" +msgstr "" + +#. ~ Description for pink wall +#: lang/json/terrain_from_json.py +msgid "Wall painted pink." +msgstr "" + #: lang/json/terrain_from_json.py msgid "purple wall" msgstr "" @@ -138902,10 +141684,6 @@ msgstr "" msgid "open secret" msgstr "" -#: lang/json/terrain_from_json.py -msgid "open secret door" -msgstr "" - #: lang/json/terrain_from_json.py msgid "book case" msgstr "" @@ -139143,6 +141921,22 @@ msgstr "" msgid "chromatography" msgstr "" +#: lang/json/tool_quality_from_json.py +msgid "grinding" +msgstr "" + +#: lang/json/tool_quality_from_json.py +msgid "reaming" +msgstr "" + +#: lang/json/tool_quality_from_json.py +msgid "filing" +msgstr "" + +#: lang/json/tool_quality_from_json.py +msgid "vicing" +msgstr "" + #: lang/json/trap_from_json.py msgid "glass shards" msgstr "" @@ -139625,6 +142419,10 @@ msgstr "" msgid "raft" msgstr "" +#: lang/json/vehicle_from_json.py +msgid "motor boat" +msgstr "" + #: lang/json/vehicle_from_json.py msgid "4x4 Car" msgstr "" @@ -139962,6 +142760,10 @@ msgstr "" msgid "Bus" msgstr "" +#: lang/json/vehicle_from_json.py +msgid "Tour Bus" +msgstr "" + #: lang/json/vehicle_from_json.py msgid "Security Van" msgstr "" @@ -140058,6 +142860,664 @@ msgstr "" msgid "Infantry Fighting Vehicle" msgstr "" +#: lang/json/vehicle_part_from_json.py +msgid "rebar reinforcement" +msgstr "" + +#. ~ Description for rebar reinforcement +#: lang/json/vehicle_part_from_json.py +msgid "" +"Improvised armor plate. Will partially protect other components on the same " +"frame from damage." +msgstr "" + +#. ~ Description for shock absorber +#: lang/json/vehicle_part_from_json.py +msgid "" +"A system of springs and pads, intended to cushion the effects of collisions " +"on the interior of your vehicle." +msgstr "" + +#. ~ Description for car battery +#. ~ Description for storage battery +#. ~ Description for large storage battery +#: lang/json/vehicle_part_from_json.py +msgid "" +"A battery for storing electrical power, and discharging it to power " +"electrical devices built into the vehicle." +msgstr "" + +#: lang/json/vehicle_part_from_json.py +msgid "motorbike battery, small" +msgstr "" + +#: lang/json/vehicle_part_from_json.py +msgid "swappable storage battery" +msgstr "" + +#. ~ Description for swappable storage battery +#: lang/json/vehicle_part_from_json.py +msgid "" +"A battery for storing electrical power, and discharging it to power " +"electrical devices built into the vehicle. This one is mounted on a quick " +"release framework to allow it to be easily swapped, though it still weighs " +"so much that a lifting tool of some kind is necessary for most people." +msgstr "" + +#: lang/json/vehicle_part_from_json.py +msgid "board" +msgstr "" + +#. ~ Description for board +#: lang/json/vehicle_part_from_json.py +msgid "" +"A metal wall. Keeps zombies outside the vehicle and prevents people from " +"seeing through it." +msgstr "" + +#: lang/json/vehicle_part_from_json.py +msgid "cloth board" +msgstr "" + +#. ~ Description for cloth board +#: lang/json/vehicle_part_from_json.py +msgid "" +"A cloth wall. Keeps zombies outside the vehicle and prevents people from " +"seeing through it." +msgstr "" + +#: lang/json/vehicle_part_from_json.py +msgid "cloth quarterpanel" +msgstr "" + +#. ~ Description for cloth quarterpanel +#: lang/json/vehicle_part_from_json.py +msgid "" +"A half-height cloth wall. Keeps zombies outside the vehicle but allows " +"people to see over it." +msgstr "" + +#: lang/json/vehicle_part_from_json.py +msgid "quarterpanel" +msgstr "" + +#. ~ Description for quarterpanel +#: lang/json/vehicle_part_from_json.py +msgid "" +"A half-height metal wall. Keeps zombies outside the vehicle but allows " +"people to see over it." +msgstr "" + +#: lang/json/vehicle_part_from_json.py +msgid "stow board" +msgstr "" + +#. ~ Description for stow board +#: lang/json/vehicle_part_from_json.py +msgid "" +"A metal wall with a storage locker. Keeps zombies outside the vehicle and " +"prevents people from seeing through it." +msgstr "" + +#: lang/json/vehicle_part_from_json.py +msgid "heavy duty stow board" +msgstr "" + +#: lang/json/vehicle_part_from_json.py +msgid "heavy duty board" +msgstr "" + +#. ~ Description for heavy duty board +#: lang/json/vehicle_part_from_json.py +msgid "" +"A strong metal wall. Keeps zombies outside the vehicle and prevents people " +"from seeing through it." +msgstr "" + +#: lang/json/vehicle_part_from_json.py +msgid "heavy duty quarterpanel" +msgstr "" + +#. ~ Description for heavy duty quarterpanel +#: lang/json/vehicle_part_from_json.py +msgid "" +"A half-height strong metal wall. Keeps zombies outside the vehicle but " +"allows people to see over it." +msgstr "" + +#: lang/json/vehicle_part_from_json.py +msgid "wooden board" +msgstr "" + +#. ~ Description for wooden board +#: lang/json/vehicle_part_from_json.py +msgid "" +"A wooden wall. Keeps zombies outside the vehicle and prevents people from " +"seeing through it." +msgstr "" + +#: lang/json/vehicle_part_from_json.py +msgid "wooden quarterpanel" +msgstr "" + +#. ~ Description for wooden quarterpanel +#: lang/json/vehicle_part_from_json.py +msgid "" +"A half-height wooden wall. Keeps zombies outside the vehicle but allows " +"people to see over it." +msgstr "" + +#: lang/json/vehicle_part_from_json.py +msgid "extra light quarterpanel" +msgstr "" + +#. ~ Description for extra light quarterpanel +#: lang/json/vehicle_part_from_json.py +msgid "" +"A half-height thin metal wall. Keeps zombies outside the vehicle but allows " +"people to see over it." +msgstr "" + +#: lang/json/vehicle_part_from_json.py +msgid "external shopping cart basket" +msgstr "" + +#. ~ Description for external shopping cart basket +#. ~ Description for external wire bike basket +#. ~ Description for external cargo rack +#: lang/json/vehicle_part_from_json.py +msgid "" +"Storage space, mounted outside your vehicle's armor and vulnerable to damage." +msgstr "" + +#: lang/json/vehicle_part_from_json.py +msgid "external wire bike basket" +msgstr "" + +#: lang/json/vehicle_part_from_json.py +msgid "external cargo rack" +msgstr "" + +#. ~ Description for bike rack +#: lang/json/vehicle_part_from_json.py +msgid "" +"A collection of pipes and frames for supporting a bike or other small " +"vehicle and carrying it on your vehicle. Move a single tile wide vehicle so " +"that all of that vehicle's tiles are next to bike racks, and then 'e'xamine " +"any bike rack to mount that vehicle onto the bike rack. 'e'xamine the bike " +"rack to unmount the carried vehicle." +msgstr "" + +#. ~ Description for mounted spare tire +#: lang/json/vehicle_part_from_json.py +msgid "Spare tire stored on an external carrier rig." +msgstr "" + +#: lang/json/vehicle_part_from_json.py +msgid "A combustion engine. Burns fuel from a tank in the vehicle." +msgstr "" + +#: lang/json/vehicle_part_from_json.py +msgid "" +"A combustion engine. Burns diesel fuel from a tank in the vehicle. Can " +"also burn biodiesel or lamp oil, though somewhat less efficiently." +msgstr "" + +#: lang/json/vehicle_part_from_json.py +msgid "A combustion engine. Burns gasoline fuel from a tank in the vehicle." +msgstr "" + +#: lang/json/vehicle_part_from_json.py +msgid "" +"An advanced combustion engine. Burns gasoline or diesel fuel from a tank in " +"the vehicle. Can also burn lamp oil, though somewhat less efficiently. " +"Better power-to-weight ratio than a traditional engine, but consumes more " +"fuel." +msgstr "" + +#: lang/json/vehicle_part_from_json.py +msgid "" +"A closed cycle, external combustion steam engine. Burns coal or charcoal " +"from a bunker in the vehicle to produce steam." +msgstr "" + +#: lang/json/vehicle_part_from_json.py +msgid "boom crane" +msgstr "" + +#. ~ Description for boom crane +#. ~ Description for internal boom crane +#: lang/json/vehicle_part_from_json.py +msgid "" +"A rigid steel boom crane. If it is in your line of sight and within two " +"tiles of another vehicle, you will automatically use it when you want jack " +"up the other vehicle to change the its wheels. 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." +msgstr "" + +#: lang/json/vehicle_part_from_json.py +msgid "internal boom crane" +msgstr "" + +#: lang/json/vehicle_part_from_json.py +msgid "telescopic crane" +msgstr "" + +#. ~ Description for telescopic crane +#: lang/json/vehicle_part_from_json.py +msgid "" +"An extendable cantilever crane. If it is in your line of sight and within " +"two tiles of another vehicle, you will automatically use it when you want " +"jack up the other vehicle to change the its wheels. 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." +msgstr "" + +#. ~ Description for pallet lifter +#: lang/json/vehicle_part_from_json.py +msgid "" +"A small pallet lifter. If it is in your line of sight and within two tiles " +"of another vehicle, you will automatically use it when you want jack up the " +"other vehicle to change the its wheels. 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." +msgstr "" + +#: lang/json/vehicle_part_from_json.py +msgid "forklift arm" +msgstr "" + +#. ~ Description for forklift arm +#: lang/json/vehicle_part_from_json.py +msgid "" +"A pair of forklift arms. If it is in your line of sight and within two " +"tiles of another vehicle, you will automatically use it when you want jack " +"up the other vehicle to change the its wheels. 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." +msgstr "" + +#. ~ Description for rockwheel +#: lang/json/vehicle_part_from_json.py +msgid "" +"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." +msgstr "" + +#: lang/json/vehicle_part_from_json.py +msgid "air jack system" +msgstr "" + +#: lang/json/vehicle_part_from_json.py +msgid "foldable light frame" +msgstr "" + +#. ~ Description for foldable light frame +#: lang/json/vehicle_part_from_json.py +msgid "" +"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." +msgstr "" + +#. ~ Description for foldable wooden frame +#: lang/json/vehicle_part_from_json.py +msgid "" +"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." +msgstr "" + +#: lang/json/vehicle_part_from_json.py +msgid "frame" +msgstr "" + +#. ~ Description for frame +#: lang/json/vehicle_part_from_json.py +msgid "" +"A metal framework. Other vehicle components can be mounted on it, and it " +"can be attached to other frames to increase the vehicle's size." +msgstr "" + +#. ~ Description for wooden frame +#: lang/json/vehicle_part_from_json.py +msgid "" +"A wooden framework. Other vehicle components can be mounted on it, and it " +"can be attached to other frames to increase the vehicle's size. Wood and " +"nail construction means it can be constructed and added to the vehicle " +"without welding tools." +msgstr "" + +#. ~ Description for light wooden frame +#: lang/json/vehicle_part_from_json.py +msgid "" +"A light wooden framework. Other vehicle components can be mounted on it, " +"and it can be attached to other frames to increase the vehicle's size. Wood " +"and rope constructions means it can be constructed and added to the vehicle " +"without welding tools or nails." +msgstr "" + +#. ~ Description for heavy duty frame +#: lang/json/vehicle_part_from_json.py +msgid "" +"A heavy metal framework. Other vehicle components can be mounted on it, and " +"it can be attached to other frames to increase the vehicle's size. " +"Increased mass makes it more resistant to damage in collisions." +msgstr "" + +#: lang/json/vehicle_part_from_json.py +msgid "extra light frame" +msgstr "" + +#. ~ Description for extra light frame +#: lang/json/vehicle_part_from_json.py +msgid "" +"A light metal framework. Other vehicle components can be mounted on it, and " +"it can be attached to other frames to increase the vehicle's size." +msgstr "" + +#: lang/json/vehicle_part_from_json.py src/vehicle_use.cpp +msgid "aisle lights" +msgstr "" + +#. ~ Description for atomic lamp +#: lang/json/vehicle_part_from_json.py +msgid "" +"A bright light, self-powered by an atomic decay reaction that never stops. " +"When turned on, it illuminates several squares inside the vehicle." +msgstr "" + +#: lang/json/vehicle_part_from_json.py +msgid "atomic nightlight" +msgstr "" + +#. ~ Description for atomic nightlight +#: lang/json/vehicle_part_from_json.py +msgid "" +"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." +msgstr "" + +#. ~ Description for floodlight +#: lang/json/vehicle_part_from_json.py +msgid "" +"A very bright, circular light that illuminates the area outside the vehicle " +"when turned on." +msgstr "" + +#. ~ Description for directed floodlight +#: lang/json/vehicle_part_from_json.py +msgid "" +"A very bright, directed light that illuminates a half-circular area outside " +"the vehicle when turned on. During installation, you can choose what " +"direction to point the light." +msgstr "" + +#: lang/json/vehicle_part_from_json.py +msgid "headlight" +msgstr "" + +#. ~ Description for headlight +#: lang/json/vehicle_part_from_json.py +msgid "" +"A bright light that illuminates a narrow cone outside the vehicle when " +"turned on. During installation, you can choose what direction to point the " +"light, so multiple headlights can illuminate the sides or rear, as well as " +"the front." +msgstr "" + +#. ~ Description for motorcycle headlight +#: lang/json/vehicle_part_from_json.py +msgid "" +"A small, lightweight, bright light that illuminates a narrow cone outside " +"the vehicle when turned on. During installation, you can choose what " +"direction to point the light, so multiple headlights can illuminate the " +"sides or rear, as well as the front." +msgstr "" + +#: lang/json/vehicle_part_from_json.py +msgid "wide angle headlight" +msgstr "" + +#. ~ Description for wide angle headlight +#: lang/json/vehicle_part_from_json.py +msgid "" +"A bright light that illuminates a wide cone outside the vehicle when turned " +"on. During installation, you can choose what direction to point the light, " +"so multiple headlights can illuminate the sides or rear, as well as the " +"front." +msgstr "" + +#: lang/json/vehicle_part_from_json.py +msgid "" +"Emergency lights, like a police car's or ambulance's, mounted on the " +"vehicle's roof. Flashes between red and blue when turned on, attracting " +"attention without illuminating the area." +msgstr "" + +#: lang/json/vehicle_part_from_json.py +msgid "blue light" +msgstr "" + +#: lang/json/vehicle_part_from_json.py +msgid "red light" +msgstr "" + +#: lang/json/vehicle_part_from_json.py +msgid "aisle with lights" +msgstr "" + +#: lang/json/vehicle_part_from_json.py +msgid "foot pedals" +msgstr "" + +#. ~ Description for foot pedals +#: lang/json/vehicle_part_from_json.py +msgid "" +"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." +msgstr "" + +#: lang/json/vehicle_part_from_json.py +msgid "hand rims" +msgstr "" + +#. ~ Description for hand rims +#: lang/json/vehicle_part_from_json.py +msgid "" +"A set of wheelchair style wheels. If mounted on the same tile as seat, they " +"allow you to move the vehicle at the cost of your stamina." +msgstr "" + +#. ~ Description for electric motor +#: lang/json/vehicle_part_from_json.py +msgid "An electric motor." +msgstr "" + +#: lang/json/vehicle_part_from_json.py +msgid "" +"A reinforced ram. Place at the edge of vehicle to reduce damage taken in " +"collisions, and to increase damaged delivered in collisions, if the ram is " +"the first vehicle part to collide." +msgstr "" + +#: lang/json/vehicle_part_from_json.py +msgid "superalloy ram" +msgstr "" + +#: lang/json/vehicle_part_from_json.py +msgid "heavy steel ram" +msgstr "" + +#: lang/json/vehicle_part_from_json.py +msgid "military composite ram" +msgstr "" + +#: lang/json/vehicle_part_from_json.py +msgid "spiked ram" +msgstr "" + +#: lang/json/vehicle_part_from_json.py +msgid "steel ram" +msgstr "" + +#: lang/json/vehicle_part_from_json.py +msgid "wooden ram" +msgstr "" + +#: lang/json/vehicle_part_from_json.py +msgid "chitin ram" +msgstr "" + +#: lang/json/vehicle_part_from_json.py +msgid "biosilicfied chitin ram" +msgstr "" + +#. ~ Description for shredder +#: lang/json/vehicle_part_from_json.py +msgid "" +"A circular blade, powered by the vehicle's engine. It will dramatically " +"increase the damage the vehicle delivers in collisions. Mount on the edges " +"of the vehicle, preferably the front." +msgstr "" + +#: lang/json/vehicle_part_from_json.py +msgid "vehicle tank (2L)" +msgstr "" + +#. ~ Description for vehicle tank (2L) +#. ~ Description for vehicle tank (10L) +#. ~ Description for vehicle tank (20L) +#. ~ Description for vehicle tank (60L) +#: lang/json/vehicle_part_from_json.py +msgid "" +"A storage space for holding liquids. If filled with the appropriate fuel " +"for the vehicle's engine, the engine will automatically draw fuel from the " +"tank when the engine is on. If filled with water, you can access the water " +"from a water faucet, if one is installed in the vehicle. You can also use a " +"rubber hose to siphon liquids out of a tank." +msgstr "" + +#: lang/json/vehicle_part_from_json.py +msgid "vehicle tank (10L)" +msgstr "" + +#: lang/json/vehicle_part_from_json.py +msgid "vehicle tank (20L)" +msgstr "" + +#: lang/json/vehicle_part_from_json.py +msgid "vehicle tank (60L)" +msgstr "" + +#: lang/json/vehicle_part_from_json.py +msgid "external tank (100L)" +msgstr "" + +#. ~ Description for external tank (100L) +#: lang/json/vehicle_part_from_json.py +msgid "" +"A storage space for holding liquids, mounted outside the vehicle's walls and " +"armor. If filled with the appropriate fuel for the vehicle's engine, the " +"engine will automatically draw fuel from the tank when the engine is on. If " +"filled with water, you can access the water from a water faucet, if one is " +"installed in the vehicle. You can also use a rubber hose to siphon liquids " +"out of a tank." +msgstr "" + +#: lang/json/vehicle_part_from_json.py +msgid "external tank (200L)" +msgstr "" + +#: lang/json/vehicle_part_from_json.py +msgid "wooden barrel (100L)" +msgstr "" + +#. ~ Description for wooden barrel (100L) +#. ~ Description for steel drum (100L) +#: lang/json/vehicle_part_from_json.py +msgid "" +"A storage space for holding liquids, mounted inside the cargo or passenger " +"space. If filled with the appropriate fuel for the vehicle's engine, the " +"engine will automatically draw fuel from the tank when the engine is on. If " +"filled with water, you can access the water from a water faucet, if one is " +"installed in the vehicle. You can also use a rubber hose to siphon liquids " +"out of a tank." +msgstr "" + +#. ~ Description for fuel bunker +#: lang/json/vehicle_part_from_json.py +msgid "" +"A storage space for holding solid fuels. If filled with the appropriate " +"fuel for the vehicle's engine, the engine will automatically draw fuel from " +"the tank when the engine is on." +msgstr "" + +#: lang/json/vehicle_part_from_json.py +msgid "mounted flamethrower" +msgstr "" + +#: lang/json/vehicle_part_from_json.py +msgid "mounted fusion gun" +msgstr "" + +#: lang/json/vehicle_part_from_json.py +msgid "mounted A7 laser rifle" +msgstr "" + +#: lang/json/vehicle_part_from_json.py +msgid "mounted M249" +msgstr "" + +#: lang/json/vehicle_part_from_json.py +msgid "mounted automatic shotgun" +msgstr "" + +#: lang/json/vehicle_part_from_json.py +msgid "mounted M2 Browning" +msgstr "" + +#: lang/json/vehicle_part_from_json.py +msgid "mounted M134D-H Minigun" +msgstr "" + +#: lang/json/vehicle_part_from_json.py +msgid "mounted Browning Automatic Rifle" +msgstr "" + +#: lang/json/vehicle_part_from_json.py +msgid "mounted M240" +msgstr "" + +#: lang/json/vehicle_part_from_json.py +msgid "mounted M60" +msgstr "" + +#: lang/json/vehicle_part_from_json.py +msgid "mounted Mark 19 grenade launcher" +msgstr "" + +#: lang/json/vehicle_part_from_json.py +msgid "mounted RM298 HMG" +msgstr "" + +#: lang/json/vehicle_part_from_json.py +msgid "mounted RM614 LMG" +msgstr "" + +#: lang/json/vehicle_part_from_json.py +msgid "mounted plasma gun" +msgstr "" + #: lang/json/vehicle_part_from_json.py msgid "null part" msgstr "" @@ -140976,664 +144436,6 @@ msgid "" "stand next to a turret mount and 'f'ire the weapon by selecting the tile." msgstr "" -#: lang/json/vehicle_part_from_json.py -msgid "rebar reinforcement" -msgstr "" - -#. ~ Description for rebar reinforcement -#: lang/json/vehicle_part_from_json.py -msgid "" -"Improvised armor plate. Will partially protect other components on the same " -"frame from damage." -msgstr "" - -#. ~ Description for shock absorber -#: lang/json/vehicle_part_from_json.py -msgid "" -"A system of springs and pads, intended to cushion the effects of collisions " -"on the interior of your vehicle." -msgstr "" - -#. ~ Description for car battery -#. ~ Description for storage battery -#. ~ Description for large storage battery -#: lang/json/vehicle_part_from_json.py -msgid "" -"A battery for storing electrical power, and discharging it to power " -"electrical devices built into the vehicle." -msgstr "" - -#: lang/json/vehicle_part_from_json.py -msgid "motorbike battery, small" -msgstr "" - -#: lang/json/vehicle_part_from_json.py -msgid "swappable storage battery" -msgstr "" - -#. ~ Description for swappable storage battery -#: lang/json/vehicle_part_from_json.py -msgid "" -"A battery for storing electrical power, and discharging it to power " -"electrical devices built into the vehicle. This one is mounted on a quick " -"release framework to allow it to be easily swapped, though it still weighs " -"so much that a lifting tool of some kind is necessary for most people." -msgstr "" - -#: lang/json/vehicle_part_from_json.py -msgid "board" -msgstr "" - -#. ~ Description for board -#: lang/json/vehicle_part_from_json.py -msgid "" -"A metal wall. Keeps zombies outside the vehicle and prevents people from " -"seeing through it." -msgstr "" - -#: lang/json/vehicle_part_from_json.py -msgid "cloth board" -msgstr "" - -#. ~ Description for cloth board -#: lang/json/vehicle_part_from_json.py -msgid "" -"A cloth wall. Keeps zombies outside the vehicle and prevents people from " -"seeing through it." -msgstr "" - -#: lang/json/vehicle_part_from_json.py -msgid "cloth quarterpanel" -msgstr "" - -#. ~ Description for cloth quarterpanel -#: lang/json/vehicle_part_from_json.py -msgid "" -"A half-height cloth wall. Keeps zombies outside the vehicle but allows " -"people to see over it." -msgstr "" - -#: lang/json/vehicle_part_from_json.py -msgid "quarterpanel" -msgstr "" - -#. ~ Description for quarterpanel -#: lang/json/vehicle_part_from_json.py -msgid "" -"A half-height metal wall. Keeps zombies outside the vehicle but allows " -"people to see over it." -msgstr "" - -#: lang/json/vehicle_part_from_json.py -msgid "stow board" -msgstr "" - -#. ~ Description for stow board -#: lang/json/vehicle_part_from_json.py -msgid "" -"A metal wall with a storage locker. Keeps zombies outside the vehicle and " -"prevents people from seeing through it." -msgstr "" - -#: lang/json/vehicle_part_from_json.py -msgid "heavy duty stow board" -msgstr "" - -#: lang/json/vehicle_part_from_json.py -msgid "heavy duty board" -msgstr "" - -#. ~ Description for heavy duty board -#: lang/json/vehicle_part_from_json.py -msgid "" -"A strong metal wall. Keeps zombies outside the vehicle and prevents people " -"from seeing through it." -msgstr "" - -#: lang/json/vehicle_part_from_json.py -msgid "heavy duty quarterpanel" -msgstr "" - -#. ~ Description for heavy duty quarterpanel -#: lang/json/vehicle_part_from_json.py -msgid "" -"A half-height strong metal wall. Keeps zombies outside the vehicle but " -"allows people to see over it." -msgstr "" - -#: lang/json/vehicle_part_from_json.py -msgid "wooden board" -msgstr "" - -#. ~ Description for wooden board -#: lang/json/vehicle_part_from_json.py -msgid "" -"A wooden wall. Keeps zombies outside the vehicle and prevents people from " -"seeing through it." -msgstr "" - -#: lang/json/vehicle_part_from_json.py -msgid "wooden quarterpanel" -msgstr "" - -#. ~ Description for wooden quarterpanel -#: lang/json/vehicle_part_from_json.py -msgid "" -"A half-height wooden wall. Keeps zombies outside the vehicle but allows " -"people to see over it." -msgstr "" - -#: lang/json/vehicle_part_from_json.py -msgid "extra light quarterpanel" -msgstr "" - -#. ~ Description for extra light quarterpanel -#: lang/json/vehicle_part_from_json.py -msgid "" -"A half-height thin metal wall. Keeps zombies outside the vehicle but allows " -"people to see over it." -msgstr "" - -#: lang/json/vehicle_part_from_json.py -msgid "external shopping cart basket" -msgstr "" - -#. ~ Description for external shopping cart basket -#. ~ Description for external wire bike basket -#. ~ Description for external cargo rack -#: lang/json/vehicle_part_from_json.py -msgid "" -"Storage space, mounted outside your vehicle's armor and vulnerable to damage." -msgstr "" - -#: lang/json/vehicle_part_from_json.py -msgid "external wire bike basket" -msgstr "" - -#: lang/json/vehicle_part_from_json.py -msgid "external cargo rack" -msgstr "" - -#. ~ Description for bike rack -#: lang/json/vehicle_part_from_json.py -msgid "" -"A collection of pipes and frames for supporting a bike or other small " -"vehicle and carrying it on your vehicle. Move a single tile wide vehicle so " -"that all of that vehicle's tiles are next to bike racks, and then 'e'xamine " -"any bike rack to mount that vehicle onto the bike rack. 'e'xamine the bike " -"rack to unmount the carried vehicle." -msgstr "" - -#. ~ Description for mounted spare tire -#: lang/json/vehicle_part_from_json.py -msgid "Spare tire stored on an external carrier rig." -msgstr "" - -#: lang/json/vehicle_part_from_json.py -msgid "A combustion engine. Burns fuel from a tank in the vehicle." -msgstr "" - -#: lang/json/vehicle_part_from_json.py -msgid "" -"A combustion engine. Burns diesel fuel from a tank in the vehicle. Can " -"also burn biodiesel or lamp oil, though somewhat less efficiently." -msgstr "" - -#: lang/json/vehicle_part_from_json.py -msgid "A combustion engine. Burns gasoline fuel from a tank in the vehicle." -msgstr "" - -#: lang/json/vehicle_part_from_json.py -msgid "" -"An advanced combustion engine. Burns gasoline or diesel fuel from a tank in " -"the vehicle. Can also burn lamp oil, though somewhat less efficiently. " -"Better power-to-weight ratio than a traditional engine, but consumes more " -"fuel." -msgstr "" - -#: lang/json/vehicle_part_from_json.py -msgid "" -"A closed cycle, external combustion steam engine. Burns coal or charcoal " -"from a bunker in the vehicle to produce steam." -msgstr "" - -#: lang/json/vehicle_part_from_json.py -msgid "boom crane" -msgstr "" - -#. ~ Description for boom crane -#. ~ Description for internal boom crane -#: lang/json/vehicle_part_from_json.py -msgid "" -"A rigid steel boom crane. If it is in your line of sight and within two " -"tiles of another vehicle, you will automatically use it when you want jack " -"up the other vehicle to change the its wheels. 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." -msgstr "" - -#: lang/json/vehicle_part_from_json.py -msgid "internal boom crane" -msgstr "" - -#: lang/json/vehicle_part_from_json.py -msgid "telescopic crane" -msgstr "" - -#. ~ Description for telescopic crane -#: lang/json/vehicle_part_from_json.py -msgid "" -"An extendable cantilever crane. If it is in your line of sight and within " -"two tiles of another vehicle, you will automatically use it when you want " -"jack up the other vehicle to change the its wheels. 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." -msgstr "" - -#. ~ Description for pallet lifter -#: lang/json/vehicle_part_from_json.py -msgid "" -"A small pallet lifter. If it is in your line of sight and within two tiles " -"of another vehicle, you will automatically use it when you want jack up the " -"other vehicle to change the its wheels. 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." -msgstr "" - -#: lang/json/vehicle_part_from_json.py -msgid "forklift arm" -msgstr "" - -#. ~ Description for forklift arm -#: lang/json/vehicle_part_from_json.py -msgid "" -"A pair of forklift arms. If it is in your line of sight and within two " -"tiles of another vehicle, you will automatically use it when you want jack " -"up the other vehicle to change the its wheels. 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." -msgstr "" - -#. ~ Description for rockwheel -#: lang/json/vehicle_part_from_json.py -msgid "" -"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." -msgstr "" - -#: lang/json/vehicle_part_from_json.py -msgid "air jack system" -msgstr "" - -#: lang/json/vehicle_part_from_json.py -msgid "foldable light frame" -msgstr "" - -#. ~ Description for foldable light frame -#: lang/json/vehicle_part_from_json.py -msgid "" -"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." -msgstr "" - -#. ~ Description for foldable wooden frame -#: lang/json/vehicle_part_from_json.py -msgid "" -"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." -msgstr "" - -#: lang/json/vehicle_part_from_json.py -msgid "frame" -msgstr "" - -#. ~ Description for frame -#: lang/json/vehicle_part_from_json.py -msgid "" -"A metal framework. Other vehicle components can be mounted on it, and it " -"can be attached to other frames to increase the vehicle's size." -msgstr "" - -#. ~ Description for wooden frame -#: lang/json/vehicle_part_from_json.py -msgid "" -"A wooden framework. Other vehicle components can be mounted on it, and it " -"can be attached to other frames to increase the vehicle's size. Wood and " -"nail construction means it can be constructed and added to the vehicle " -"without welding tools." -msgstr "" - -#. ~ Description for light wooden frame -#: lang/json/vehicle_part_from_json.py -msgid "" -"A light wooden framework. Other vehicle components can be mounted on it, " -"and it can be attached to other frames to increase the vehicle's size. Wood " -"and rope constructions means it can be constructed and added to the vehicle " -"without welding tools or nails." -msgstr "" - -#. ~ Description for heavy duty frame -#: lang/json/vehicle_part_from_json.py -msgid "" -"A heavy metal framework. Other vehicle components can be mounted on it, and " -"it can be attached to other frames to increase the vehicle's size. " -"Increased mass makes it more resistant to damage in collisions." -msgstr "" - -#: lang/json/vehicle_part_from_json.py -msgid "extra light frame" -msgstr "" - -#. ~ Description for extra light frame -#: lang/json/vehicle_part_from_json.py -msgid "" -"A light metal framework. Other vehicle components can be mounted on it, and " -"it can be attached to other frames to increase the vehicle's size." -msgstr "" - -#: lang/json/vehicle_part_from_json.py src/vehicle_use.cpp -msgid "aisle lights" -msgstr "" - -#. ~ Description for atomic lamp -#: lang/json/vehicle_part_from_json.py -msgid "" -"A bright light, self-powered by an atomic decay reaction that never stops. " -"When turned on, it illuminates several squares inside the vehicle." -msgstr "" - -#: lang/json/vehicle_part_from_json.py -msgid "atomic nightlight" -msgstr "" - -#. ~ Description for atomic nightlight -#: lang/json/vehicle_part_from_json.py -msgid "" -"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." -msgstr "" - -#. ~ Description for floodlight -#: lang/json/vehicle_part_from_json.py -msgid "" -"A very bright, circular light that illuminates the area outside the vehicle " -"when turned on." -msgstr "" - -#. ~ Description for directed floodlight -#: lang/json/vehicle_part_from_json.py -msgid "" -"A very bright, directed light that illuminates a half-circular area outside " -"the vehicle when turned on. During installation, you can choose what " -"direction to point the light." -msgstr "" - -#: lang/json/vehicle_part_from_json.py -msgid "headlight" -msgstr "" - -#. ~ Description for headlight -#: lang/json/vehicle_part_from_json.py -msgid "" -"A bright light that illuminates a narrow cone outside the vehicle when " -"turned on. During installation, you can choose what direction to point the " -"light, so multiple headlights can illuminate the sides or rear, as well as " -"the front." -msgstr "" - -#. ~ Description for motorcycle headlight -#: lang/json/vehicle_part_from_json.py -msgid "" -"A small, lightweight, bright light that illuminates a narrow cone outside " -"the vehicle when turned on. During installation, you can choose what " -"direction to point the light, so multiple headlights can illuminate the " -"sides or rear, as well as the front." -msgstr "" - -#: lang/json/vehicle_part_from_json.py -msgid "wide angle headlight" -msgstr "" - -#. ~ Description for wide angle headlight -#: lang/json/vehicle_part_from_json.py -msgid "" -"A bright light that illuminates a wide cone outside the vehicle when turned " -"on. During installation, you can choose what direction to point the light, " -"so multiple headlights can illuminate the sides or rear, as well as the " -"front." -msgstr "" - -#: lang/json/vehicle_part_from_json.py -msgid "" -"Emergency lights, like a police car's or ambulance's, mounted on the " -"vehicle's roof. Flashes between red and blue when turned on, attracting " -"attention without illuminating the area." -msgstr "" - -#: lang/json/vehicle_part_from_json.py -msgid "blue light" -msgstr "" - -#: lang/json/vehicle_part_from_json.py -msgid "red light" -msgstr "" - -#: lang/json/vehicle_part_from_json.py -msgid "aisle with lights" -msgstr "" - -#: lang/json/vehicle_part_from_json.py -msgid "foot pedals" -msgstr "" - -#. ~ Description for foot pedals -#: lang/json/vehicle_part_from_json.py -msgid "" -"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." -msgstr "" - -#: lang/json/vehicle_part_from_json.py -msgid "hand rims" -msgstr "" - -#. ~ Description for hand rims -#: lang/json/vehicle_part_from_json.py -msgid "" -"A set of wheelchair style wheels. If mounted on the same tile as seat, they " -"allow you to move the vehicle at the cost of your stamina." -msgstr "" - -#. ~ Description for electric motor -#: lang/json/vehicle_part_from_json.py -msgid "An electric motor." -msgstr "" - -#: lang/json/vehicle_part_from_json.py -msgid "" -"A reinforced ram. Place at the edge of vehicle to reduce damage taken in " -"collisions, and to increase damaged delivered in collisions, if the ram is " -"the first vehicle part to collide." -msgstr "" - -#: lang/json/vehicle_part_from_json.py -msgid "superalloy ram" -msgstr "" - -#: lang/json/vehicle_part_from_json.py -msgid "heavy steel ram" -msgstr "" - -#: lang/json/vehicle_part_from_json.py -msgid "military composite ram" -msgstr "" - -#: lang/json/vehicle_part_from_json.py -msgid "spiked ram" -msgstr "" - -#: lang/json/vehicle_part_from_json.py -msgid "steel ram" -msgstr "" - -#: lang/json/vehicle_part_from_json.py -msgid "wooden ram" -msgstr "" - -#: lang/json/vehicle_part_from_json.py -msgid "chitin ram" -msgstr "" - -#: lang/json/vehicle_part_from_json.py -msgid "biosilicfied chitin ram" -msgstr "" - -#. ~ Description for shredder -#: lang/json/vehicle_part_from_json.py -msgid "" -"A circular blade, powered by the vehicle's engine. It will dramatically " -"increase the damage the vehicle delivers in collisions. Mount on the edges " -"of the vehicle, preferably the front." -msgstr "" - -#: lang/json/vehicle_part_from_json.py -msgid "vehicle tank (2L)" -msgstr "" - -#. ~ Description for vehicle tank (2L) -#. ~ Description for vehicle tank (10L) -#. ~ Description for vehicle tank (20L) -#. ~ Description for vehicle tank (60L) -#: lang/json/vehicle_part_from_json.py -msgid "" -"A storage space for holding liquids. If filled with the appropriate fuel " -"for the vehicle's engine, the engine will automatically draw fuel from the " -"tank when the engine is on. If filled with water, you can access the water " -"from a water faucet, if one is installed in the vehicle. You can also use a " -"rubber hose to siphon liquids out of a tank." -msgstr "" - -#: lang/json/vehicle_part_from_json.py -msgid "vehicle tank (10L)" -msgstr "" - -#: lang/json/vehicle_part_from_json.py -msgid "vehicle tank (20L)" -msgstr "" - -#: lang/json/vehicle_part_from_json.py -msgid "vehicle tank (60L)" -msgstr "" - -#: lang/json/vehicle_part_from_json.py -msgid "external tank (100L)" -msgstr "" - -#. ~ Description for external tank (100L) -#: lang/json/vehicle_part_from_json.py -msgid "" -"A storage space for holding liquids, mounted outside the vehicle's walls and " -"armor. If filled with the appropriate fuel for the vehicle's engine, the " -"engine will automatically draw fuel from the tank when the engine is on. If " -"filled with water, you can access the water from a water faucet, if one is " -"installed in the vehicle. You can also use a rubber hose to siphon liquids " -"out of a tank." -msgstr "" - -#: lang/json/vehicle_part_from_json.py -msgid "external tank (200L)" -msgstr "" - -#: lang/json/vehicle_part_from_json.py -msgid "wooden barrel (100L)" -msgstr "" - -#. ~ Description for wooden barrel (100L) -#. ~ Description for steel drum (100L) -#: lang/json/vehicle_part_from_json.py -msgid "" -"A storage space for holding liquids, mounted inside the cargo or passenger " -"space. If filled with the appropriate fuel for the vehicle's engine, the " -"engine will automatically draw fuel from the tank when the engine is on. If " -"filled with water, you can access the water from a water faucet, if one is " -"installed in the vehicle. You can also use a rubber hose to siphon liquids " -"out of a tank." -msgstr "" - -#. ~ Description for fuel bunker -#: lang/json/vehicle_part_from_json.py -msgid "" -"A storage space for holding solid fuels. If filled with the appropriate " -"fuel for the vehicle's engine, the engine will automatically draw fuel from " -"the tank when the engine is on." -msgstr "" - -#: lang/json/vehicle_part_from_json.py -msgid "mounted flamethrower" -msgstr "" - -#: lang/json/vehicle_part_from_json.py -msgid "mounted fusion gun" -msgstr "" - -#: lang/json/vehicle_part_from_json.py -msgid "mounted A7 laser rifle" -msgstr "" - -#: lang/json/vehicle_part_from_json.py -msgid "mounted M249" -msgstr "" - -#: lang/json/vehicle_part_from_json.py -msgid "mounted automatic shotgun" -msgstr "" - -#: lang/json/vehicle_part_from_json.py -msgid "mounted M2 Browning" -msgstr "" - -#: lang/json/vehicle_part_from_json.py -msgid "mounted M134D-H Minigun" -msgstr "" - -#: lang/json/vehicle_part_from_json.py -msgid "mounted Browning Automatic Rifle" -msgstr "" - -#: lang/json/vehicle_part_from_json.py -msgid "mounted M240" -msgstr "" - -#: lang/json/vehicle_part_from_json.py -msgid "mounted M60" -msgstr "" - -#: lang/json/vehicle_part_from_json.py -msgid "mounted Mark 19 grenade launcher" -msgstr "" - -#: lang/json/vehicle_part_from_json.py -msgid "mounted RM298 HMG" -msgstr "" - -#: lang/json/vehicle_part_from_json.py -msgid "mounted RM614 LMG" -msgstr "" - -#: lang/json/vehicle_part_from_json.py -msgid "mounted plasma gun" -msgstr "" - #. ~ Description for metal wheel #. ~ Description for roller drum #: lang/json/vehicle_part_from_json.py @@ -143581,8 +146383,8 @@ msgstr "" #: src/activity_handlers.cpp msgid "" "To perform a full butchery on a corpse this big, you need either a " -"butchering rack or both a long rope in your inventory and a nearby tree to " -"hang the corpse from." +"butchering rack, a nearby hanging meathook, or both a long rope in your " +"inventory and a nearby tree to hang the corpse from." msgstr "" #: src/activity_handlers.cpp @@ -143649,7 +146451,7 @@ msgstr "" #: src/activity_handlers.cpp msgid "" -"You notice some strange organs, pehraps harvestable via careful dissection." +"You notice some strange organs, perhaps harvestable via careful dissection." msgstr "" #: src/activity_handlers.cpp @@ -144650,6 +147452,11 @@ msgstr "" msgid "The pet has moved somewhere else." msgstr "" +#: src/activity_item_handling.cpp +#, c-format +msgid "%s can't reach the source tile to construct." +msgstr "" + #: src/activity_item_handling.cpp #, c-format msgid "%s can't reach the source tile. Try to sort out loot without a cart." @@ -145239,11 +148046,6 @@ msgstr "" msgid "Invalid container" msgstr "" -#: src/advanced_inv.cpp src/armor_layers.cpp src/construction.cpp -#: src/options.cpp src/scenario.cpp -msgid "All" -msgstr "" - #: src/animation.cpp msgid "Hang on a bit..." msgstr "" @@ -146303,11 +149105,11 @@ msgstr "" msgid "autopickup configuration" msgstr "" -#: src/avatar.cpp +#: src/avatar.cpp src/iuse.cpp msgid "He" msgstr "" -#: src/avatar.cpp +#: src/avatar.cpp src/iuse.cpp msgid "She" msgstr "" @@ -146750,8 +149552,8 @@ msgstr[1] "" #: src/avatar.cpp #, c-format -msgid "This book contains %1$u crafting recipe: %2$s" -msgid_plural "This book contains %1$u crafting recipes: %2$s" +msgid "This book contains %1$zu crafting recipe: %2$s" +msgid_plural "This book contains %1$zu crafting recipes: %2$s" msgstr[0] "" msgstr[1] "" @@ -146955,6 +149757,11 @@ msgstr "" msgid "You need a free arm to drive!" msgstr "" +#: src/avatar_action.cpp +#, c-format +msgid "Your %s is too clogged with blackpowder fouling to fire." +msgstr "" + #: src/avatar_action.cpp #, c-format msgid "You need two free hands to fire your %s." @@ -147729,7 +150536,7 @@ msgstr "" #: src/bionics.cpp msgid "" "You set up the operation step-by-step, configuring the Autodoc to manipulate " -"a CBM" +"a CBM." msgstr "" #: src/bionics.cpp @@ -148621,10 +151428,6 @@ msgstr "" msgid "Wielding:" msgstr "" -#: src/character.cpp src/iuse_actor.cpp -msgid "Nothing" -msgstr "" - #: src/character.cpp msgid "Wearing:" msgstr "" @@ -148757,6 +151560,10 @@ msgstr "" msgid "EXTRA_EXERCISE" msgstr "" +#: src/character.cpp +msgid "You try to shout but you have no face!" +msgstr "" + #: src/character.cpp msgid "a piercing howl!" msgstr "" @@ -149097,6 +151904,14 @@ msgstr "" msgid "Items inside of this zone are ignored by \"sort out loot\" zone-action." msgstr "" +#: src/clzones.cpp +msgid "Construction: Blueprint" +msgstr "" + +#: src/clzones.cpp +msgid "Designate a blueprint zone for construction." +msgstr "" + #: src/clzones.cpp msgid "Farm: Plot" msgstr "" @@ -149119,6 +151934,18 @@ msgstr "" msgid "No seed" msgstr "" +#: src/clzones.cpp +msgid "No construction" +msgstr "" + +#: src/clzones.cpp +msgid "Construct: " +msgstr "" + +#: src/clzones.cpp +msgid "No Construction" +msgstr "" + #: src/clzones.cpp msgid "Plant seed: " msgstr "" @@ -149383,6 +152210,14 @@ msgid "" "key..." msgstr "" +#: src/computer.cpp +msgid "Warning: resticted data access. Attempt logged. Press any key..." +msgstr "" + +#: src/computer.cpp +msgid "Press any key..." +msgstr "" + #: src/computer.cpp msgid "" "Surface map data downloaded. Local anomalous-access error logged. Press " @@ -149459,10 +152294,6 @@ msgid_plural "%d OTHERS FOUND..." msgstr[0] "" msgstr[1] "" -#: src/computer.cpp -msgid "Press any key..." -msgstr "" - #: src/computer.cpp msgid "Elevator activated. Press any key..." msgstr "" @@ -150089,38 +152920,6 @@ msgstr "" msgid "You can not construct anything here." msgstr "" -#: src/construction.cpp src/init.cpp -msgid "Constructions" -msgstr "" - -#: src/construction.cpp -msgid "Digging and Mining" -msgstr "" - -#: src/construction.cpp src/init.cpp -msgid "Furniture" -msgstr "" - -#: src/construction.cpp -msgid "Decorative" -msgstr "" - -#: src/construction.cpp -msgid "Farming and Woodcutting" -msgstr "" - -#: src/construction.cpp src/iuse_actor.cpp -msgid "Reinforcing" -msgstr "" - -#: src/construction.cpp src/iuse_actor.cpp -msgid "Repairing" -msgstr "" - -#: src/construction.cpp -msgid "Others" -msgstr "" - #: src/construction.cpp msgid "Move tab right" msgstr "" @@ -150251,7 +153050,12 @@ msgstr "" #: src/construction.cpp #, c-format -msgid "You disassemble the %s." +msgid "The %s is disassembled." +msgstr "" + +#: src/construction.cpp +#, c-format +msgid "That %s can not be dissasembled, since there is furniture above it." msgstr "" #: src/construction.cpp @@ -151066,15 +153870,6 @@ msgid "" "Really disassemble?" msgstr "" -#: src/crafting.cpp -msgid "The item has vanished." -msgstr "" - -#: src/crafting.cpp -msgid "" -"The item might be gone, at least it is not at the expected position anymore." -msgstr "" - #: src/crafting.cpp #, c-format msgid "You disassemble the %s into its components." @@ -151792,7 +154587,7 @@ msgstr "" msgid "You teleport to overmap (%d,%d,%d)." msgstr "" -#: src/debug_menu.cpp src/iuse.cpp +#: src/debug_menu.cpp src/npctrade.cpp msgid "You" msgstr "" @@ -151953,6 +154748,10 @@ msgstr "" msgid "Set [A]ttitude" msgstr "" +#: src/debug_menu.cpp +msgid "Set [O]pinion" +msgstr "" + #: src/debug_menu.cpp msgid "Maximum strength" msgstr "" @@ -152008,6 +154807,51 @@ msgstr "" msgid "Set the morale to? Currently: %d" msgstr "" +#: src/debug_menu.cpp +msgid "trust" +msgstr "" + +#: src/debug_menu.cpp +msgid "fear" +msgstr "" + +#: src/debug_menu.cpp +msgid "value" +msgstr "" + +#: src/debug_menu.cpp +msgid "anger" +msgstr "" + +#: src/debug_menu.cpp +msgid "owed" +msgstr "" + +#: src/debug_menu.cpp +#, c-format +msgid "Set trust to? Currently: %d" +msgstr "" + +#: src/debug_menu.cpp +#, c-format +msgid "Set fear to? Currently: %d" +msgstr "" + +#: src/debug_menu.cpp +#, c-format +msgid "Set value to? Currently: %d" +msgstr "" + +#: src/debug_menu.cpp +#, c-format +msgid "Set anger to? Currently: %d" +msgstr "" + +#: src/debug_menu.cpp +#, c-format +msgid "Set owed to? Currently: %d" +msgstr "" + #: src/debug_menu.cpp msgid "Rename:" msgstr "" @@ -152542,10 +155386,6 @@ msgstr "" msgid "Zombies" msgstr "" -#: src/defense.cpp -msgid "Spiders" -msgstr "" - #: src/defense.cpp msgid "Triffids" msgstr "" @@ -153474,7 +156314,7 @@ msgstr "" msgid "pain" msgstr "" -#: src/effect.cpp +#: src/effect.cpp src/magic.cpp msgid "fatigue" msgstr "" @@ -156795,7 +159635,15 @@ msgstr "" #: src/game.cpp #, c-format msgid "" -"Without extra fuel it might burn yet for %s, but might also go out sooner." +"Without extra fuel it might burn yet for maybe %s, but might also go out " +"sooner." +msgstr "" + +#: 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 "" #: src/game.cpp @@ -156815,7 +159663,12 @@ msgstr "" #: src/game.cpp #, c-format -msgid "Without extra fuel it will burn for %s." +msgid "Without extra fuel it will burn for about %s." +msgstr "" + +#: src/game.cpp +#, c-format +msgid "Without extra fuel it will burn for between %s to %s." msgstr "" #: src/game.cpp @@ -157456,7 +160309,7 @@ msgstr "" msgid "Your tentacles stick to the ground, but you pull them free." msgstr "" -#: src/game.cpp src/monmove.cpp +#: src/game.cpp msgid "footsteps" msgstr "" @@ -158535,7 +161388,17 @@ msgstr "" #: src/game_inventory.cpp #, c-format -msgid "Available anesthesia: %i" +msgid "Available kit: %i" +msgstr "" + +#: src/game_inventory.cpp +#, c-format +msgid "Available anesthetic: %i mL" +msgstr "" + +#: src/game_inventory.cpp +#, c-format +msgid "Bionic removal patient: %s" msgstr "" #: src/game_inventory.cpp @@ -158575,6 +161438,11 @@ msgstr "" msgid "CBM not compatible with patient" msgstr "" +#: src/game_inventory.cpp +#, c-format +msgid "%i mL" +msgstr "" + #: src/game_inventory.cpp #, c-format msgid "%i minutes" @@ -158601,8 +161469,7 @@ msgid "%i%%" msgstr "" #: src/game_inventory.cpp -#, c-format -msgid "%i mL" +msgid "kit available" msgstr "" #: src/gamemode.cpp @@ -159036,6 +161903,14 @@ msgstr "" msgid "Harvest any full-grown plants from nearby Farm: Plot zones" msgstr "" +#: src/handle_action.cpp +msgid "Construct Plots" +msgstr "" + +#: src/handle_action.cpp +msgid "Work on any nearby Blueprint: construction zones" +msgstr "" + #: src/handle_action.cpp msgid "You need a tool to dig with." msgstr "" @@ -159122,6 +161997,12 @@ msgstr "" msgid "Unknown command: \"%s\" (%ld)" msgstr "" +#: src/handle_action.cpp +#, c-format +msgid "" +"%s at any time to see and edit keybindings relevant to the current context." +msgstr "" + #: src/handle_action.cpp msgid "You can't go down stairs while you're riding." msgstr "" @@ -159478,6 +162359,10 @@ msgstr "" msgid "You need a cash card before you can withdraw money!" msgstr "" +#: src/iexamine.cpp +msgid "You need to pay down your debt first!" +msgstr "" + #: src/iexamine.cpp msgid "You need money in your account before you can withdraw money!" msgstr "" @@ -159494,6 +162379,11 @@ msgstr "" msgid "Transfer All Money" msgstr "" +#: src/iexamine.cpp +#, c-format +msgid "Your debt is now %s." +msgstr "" + #: src/iexamine.cpp #, c-format msgid "Your account now holds %s." @@ -159580,6 +162470,42 @@ msgstr "" msgid "Looks like you need a %s." msgstr "" +#: src/iexamine.cpp +msgid "Press mask on the reader?" +msgstr "" + +#: src/iexamine.cpp +msgid "You press your face on the reader." +msgstr "" + +#: src/iexamine.cpp +msgid "The nearby doors are unlocked." +msgstr "" + +#: src/iexamine.cpp +msgid "\"Hello Foodperson. Welcome home.\"" +msgstr "" + +#: src/iexamine.cpp +msgid "The nearby doors are already unlocked." +msgstr "" + +#: src/iexamine.cpp +msgid "Lock doors?" +msgstr "" + +#: src/iexamine.cpp +msgid "You are in the way of the door, move before trying again." +msgstr "" + +#: src/iexamine.cpp +msgid "\"FOODPERSON DETECTED. Please make yourself presentable.\"" +msgstr "" + +#: src/iexamine.cpp +msgid "\"Your face is inadequate. Please go away.\"" +msgstr "" + #: src/iexamine.cpp msgid "No one responds." msgstr "" @@ -159646,7 +162572,7 @@ msgstr "" msgid "Take down the %s?" msgstr "" -#: src/iexamine.cpp src/map.cpp +#: src/iexamine.cpp #, c-format msgid "You take down the %s." msgstr "" @@ -160775,48 +163701,6 @@ msgstr "" msgid "Splint broken limbs" msgstr "" -#: src/iexamine.cpp -msgid "" -"You need an anesthesia kit with at least one charge for autodoc to perform " -"any bionic manipulation." -msgstr "" - -#. ~ %1$s is the bionic CBM display name, %2$s is the patient name -#: src/iexamine.cpp -#, c-format -msgid "%1$s cannot be installed on %2$s." -msgstr "" - -#. ~ %1$s is patient name -#: src/iexamine.cpp src/iuse_actor.cpp -msgid "You have already installed this bionic." -msgstr "" - -#: src/iexamine.cpp -#, c-format -msgid "%1$s has already installed this bionic." -msgstr "" - -#. ~ %1$s is patient name -#: src/iexamine.cpp -msgid "You have no base version of this bionic to upgrade." -msgstr "" - -#: src/iexamine.cpp -#, c-format -msgid "%1$s has no base version of this bionic to upgrade." -msgstr "" - -#. ~ %1$s is patient name -#: src/iexamine.cpp -msgid "You have already installed a superior version of this bionic." -msgstr "" - -#: src/iexamine.cpp -#, c-format -msgid "%1$s has installed a superior version of this bionic." -msgstr "" - #. ~ %1$s is patient name #: src/iexamine.cpp msgid "You don't have any bionics installed." @@ -162039,6 +164923,12 @@ msgstr "" msgid "This ammo has been hand-loaded." msgstr "" +#: src/item.cpp +msgid "" +"This ammo has been loaded with blackpowder, and will quickly clog " +"up most guns, and cause rust if the gun is not cleaned." +msgstr "" + #: src/item.cpp msgid "This ammo never misfires." msgstr "" @@ -163332,6 +166222,11 @@ msgstr "" msgid "You need an UPS to run the %s!" msgstr "" +#: src/item.cpp +#, c-format +msgid "Your %s rusts due to blackpowder fouling." +msgstr "" + #: src/item.cpp #, c-format msgid "%s %s disappears!" @@ -165305,10 +168200,6 @@ msgstr "" msgid "Select storage media" msgstr "" -#: src/iuse.cpp -msgid "Nevermind." -msgstr "" - #: src/iuse.cpp #, c-format msgid "There's nothing to use the %s on here." @@ -165895,6 +168786,10 @@ msgstr "" msgid "Your tablet already has a recipe for %s." msgstr "" +#: src/iuse.cpp +msgid "You have downloaded your photos." +msgstr "" + #: src/iuse.cpp msgid "You have updated your monster collection." msgstr "" @@ -165925,7 +168820,7 @@ msgstr "" #: src/iuse.cpp #, c-format -msgid "Photos [%d]" +msgid "Unsorted photos [%d]" msgstr "" #: src/iuse.cpp @@ -165949,6 +168844,10 @@ msgstr "" msgid "View recipes on E-ink screen" msgstr "" +#: src/iuse.cpp +msgid "Your photos" +msgstr "" + #: src/iuse.cpp msgid "Your collection of monsters" msgstr "" @@ -166054,86 +168953,343 @@ msgid "You tripped the firmware protection, and the card deleted its data!" msgstr "" #: src/iuse.cpp -msgid "What to do with camera?" +msgid " on " msgstr "" #: src/iuse.cpp -msgid "Take a photo" +#, c-format +msgid " covered in %s" msgstr "" #: src/iuse.cpp -msgid "List photos" +#, c-format +msgid " on %s" msgstr "" #: src/iuse.cpp -msgid "Upload photos to memory card" +#, c-format +msgid " under %s" msgstr "" #: src/iuse.cpp -msgid "No photos in memory" +#, c-format +msgid " illuminated by %s" msgstr "" #: src/iuse.cpp -msgid "There's nothing particularly interesting there." +#, c-format +msgid " with graffiti \"%s\"" msgstr "" #: src/iuse.cpp #, c-format -msgid "%s looks blinded." +msgid " with message \"%s\"" +msgstr "" + +#: src/iuse.cpp +#, c-format +msgid " with %s on it" +msgstr "" + +#: src/iuse.cpp +msgctxt "" +"Article 'a', replace it with empty string if it is not used in language" +msgid "a " +msgstr "" + +#: src/iuse.cpp +msgid " is on fire. " +msgstr "" + +#: src/iuse.cpp +msgid " is bleeding. " +msgstr "" + +#: src/iuse.cpp +msgid " looks happy. " +msgstr "" + +#: src/iuse.cpp +msgid "downed" +msgstr "" + +#: src/iuse.cpp +msgid "stuck" +msgstr "" + +#: src/iuse.cpp +msgid " is stunned. " +msgstr "" + +#: src/iuse.cpp +msgid " is dazed. " +msgstr "" + +#: src/iuse.cpp +msgid " is stuck in beartrap. " +msgstr "" + +#: src/iuse.cpp +msgid " have tiny red dot on body. " +msgstr "" + +#: src/iuse.cpp +msgid " is covered in bile. " +msgstr "" + +#: src/iuse.cpp +msgid " is covered in glowing goo. " +msgstr "" + +#: src/iuse.cpp +msgid " is covered in thick goo. " +msgstr "" + +#: src/iuse.cpp +msgid " is covered in acid. " +msgstr "" + +#: src/iuse.cpp +msgid " is coated in sap. " +msgstr "" + +#: src/iuse.cpp +msgid " is covered in webs. " +msgstr "" + +#: src/iuse.cpp +msgid " is covered in spores. " msgstr "" #: src/iuse.cpp -msgid "Strange... there's nothing in the picture?" +msgid " lies under collapsed debris. " +msgstr "" + +#: src/iuse.cpp +msgid "lies" +msgstr "" + +#: src/iuse.cpp +msgid " looks very tired. " +msgstr "" + +#: src/iuse.cpp +msgid " is sleeping. " +msgstr "" + +#: src/iuse.cpp +msgid " is lit. " +msgstr "" + +#: src/iuse.cpp +msgid " is saddled. " +msgstr "" + +#: src/iuse.cpp +msgid " is being harnessed by a vehicle. " +msgstr "" + +#: src/iuse.cpp +msgid " is wearing armor. " +msgstr "" + +#: src/iuse.cpp +msgid " have bag attached. " +msgstr "" + +#: src/iuse.cpp +msgid " is tied. " +msgstr "" + +#: src/iuse.cpp +msgid "balancing" +msgstr "" + +#: src/iuse.cpp +msgctxt "Someone" +msgid " looks sad. " +msgstr "" + +#: src/iuse.cpp +msgctxt "Someone" +msgid " looks depressed. " +msgstr "" + +#: src/iuse.cpp +msgctxt "Someone" +msgid " is writhing in pain. " +msgstr "" + +#: src/iuse.cpp +msgid "rides" msgstr "" #: src/iuse.cpp #, c-format -msgid "You took a photo of %s." +msgid " is riding %s. " +msgstr "" + +#: src/iuse.cpp +msgid "A bionic LED is glowing softly. " msgstr "" #: src/iuse.cpp #, c-format -msgid "You took a %1$s photo of %2$s." +msgid "%1$s from %2$s" msgstr "" #: src/iuse.cpp #, c-format -msgid "A %s got in the way of your photo." +msgid "%1$s with a %2$s" msgstr "" #: src/iuse.cpp -msgid "This photo is better than the previous one." +#, c-format +msgctxt "someone stands/sits *on* something" +msgid " on a %s." msgstr "" #: src/iuse.cpp -msgid "You took a selfie." +#, c-format +msgid "Nearby is %s." +msgid_plural "Nearby are %s." +msgstr[0] "" +msgstr[1] "" + +#: src/iuse.cpp +msgid "sits" +msgstr "" + +#: src/iuse.cpp +msgid "stands" +msgstr "" + +#: src/iuse.cpp +msgctxt "Pronoun" +msgid "It" +msgstr "" + +#: src/iuse.cpp +msgid "This is a photo of " msgstr "" -#. ~ 1s - thing being photographed, 2s - photo quality (adjective). #: src/iuse.cpp #, c-format -msgid "You took a photo of %1$s. It is %2$s." +msgid "It lies on the %s." msgstr "" #: src/iuse.cpp #, c-format -msgid "%s got in the way of your photo." +msgid "There is something lying on the ground: %s." +msgid_plural "There are some things lying on the ground: %s." +msgstr[0] "" +msgstr[1] "" + +#: src/iuse.cpp +#, c-format +msgid "Something is visible in the background: %s." +msgid_plural "Some objects are visible in the background: %s." +msgstr[0] "" +msgstr[1] "" + +#: src/iuse.cpp +#, c-format +msgid "There is %s parked in the background." +msgid_plural "There are %s parked in the background." +msgstr[0] "" +msgstr[1] "" + +#: src/iuse.cpp +#, c-format +msgid "There is %s in the background." +msgid_plural "There are %s in the background." +msgstr[0] "" +msgstr[1] "" + +#: src/iuse.cpp +#, c-format +msgid "In the background you can see a %s" +msgstr "" + +#: src/iuse.cpp +msgid "" +"\n" +"\n" +"This photo was taken outside." +msgstr "" + +#: src/iuse.cpp +msgid "" +"\n" +"\n" +"This photo was taken inside." +msgstr "" + +#: src/iuse.cpp +msgid " interior" +msgstr "" + +#: src/iuse.cpp +msgid "" +"\n" +"\n" +"This photo was taken mostly inside, but " +"outside can be seen." +msgstr "" + +#: src/iuse.cpp +msgid "" +"\n" +"\n" +"This photo was taken mostly outside, but " +"inside can be seen." +msgstr "" + +#: src/iuse.cpp +msgid "It is sunrise. " +msgstr "" + +#: src/iuse.cpp +msgid "It is sunset. " +msgstr "" + +#: src/iuse.cpp +msgid "It is night. " +msgstr "" + +#: src/iuse.cpp +msgid "It is day. " +msgstr "" + +#: src/iuse.cpp +#, c-format +msgid "The weather is %s." +msgstr "" + +#: src/iuse.cpp +#, c-format +msgid "%s appearance:" msgstr "" -#. ~ 1s - name of the photographed NPC, 2s - timestamp of the photo, for example Year 1, Spring, day 0 08:01:54. #: src/iuse.cpp #, c-format -msgid "This is a photo of %1$s." +msgctxt "Date" +msgid "The photo was taken on %s." msgstr "" #: src/iuse.cpp #, c-format -msgid "Also in the picture: %1$s." +msgid "The quality of %s image is better than the previous one." msgstr "" #: src/iuse.cpp #, c-format -msgid "The photo was taken on %1$s." +msgid "The quality of stored %s image is already maximally detailed." +msgstr "" + +#: src/iuse.cpp +#, c-format +msgid "But the quality of %s image is worse than the previous one." msgstr "" #: src/iuse.cpp @@ -166141,7 +169297,64 @@ msgid "You can't see the camera screen, you're blind." msgstr "" #: src/iuse.cpp -msgid "Critter photos saved on camera:" +msgid "Photos saved on camera:" +msgstr "" + +#: src/iuse.cpp +msgid "What to do with camera?" +msgstr "" + +#: src/iuse.cpp +msgid "Take a photo" +msgstr "" + +#: src/iuse.cpp +msgid "No photos in memory" +msgstr "" + +#: src/iuse.cpp +msgid "List photos" +msgstr "" + +#: src/iuse.cpp +msgid "Upload photos to memory card" +msgstr "" + +#: src/iuse.cpp +msgid "You have the wrong camera focus." +msgstr "" + +#: src/iuse.cpp +#, c-format +msgid "A %s got in the way of your photo." +msgstr "" + +#: src/iuse.cpp +msgid "Strange... there's nothing in the center of picture?" +msgstr "" + +#: src/iuse.cpp +#, c-format +msgid "%s got in the way of your photo." +msgstr "" + +#: src/iuse.cpp +msgid "You took a selfie." +msgstr "" + +#: src/iuse.cpp +#, c-format +msgid "You took a photo of %s." +msgstr "" + +#: src/iuse.cpp +#, c-format +msgid "You took a photo of %1$s. It is %2$s." +msgstr "" + +#: src/iuse.cpp +#, c-format +msgid "%s looks blinded." msgstr "" #: src/iuse.cpp @@ -166153,7 +169366,7 @@ msgid "Are you sure you want to clear the old data on the card?" msgstr "" #: src/iuse.cpp -msgid "You upload monster photos to memory card." +msgid "You upload your photos and monster collection to memory card." msgstr "" #: src/iuse.cpp @@ -166199,6 +169412,11 @@ msgstr "" msgid "The %s have discharged and can be taken off." msgstr "" +#: src/iuse.cpp +#, c-format +msgid "Your HUD lights-up: \"Your shift ends in %s\"." +msgstr "" + #: src/iuse.cpp msgid "Using RC car:" msgstr "" @@ -166558,7 +169776,7 @@ msgstr "" msgid "The %1$s reads %2$s." msgstr "" -#: src/iuse.cpp +#: src/iuse.cpp src/iuse_actor.cpp #, c-format msgid "You need to wear the %1$s before activating it." msgstr "" @@ -167755,6 +170973,10 @@ msgstr "" msgid "You can't self-install bionics." msgstr "" +#: src/iuse_actor.cpp +msgid "You have already installed this bionic." +msgstr "" + #: src/iuse_actor.cpp msgid "There is nothing to upgrade." msgstr "" @@ -169061,7 +172283,7 @@ msgid "ERROR: Invalid damage type string. Defaulting to none" msgstr "" #: src/magic.cpp -msgid "Difficult!" +msgid "Too Difficult!" msgstr "" #: src/magic.cpp @@ -169095,8 +172317,7 @@ msgstr "" #: src/magic.cpp #, c-format msgid "" -"Learning this spell will make you a %s and lock you out of other unique " -"spells.\n" +"Learning this spell will make you a %s and lock you out of %s\n" "Continue?" msgstr "" @@ -169109,6 +172330,11 @@ msgstr "" msgid "You can't learn this spell." msgstr "" +#: src/magic.cpp +#, c-format +msgid "All knowledge of %s leaves you." +msgstr "" + #: src/magic.cpp msgid "Ignore Distractions" msgstr "" @@ -169117,43 +172343,151 @@ msgstr "" msgid "Popup Distractions" msgstr "" +#: src/magic.cpp +msgid "Spell Level" +msgstr "" + +#: src/magic.cpp +msgid "(MAX)" +msgstr "" + +#: src/magic.cpp +msgid "Max Level" +msgstr "" + +#: src/magic.cpp +msgid "Difficulty" +msgstr "" + +#: src/magic.cpp +msgid "to Next Level" +msgstr "" + +#: src/magic.cpp +msgid "Casting Cost" +msgstr "" + +#: src/magic.cpp +msgid "Casting Time" +msgstr "" + +#: src/magic.cpp +msgid "Valid Targets" +msgstr "" + +#: src/magic.cpp src/veh_interact.cpp +msgid "Damage" +msgstr "" + +#: src/magic.cpp +msgid "Healing" +msgstr "" + +#: src/magic.cpp +msgid "Variance" +msgstr "" + +#: src/magic.cpp +msgid "Spawn" +msgstr "" + +#: src/magic.cpp +msgid "Summon" +msgstr "" + +#: src/magic.cpp +msgid "Spell Radius" +msgstr "" + +#: src/magic.cpp src/veh_interact.cpp +msgid "Range" +msgstr "" + +#: src/magic.cpp +msgid "self" +msgstr "" + +#: src/magic.cpp +msgid "Duration" +msgstr "" + #: src/magic.cpp msgid "Choose a Spell" msgstr "" #: src/magic.cpp -msgid "Unable to find a valid target for teleport." +msgid "AoE" msgstr "" #: src/magic.cpp -msgid "Your injuries even out." +msgid "Spawned" msgstr "" #: src/magic.cpp -msgid "All the dust in the air here falls to the ground." +msgid "Recover" msgstr "" #: src/magic.cpp -msgid "The pit has deepened further." +msgid "Damage Type" msgstr "" #: src/magic.cpp -msgid "More debris shifts out of the pit." +msgid "Stat Gain" msgstr "" #: src/magic.cpp -msgid "The earth moves out of the way for you." +msgid "lvl 0" msgstr "" #: src/magic.cpp -msgid "The rocks here are ground into sand." +msgid "per lvl" msgstr "" #: src/magic.cpp -msgid "The earth here does not listen to your command to move." +msgid "max lvl" +msgstr "" + +#: src/magic.cpp +msgid "Cast Cost" msgstr "" #: src/magic.cpp +msgid "Cast Time" +msgstr "" + +#: src/magic_spell_effect.cpp +msgid "Unable to find a valid target for teleport." +msgstr "" + +#: src/magic_spell_effect.cpp +msgid "Your injuries even out." +msgstr "" + +#: src/magic_spell_effect.cpp +msgid "All the dust in the air here falls to the ground." +msgstr "" + +#: src/magic_spell_effect.cpp +msgid "The pit has deepened further." +msgstr "" + +#: src/magic_spell_effect.cpp +msgid "More debris shifts out of the pit." +msgstr "" + +#: src/magic_spell_effect.cpp +msgid "The earth moves out of the way for you." +msgstr "" + +#: src/magic_spell_effect.cpp +msgid "The rocks here are ground into sand." +msgstr "" + +#: src/magic_spell_effect.cpp +msgid "The earth here does not listen to your command to move." +msgstr "" + +#: src/magic_spell_effect.cpp #, c-format msgid "%s wounds are closing up!" msgstr "" @@ -169433,10 +172767,6 @@ msgstr "" msgid "an alarm go off!" msgstr "" -#: src/map.cpp -msgid "Thnk!" -msgstr "" - #: src/map.cpp msgid "glass shattering" msgstr "" @@ -169479,6 +172809,11 @@ msgstr "" msgid "The washing machine in the %s has finished washing." msgstr "" +#: src/map.cpp +#, c-format +msgid "The %s is taken down." +msgstr "" + #: src/map.cpp msgid "You disarm the trap!" msgstr "" @@ -169999,6 +173334,10 @@ msgid_plural "tiles" msgstr[0] "" msgstr[1] "" +#: src/martialarts.cpp +msgid "* Will follow enemies after knockback." +msgstr "" + #: src/martialarts.cpp #, c-format msgid "* Will down enemies for %d %s" @@ -172381,6 +175720,10 @@ msgstr "" msgid "\"Drop your weapon! Now!\"" msgstr "" +#: src/monattack.cpp +msgid "\"Wanted debtor in sight! Commencing debt enforcement proceedings!\"" +msgstr "" + #: src/monattack.cpp #, c-format msgid "The %s unsuccessfully attempts to shock you." @@ -173415,22 +176758,6 @@ msgid "" "needs immediate care.\"" msgstr "" -#: src/monmove.cpp -msgid "plop." -msgstr "" - -#: src/monmove.cpp -msgid "shuffling." -msgstr "" - -#: src/monmove.cpp -msgid "mechanical whirring." -msgstr "" - -#: src/monmove.cpp -msgid "rustle." -msgstr "" - #: src/monmove.cpp #, c-format msgid "The %1$s flies over the %2$s." @@ -175577,6 +178904,10 @@ msgstr "" msgid "Let's go back to your usual behaviors" msgstr "" +#: src/npctalk.cpp +msgid "You can't speak without your face!" +msgstr "" + #: src/npctalk.cpp msgid "What do you want to do?" msgstr "" @@ -175704,6 +179035,15 @@ msgstr "" msgid "%s talked to you." msgstr "" +#: src/npctalk.cpp +#, c-format +msgid "&%s stays silent." +msgstr "" + +#: src/npctalk.cpp +msgid "&You can't talk without your face." +msgstr "" + #: src/npctalk.cpp msgid "&You are deaf and can't talk." msgstr "" @@ -175947,16 +179287,20 @@ msgctxt "you say something" msgid "You: %s" msgstr "" +#: src/npctalk.cpp +msgid "You can't afford it!" +msgstr "" + #. ~ %1%s is the NPC name, %2$s is an item -#: src/npctalk.cpp src/npctalk_funcs.cpp +#: src/npctalk.cpp #, c-format -msgid "%1$s gives you a %2$s" +msgid "%1$s gives you a %2$s." msgstr "" #. ~ %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" +msgid "%1$s gives you %2$d %3$s." msgstr "" #. ~ %1$s is a translated item name @@ -175968,13 +179312,13 @@ msgstr "" #. ~ %1%s is the NPC name, %2$s is an item #: src/npctalk.cpp #, c-format -msgid "You give %1$s a %2$s" +msgid "You give %1$s a %2$s." msgstr "" #. ~ %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" +msgid "You give %1$s %2$d %3$s." msgstr "" #. ~ %1%s is the "You" or the NPC name, %2$s are a translated item name @@ -176150,6 +179494,11 @@ msgstr "" msgid "%s has nothing to give!" msgstr "" +#: src/npctalk_funcs.cpp +#, c-format +msgid "%1$s gives you a %2$s" +msgstr "" + #: src/npctalk_funcs.cpp msgid "Choose a new hairstyle" msgstr "" @@ -176241,13 +179590,6 @@ msgstr "" msgid "Pickup rules for %s" msgstr "" -#: src/npctrade.cpp -msgid "" -"TAB key to switch lists, letters to pick items, Enter to finalize, Esc to " -"quit,\n" -"? to get information on an item." -msgstr "" - #: src/npctrade.cpp #, c-format msgid "Volume: %s %s, Weight: %.1f %s" @@ -176259,22 +179601,22 @@ msgstr "" #: src/npctrade.cpp #, c-format -msgid "Profit %s" +msgid "Cost %s" msgstr "" #: src/npctrade.cpp #, c-format -msgid "Cost %s" +msgid "Profit %s" msgstr "" #: src/npctrade.cpp #, c-format -msgid "%s: %s" +msgid ": trading %d" msgstr "" #: src/npctrade.cpp #, c-format -msgid "You: %s" +msgid " (%d)" msgstr "" #: src/npctrade.cpp @@ -176291,7 +179633,12 @@ msgstr "" #: src/npctrade.cpp #, c-format -msgid "Not enough cash! You have %s, price is %s." +msgid "Trade how many %s [MAX: %d]: " +msgstr "" + +#: src/npctrade.cpp +#, c-format +msgid "Not enough value! You need %s." msgstr "" #: src/npctrade.cpp @@ -176299,6 +179646,13 @@ msgstr "" msgid "%s can't carry all that." msgstr "" +#: src/npctrade.h +msgid "" +"TAB key to switch lists, letters to pick items,Enter to finalize, Esc to " +"quit,\n" +"? to get information on an item." +msgstr "" + #: src/options.cpp #, c-format msgid "%d: %s" @@ -176619,6 +179973,33 @@ msgstr "" msgid "Number of real time minutes between autosaves" msgstr "" +#: src/options.cpp +msgid "Auto notes" +msgstr "" + +#: src/options.cpp +msgid "If true, automatically sets notes" +msgstr "" + +#: src/options.cpp +msgid "Auto notes (stairs)" +msgstr "" + +#: src/options.cpp +msgid "" +"If true, automatically sets notes on places that have stairs that go up or " +"down" +msgstr "" + +#: src/options.cpp +msgid "Auto notes (map extras)" +msgstr "" + +#: src/options.cpp +msgid "" +"If true, automatically sets notes on places that contain various map extras" +msgstr "" + #: src/options.cpp msgid "Circular distances" msgstr "" @@ -176645,16 +180026,6 @@ msgstr "" msgid "Watertight" msgstr "" -#: src/options.cpp -msgid "Auto notes" -msgstr "" - -#: src/options.cpp -msgid "" -"If true, automatically sets notes on places that have stairs that go up or " -"down" -msgstr "" - #: src/options.cpp msgid "DeathCam" msgstr "" @@ -176800,11 +180171,6 @@ msgstr "" msgid "12h" msgstr "" -#. ~ Military time, e.g. 2359 -#: src/options.cpp -msgid "Military" -msgstr "" - #. ~ 24h time, e.g. 23:59 #: src/options.cpp msgid "24h" @@ -176920,6 +180286,16 @@ msgid "" "its current facing." msgstr "" +#: src/options.cpp +msgid "Reverse steering direction in reverse" +msgstr "" + +#: src/options.cpp +msgid "" +"If true, when driving a vehicle in reverse, steering should also reverse " +"like real life." +msgstr "" + #: src/options.cpp msgid "Sidebar position" msgstr "" @@ -178814,6 +182190,14 @@ msgstr "" msgid "Pain " msgstr "" +#: src/panels.cpp +msgid "Bad" +msgstr "" + +#: src/panels.cpp +msgid "Good" +msgstr "" + #: src/panels.cpp msgid "SAFE" msgstr "" @@ -179071,11 +182455,15 @@ msgid "to open sidebar options" msgstr "" #: src/panels.cpp -msgid "Location" +msgid "Mana" msgstr "" #: src/panels.cpp -msgid "Mana" +msgid "Max Mana" +msgstr "" + +#: src/panels.cpp +msgid "Location" msgstr "" #: src/panels.cpp @@ -179205,10 +182593,6 @@ msgstr "" msgid "Not enough capacity to stash %s" msgstr "" -#: src/pickup.cpp -msgid "Lost track of vehicle." -msgstr "" - #: src/pickup.cpp msgid "You can't pick up a liquid!" msgstr "" @@ -181062,6 +184446,14 @@ msgid "" "components." msgstr "" +#: src/player.cpp +msgid "You can't take that item off." +msgstr "" + +#: src/player.cpp +msgid " can't take that item off." +msgstr "" + #: src/player.cpp #, c-format msgid "No room in inventory for your %s. Drop it?" @@ -182390,6 +185782,26 @@ msgstr "" msgid "'s %s is damaged by their shot!" msgstr "" +#: src/ranged.cpp +#, c-format +msgid "Your %s is clogged up with blackpowder fouling!" +msgstr "" + +#: src/ranged.cpp +#, c-format +msgid "'s %s is clogged up with blackpowder fouling!" +msgstr "" + +#: src/ranged.cpp +#, c-format +msgid "Your %s fails to cycle!" +msgstr "" + +#: src/ranged.cpp +#, c-format +msgid "'s %s fails to cycle!" +msgstr "" + #: src/ranged.cpp #, c-format msgid "%s shoots something." @@ -182926,6 +186338,11 @@ msgstr "" msgid "Heard %s!" msgstr "" +#: src/sounds.cpp +#, c-format +msgid "From yourself you hear %1$s." +msgstr "" + #: src/sounds.cpp #, c-format msgid "You hear %1$s" @@ -183943,6 +187360,10 @@ msgstr "" msgid "Search for part" msgstr "" +#: src/veh_interact.cpp +msgid "Installing this part will make the vehicle unfoldable. Continue?" +msgstr "" + #: src/veh_interact.cpp msgid "Choose shape:" msgstr "" @@ -184387,10 +187808,6 @@ msgstr "" msgid "Durability" msgstr "" -#: src/veh_interact.cpp -msgid "Damage" -msgstr "" - #: src/veh_interact.cpp msgid "Dmg" msgstr "" @@ -184435,10 +187852,6 @@ msgstr "" msgid "Noise Reduction" msgstr "" -#: src/veh_interact.cpp -msgid "Range" -msgstr "" - #: src/veh_interact.cpp msgid "Dia" msgstr "" diff --git a/lang/po/de.po b/lang/po/de.po index cc6eebebcede4..9321235da20ec 100644 --- a/lang/po/de.po +++ b/lang/po/de.po @@ -5,8 +5,8 @@ # OzoneH3 , 2018 # Kitty M , 2018 # Robert Boettcher , 2018 -# Nipaporn P. , 2018 # Mark Bies, 2018 +# Nipaporn P. , 2018 # - - , 2018 # Tarnath , 2018 # Phil Mait , 2018 diff --git a/lang/po/es_AR.po b/lang/po/es_AR.po index fb038bade3122..c0ddc9f343c56 100644 --- a/lang/po/es_AR.po +++ b/lang/po/es_AR.po @@ -710,7 +710,7 @@ msgstr "" #: lang/json/AMMO_from_json.py msgid "crude wooden arrow" -msgstr "flecha simple de madera" +msgstr "flecha rudimentario de madera" #. ~ Description for crude wooden arrow #: lang/json/AMMO_from_json.py @@ -718,8 +718,8 @@ msgid "" "A crude pointed wooden shaft with a notch at the back. Stands a very low " "chance of remaining intact once fired." msgstr "" -"Es una asta simple de madera con punta y una muesca en la parte de atrás. " -"Tiene muy poca probabilidad de no romperse luego de ser disparada." +"Es una asta rudimentaria de madera con punta y una muesca en la parte de " +"atrás. Tiene muy poca probabilidad de no romperse luego de ser disparada." #: lang/json/AMMO_from_json.py msgid "wooden bodkin arrow" @@ -1612,7 +1612,7 @@ msgstr "" #: lang/json/AMMO_from_json.py msgid "crude wooden bolt" -msgstr "" +msgstr "perno rudimentario de madera" #. ~ Description for crude wooden bolt #: lang/json/AMMO_from_json.py @@ -1620,10 +1620,12 @@ msgid "" "A crude pointed wooden crossbow bolt with a notch at the back. Stands a " "very low chance of remaining intact once fired." msgstr "" +"Es un perno con punta rudimentaria de madera y una muesca en la parte de " +"atrás. Tiene muy poca probabilidad de no romperse luego de ser disparada." #: lang/json/AMMO_from_json.py msgid "simple wooden bolt" -msgstr "" +msgstr "perno simple de madera" #. ~ Description for simple wooden bolt #: lang/json/AMMO_from_json.py @@ -1631,10 +1633,12 @@ msgid "" "A simple fletched wooden crossbow bolt with a fire-hardened and sharpened " "tip. Stands a low chance of remaining intact once fired." msgstr "" +"Es un perno emplumado simple de madera, con la punta afilada y endurecida al" +" fuego. Tiene poca probabilidad de quedar intacta luego de ser disparada." #: lang/json/AMMO_from_json.py msgid "simple wooden small game bolt" -msgstr "" +msgstr "perno simple de caza menor de madera" #. ~ Description for simple wooden small game bolt #: lang/json/AMMO_from_json.py @@ -1643,6 +1647,9 @@ msgid "" "hunting small woodland creatures without splattering them all over the " "ground. Stands a low chance of remaining intact once fired." msgstr "" +"Es un perno simple de ballesta emplumado, de madera con la punta desafilada." +" Es útil para cazar criaturas pequeñas sin reventarles el cuerpo. Tiene " +"bastante probabilidad de romperse luego de ser disparada." #: lang/json/AMMO_from_json.py msgid "makeshift wooden bolt" @@ -6819,7 +6826,7 @@ msgid "" "A crude form of armor made from stacked paper and rolls of duct tape, this " "breastplate offers a surprising amount of protection." msgstr "" -"Una armadura primitiva, hecha con montones de hojas y rollos de cinta " +"Es una armadura primitiva, hecha con montones de hojas y rollos de cinta " "adhesiva. Sorprendentemente, brinda buena protección." #: lang/json/ARMOR_from_json.py @@ -15080,9 +15087,9 @@ msgid "" "glass to protect the eyes. It's extremely hard to see with, but with " "nothing else available, it can protect your sight while welding." msgstr "" -"Es una máscara simple de soldador hecha con metal, con tela oscura y vidrio " -"polarizado para proteger los ojos. Dificulta extremadamente la visión, pero " -"si no hay otra cosa puede proteger tu vista cuando soldás." +"Es una máscara rudimentaria de soldador hecha con metal, tela oscura y " +"vidrio polarizado para proteger los ojos. Dificulta extremadamente la " +"visión, pero si no hay otra cosa puede proteger tu vista cuando soldás." #: lang/json/ARMOR_from_json.py msgid "brigandine" @@ -15673,8 +15680,8 @@ msgid "" "A crude wooden shield, lacking any metal or leather reinforcement. " "Lightweight but not very tough." msgstr "" -"Es un simple escudo de madera que no tiene ningún refuerzo de metal ni " -"cuero. Es liviano pero no es muy resistente." +"Es un escudo rudimentario de madera que no tiene ningún refuerzo de metal ni" +" cuero. Es liviano pero no es muy resistente." #: lang/json/ARMOR_from_json.py msgid "large wooden shield" @@ -34836,8 +34843,8 @@ msgid "" "A fragile clay vessel. It can be used to make crude impact grenades or to " "store liquid." msgstr "" -"Es un recipiente frágil de arcilla. Se puede usar para hacer simples " -"granadas de impacto o para almacenar líquidos." +"Es un recipiente frágil de arcilla. Se puede usar para hacer granadas " +"rudimentarias de impacto o para almacenar líquidos." #: lang/json/CONTAINER_from_json.py msgid "clay hydria" @@ -39076,9 +39083,9 @@ msgid "" "over a wooden sword. The added weight is unbalanced, but the jagged edge " "offers a good bit of slashing power." msgstr "" -"Varios pedazos de chatarra fina golpeados para darle filo a una espada de " -"madera. El peso agregado está desbalanceado, pero el filo dentado brinda un " -"buen daño cortante." +"Son varios pedazos de chatarra fina golpeados para darle filo a una espada " +"de madera. El peso agregado no está balanceado, pero el filo dentado brinda " +"un buen daño cortante." #: lang/json/GENERIC_from_json.py msgid "broom" @@ -39704,9 +39711,9 @@ msgid "" "to protect the wearers knuckles. A good, quick weapon - but you have to get" " within punching range to use it." msgstr "" -"Una masa de chatarra golpeada parar darle forma, con trapos doblados debajo " -"para proteger la mano. Es un arma rápida y buena, pero tenés que estar cerca" -" del enemigo para poder usarla." +"Es una masa de chatarra golpeada parar darle forma, con trapos doblados " +"debajo para proteger la mano. Es un arma rápida y buena, pero tenés que " +"estar cerca del enemigo para poder usarla." #: lang/json/GENERIC_from_json.py msgid "razorbar katar" @@ -41109,7 +41116,7 @@ msgstr[1] "ollas de arcilla" #. ~ Description for clay pot #: lang/json/GENERIC_from_json.py msgid "A crude clay pot with lid used for cooking." -msgstr "Una olla de arcilla con tapa que se usa para cocinar." +msgstr "Es una olla de arcilla rudimentaria con tapa que se usa para cocinar." #: lang/json/GENERIC_from_json.py msgid "clay quern" @@ -45966,7 +45973,7 @@ msgstr[1] "mesas de madera" #. ~ Description for wooden table #: lang/json/GENERIC_from_json.py msgid "A crude wooden table." -msgstr "Es una simple mesa de madera." +msgstr "Es una mesa rudimentaria de madera." #: lang/json/GENERIC_from_json.py lang/json/furniture_from_json.py #: lang/json/vehicle_part_from_json.py @@ -48037,9 +48044,9 @@ msgid "" "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." msgstr "" -"Una lámina de metal burdamente martillada para darle forma de olla. Es " -"suficiente para cocinar comida y hervir agua, pero no tan útil como un " -"utensilio adecuado." +"Es una lámina de metal burdamente martillada para darle forma de olla. Es " +"suficiente para cocinar y hervir agua, pero no tan útil como un utensilio " +"propiamente dicho." #: lang/json/GENERIC_from_json.py msgid "makeshift copper pot" @@ -48054,8 +48061,8 @@ msgid "" "boil water, but not as useful as proper cookware." msgstr "" "Es una olla de cocina burdamente martillada desde un pedazo de cobre. Es " -"suficiente para cocinar comida y hervir agua, pero no tan útil como un " -"utensilio adecuado." +"suficiente para cocinar y hervir agua, pero no tan útil como un utensilio " +"propiamente dicho." #. ~ Description for Mjölnir #: lang/json/GENERIC_from_json.py @@ -62535,9 +62542,9 @@ msgid "" "the fuse. You will then have five turns before it explodes; throwing it " "would be a good idea." msgstr "" -"Es una granada de fragmentación improvisada, simple y medio incómoda. Hay " -"que usarla para encender la mecha. Después de eso, tenés cinco turnos antes " -"de que explote. Entonces, es una buena idea tirarla." +"Es una granada de fragmentación improvisada, rudimentaria y medio incómoda. " +"Hay que usarla para encender la mecha. Después de eso, tenés cinco turnos " +"antes de que explote. Entonces, es una buena idea tirarla." #. ~ Description for broadsword #: lang/json/TOOL_from_json.py @@ -63185,8 +63192,8 @@ msgid "" "This is a crude explosive device triggered by a piece of string. Use it to " "setup and watch some poor bastard trigger it." msgstr "" -"Es un simple dispositivo explosivo que se detona con un pedazo de hilo. " -"Usala para ponerla y mirá como algún pobre idiota la detona." +"Es un dispositivo explosivo rudimentario que se detona con un pedazo de " +"hilo. Usala para ponerla y mirá como algún pobre idiota la detona." #: lang/json/TOOL_from_json.py msgid "inactive EMP hack" @@ -64685,7 +64692,7 @@ msgid "" "make a crude yet effective axe." msgstr "" "Es un pedazo decente de cobre trabajado, unido a un mango de madera para " -"hacer un hacha simple pero efectiva." +"hacer un hacha rudimentaria pero efectiva." #: lang/json/TOOL_from_json.py msgid "copper knife" @@ -64700,7 +64707,7 @@ msgid "" "Primitive, but a step above stone-age." msgstr "" "Es un cuchillo que consiste en cobre trabajado toscamente, y un agarre " -"simple. Primitivo, pero un paso más adelante de la edad de piedra." +"rudimentario. Primitivo, pero un paso más adelante de la edad de piedra." #: lang/json/TOOL_from_json.py msgid "cordless drill" @@ -65807,10 +65814,10 @@ msgid "" " This gas poisons those exposed to it, in addition to obscuring vision and " "scent." msgstr "" -"Es una simple bomba de gas hecha con químicos que hay en casa. Usala para " -"activarla. En tres turnos comenzará a expeler un gas muy tóxico durante un " -"tiempo corto. Este gas es venenoso, además de entorpecer la visión y el " -"olfato." +"Es una bomba de gas rudimentaria hecha con químicos que se encuentran en " +"casa. Usala para activarla. En tres turnos comenzará a expeler un gas muy " +"tóxico durante un tiempo corto. Este gas es venenoso, además de entorpecer " +"la visión y el olfato." #: lang/json/TOOL_from_json.py msgid "active makeshift gas grenade" @@ -66726,9 +66733,8 @@ msgid "" "This is a crude hammer make from a piece of metal affixed to a stick. It " "functions adequately as a hammer, but really can't compare to a proper one." msgstr "" -"Es un simple martillo hecho con un pedazo de metal fijado a un palo. " -"Funciona adecuadamente pero realmente no se puede comparar con uno " -"verdadero." +"Es un martillo rudimentario hecho con un pedazo de metal fijado a un palo. " +"Funciona adecuadamente pero no se puede comparar con uno verdadero." #: lang/json/TOOL_from_json.py msgid "makeshift knife" @@ -67667,7 +67673,7 @@ msgid "" "This is a rock affixed to a stick, in the crude facsimile of a hammer. It " "functions adequately as a hammer, but really can't compare to a proper one." msgstr "" -"Es una piedra sujetada a un palo, un simple facsímil de un martillo. " +"Es una piedra sujetada a un palo, un facsímil rudimentario de un martillo. " "Funciona adecuadamente pero la verdad es que no se puede comparar con un " "martillo serio." @@ -68403,7 +68409,7 @@ msgid "" msgstr "" "Es un palo común de madera con una púa metálica también común atada en la " "punta. Es lo suficientemente larga como para atacar a distancia, pero su " -"construcción simple la hace poco duradera." +"construcción rudimentaria la hace poco duradera." #: lang/json/TOOL_from_json.py msgid "homemade halfpike" @@ -69496,9 +69502,9 @@ msgid "" "metal, and complete disregard for personal safety. While it's not as " "efficient as a factory welder, it will serve in a pinch." msgstr "" -"Esta simple soldadora ha sido fabricada con un manojo de cables de cobre, " -"chatarra, y un descuido total de la seguridad personal. Aunque no es tan " -"eficiente como una soldadora de fábrica, funciona bien si la necesitás." +"Esta soldadora rudimentaria ha sido fabricada con un manojo de cables de " +"cobre, chatarra, y un descuido total de la seguridad personal. Aunque no es " +"tan eficiente como una soldadora de fábrica, funciona bien si la necesitás." #: lang/json/TOOL_from_json.py msgid "wooden smoother" @@ -71894,7 +71900,7 @@ msgid "" "A sealed small waterskin filled with milk that is undergoing the process to " "become a crude form of cheese, having had vinegar and natural rennet added." msgstr "" -"Un pequeño odre sellado lleno con leche que está en pleno proceso de " +"Es un pequeño odre sellado lleno con leche que está en pleno proceso de " "convertirse en una especie de queso. Tiene vinagre y cuajo natural agregado." #: lang/json/TOOL_from_json.py @@ -71909,8 +71915,8 @@ msgid "" "A sealed waterskin filled with milk that is undergoing the process to become" " a crude form of cheese, having had vinegar and natural rennet added." msgstr "" -"Un odre sellado lleno con leche que está en pleno proceso de convertirse en " -"una especie de queso. Tiene vinagre y cuajo natural agregado." +"Es un odre sellado lleno con leche que está en pleno proceso de convertirse " +"en una especie de queso. Tiene vinagre y cuajo natural agregado." #: lang/json/TOOL_from_json.py msgid "large batch of curdling milk" @@ -71924,7 +71930,7 @@ msgid "" "A sealed large waterskin filled with milk that is undergoing the process to " "become a crude form of cheese, having had vinegar and natural rennet added." msgstr "" -"Un gran odre sellado lleno con leche que está en pleno proceso de " +"Es un gran odre sellado lleno con leche que está en pleno proceso de " "convertirse en una especie de queso. Tiene vinagre y cuajo natural agregado." #: lang/json/TOOL_from_json.py @@ -71939,9 +71945,9 @@ msgid "" "This is a crudely-worked piece of sheet metal, affixed to a stick. It works" " passably well as a shovel but really can't compare to a real shovel." msgstr "" -"Es un pedazo de placa de metal trabajado simplemente, y sujetado a un palo. " -"Funciona bastante bien como pala, pero la verdad es que no se puede comparar" -" con una pala seria." +"Es un pedazo de placa de metal trabajado rudimentariamente, y sujetado 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 "whistle multitool" @@ -84299,8 +84305,8 @@ msgstr "" #: lang/json/gun_from_json.py msgid "crude rocket launcher" msgid_plural "crude rocket launchers" -msgstr[0] "lanzacohetes simple" -msgstr[1] "lanzacohetes simples" +msgstr[0] "lanzacohetes rudimentario" +msgstr[1] "lanzacohetes rudimentarios" #: lang/json/gun_from_json.py msgid "" @@ -123155,7 +123161,7 @@ msgstr "Fabricar: Cuchillo, Cobre" #: lang/json/recipe_group_from_json.py msgid " Craft: Sword, Crude" -msgstr "Fabricar: Espada, Simple" +msgstr "Fabricar: Espada, Rudimentaria" #: lang/json/recipe_group_from_json.py msgid " Craft: Pot, Copper" @@ -156932,7 +156938,7 @@ msgstr "asiento plegable" #. ~ Description for foldable seat #: lang/json/vehicle_part_from_json.py msgid "A crude seat, too uncomfortable to sleep in." -msgstr "Es un asiento simple, demasiado incómodo para dormir encima." +msgstr "Es un asiento rudimentario, demasiado incómodo para dormir encima." #. ~ Description for bed #: lang/json/vehicle_part_from_json.py diff --git a/lang/po/ja.po b/lang/po/ja.po index 7d6d0ac67aac4..2742c90a0e1fd 100644 --- a/lang/po/ja.po +++ b/lang/po/ja.po @@ -362,14 +362,14 @@ msgstr "大口径ライフル弾の雷管です。" #: lang/json/AMMO_from_json.py msgid "rubber slug" -msgstr "弾薬(単発弾/ゴム)" +msgstr "ゴム弾" #. ~ Description for rubber slug #: lang/json/AMMO_from_json.py msgid "" "Rubber slugs from a shotgun beanbag round. You could use them to make new " "beanbag rounds." -msgstr "単発弾用のゴム弾です。新たな単発弾の材料になります。" +msgstr "ビーンバッグ弾用のゴム弾です。新たなビーンバッグ弾の材料になります。" #: lang/json/AMMO_from_json.py msgid "copper" @@ -1712,7 +1712,7 @@ msgstr "捻じれて尖った金属の破片です。" #: lang/json/AMMO_from_json.py msgid "blunderbuss slug" -msgstr "弾薬(単発弾/ラッパ銃)" +msgstr "弾薬(ラッパ銃/単発弾)" #. ~ Description for blunderbuss slug #: lang/json/AMMO_from_json.py @@ -1722,7 +1722,7 @@ msgstr "ラッパ銃専用の金属製砲弾です。遠くまで飛びます。 #: lang/json/AMMO_from_json.py msgid "blunderbuss shot" -msgstr "弾薬(散弾/ラッパ銃)" +msgstr "弾薬(ラッパ銃/散弾)" #. ~ Description for blunderbuss shot #: lang/json/AMMO_from_json.py @@ -1735,7 +1735,7 @@ msgstr "" #: lang/json/AMMO_from_json.py msgid "blunderbuss flechette" -msgstr "弾薬(矢弾/ラッパ銃)" +msgstr "弾薬(ラッパ銃/矢弾)" #. ~ Description for blunderbuss flechette #: lang/json/AMMO_from_json.py @@ -1821,7 +1821,7 @@ msgstr "矢弾仕様のRivtech社製20x66mmケースレス弾を非公式に手 #: lang/json/AMMO_from_json.py msgid "handmade 20x66mm buckshot" -msgstr "ケースレス弾薬(20x66mm/大ペレット弾(手詰め))" +msgstr "ケースレス弾薬(20x66mm/散弾(手詰め))" #. ~ Description for handmade 20x66mm buckshot #: lang/json/AMMO_from_json.py @@ -1903,7 +1903,7 @@ msgstr "焼夷弾仕様の、Rivtech社製ショットガン用20x66mmケース #: lang/json/AMMO_from_json.py msgid "20x66mm buckshot" -msgstr "ケースレス弾薬(20x66mm/大ペレット弾)" +msgstr "ケースレス弾薬(20x66mm/散弾)" #. ~ Description for 20x66mm buckshot #: lang/json/AMMO_from_json.py @@ -2495,14 +2495,14 @@ msgstr "激しい火炎を発生させるためのナパームが充填された #: lang/json/AMMO_from_json.py msgid "40mm buckshot" -msgstr "弾薬(40mm擲弾/大ペレット弾)" +msgstr "弾薬(40mm擲弾/散弾)" #. ~ Description for 40mm buckshot #: lang/json/AMMO_from_json.py msgid "" "A 40mm shell with a powerful buckshot load, designed to be used as " "alternative to shotguns or when breaching barricades and other obstacles." -msgstr "散弾の代用品として、またバリケードなどの障害物を突破する用途で利用される、威力の高い大ペレットを充填した40mm弾です。" +msgstr "散弾の代用品として、またバリケードなどの障害物を突破する用途で利用される、威力の高い大型ペレットを充填した40mm弾です。" #: lang/json/AMMO_from_json.py msgid "40mm smoke cover" @@ -3518,39 +3518,39 @@ msgstr "小型のペイントボールです。この玉はほとんどダメー #: lang/json/AMMO_from_json.py msgid "reloaded birdshot" -msgstr "弾薬(小ペレット弾(手詰め))" +msgstr "弾薬(12ゲージ/バードショット(手詰め))" #: lang/json/AMMO_from_json.py msgid "reloaded 00 shot" -msgstr "弾薬(散弾(手詰め))" +msgstr "弾薬(12ゲージ/散弾(手詰め))" #: lang/json/AMMO_from_json.py msgid "reloaded flechette shell" -msgstr "弾薬(矢弾(手詰め))" +msgstr "弾薬(12ゲージ/矢弾(手詰め))" #: lang/json/AMMO_from_json.py msgid "reloaded shotgun slug" -msgstr "弾薬(単発弾(手詰め))" +msgstr "弾薬(12ゲージ/単発弾(手詰め))" #: lang/json/AMMO_from_json.py msgid "blackpowder birdshot" -msgstr "弾薬(小ペレット弾/黒色火薬)" +msgstr "弾薬(12ゲージ/バードショット/黒色火薬)" #: lang/json/AMMO_from_json.py msgid "blackpowder 00 shot" -msgstr "弾薬(散弾/黒色火薬)" +msgstr "弾薬(12ゲージ/散弾/黒色火薬)" #: lang/json/AMMO_from_json.py msgid "blackpowder flechette shell" -msgstr "弾薬(矢弾/黒色火薬)" +msgstr "弾薬(12ゲージ/矢弾/黒色火薬)" #: lang/json/AMMO_from_json.py msgid "blackpowder shotgun slug" -msgstr "弾薬(単発弾/黒色火薬)" +msgstr "弾薬(12ゲージ/単発弾/黒色火薬)" #: lang/json/AMMO_from_json.py msgid "00 shot" -msgstr "弾薬(散弾)" +msgstr "弾薬(12ゲージ/散弾)" #. ~ Description for 00 shot #: lang/json/AMMO_from_json.py @@ -3561,7 +3561,7 @@ msgstr "金属製の小球が詰まった薬莢です。殺傷能力が高く、 #: lang/json/AMMO_from_json.py msgid "shotgun beanbag" -msgstr "弾薬(散弾/ビーンバッグ)" +msgstr "弾薬(12ゲージ/ビーンバッグ)" #. ~ Description for shotgun beanbag #: lang/json/AMMO_from_json.py @@ -3570,7 +3570,7 @@ msgstr "殺害ではなく無力化を念頭に作られたショットガン用 #: lang/json/AMMO_from_json.py msgid "birdshot" -msgstr "弾薬(小ペレット弾)" +msgstr "弾薬(12ゲージ/バードショット)" #. ~ Description for birdshot #: lang/json/AMMO_from_json.py @@ -3581,7 +3581,7 @@ msgstr "ショットガン用の威力の低い弾薬です。鳥獣の狩猟や #: lang/json/AMMO_from_json.py msgid "flechette shell" -msgstr "弾薬(矢弾)" +msgstr "弾薬(12ゲージ/矢弾)" #. ~ Description for flechette shell #: lang/json/AMMO_from_json.py @@ -3594,7 +3594,7 @@ msgstr "" #: lang/json/AMMO_from_json.py msgid "explosive slug" -msgstr "弾薬(単発弾/炸裂)" +msgstr "弾薬(12ゲージ/単発弾/炸裂)" #. ~ Description for explosive slug #: lang/json/AMMO_from_json.py @@ -3606,18 +3606,18 @@ msgstr "" #: lang/json/AMMO_from_json.py msgid "makeshift shotgun shot" -msgstr "弾薬(散弾/簡易)" +msgstr "弾薬(12ゲージ/散弾/簡易)" #. ~ Description for makeshift shotgun shot #: lang/json/AMMO_from_json.py msgid "" "A shotgun shell filled with whatever was lying around. They are more " "damaging than birdshot, but fairly inaccurate." -msgstr "その辺にある物を詰めたショットガン用の散弾です。小ペレット弾よりは威力がありますが、精度はかなり劣ります。" +msgstr "その辺にある物を詰めたショットガン用の散弾です。バードショットよりは威力がありますが、精度はかなり劣ります。" #: lang/json/AMMO_from_json.py msgid "shotgun slug" -msgstr "弾薬(単発弾)" +msgstr "弾薬(12ゲージ/単発弾)" #. ~ Description for shotgun slug #: lang/json/AMMO_from_json.py @@ -3629,7 +3629,7 @@ msgstr "" #: lang/json/AMMO_from_json.py lang/json/ammunition_type_from_json.py msgid "signal flare" -msgstr "弾薬(散弾/信号弾)" +msgstr "弾薬(信号弾)" #. ~ Description for signal flare #: lang/json/AMMO_from_json.py @@ -3811,7 +3811,7 @@ msgstr "" #: lang/json/AMMO_from_json.py msgid "reloaded shotgun beanbag" -msgstr "弾薬(散弾/ビーンバッグ(手詰め))" +msgstr "弾薬(12ゲージ/ビーンバッグ(手詰め))" #. ~ Description for reloaded shotgun beanbag #: lang/json/AMMO_from_json.py @@ -3998,7 +3998,7 @@ msgstr "" #: lang/json/AMMO_from_json.py msgid "reloaded light rifle ammo" msgid_plural "reloaded light rifle ammo" -msgstr[0] "弾薬(軽ライフル(手詰め))" +msgstr[0] "弾薬(軽ライフル弾(手詰め))" #. ~ Description for reloaded light rifle ammo #: lang/json/AMMO_from_json.py @@ -4010,7 +4010,7 @@ msgstr "小動物の狩猟や対人用に設計された手詰めの小型ライ #: lang/json/AMMO_from_json.py msgid "reloaded rifle ammo" msgid_plural "reloaded rifle ammo" -msgstr[0] "弾薬(ライフル(手詰め))" +msgstr[0] "弾薬(ライフル弾(手詰め))" #. ~ Description for reloaded rifle ammo #: lang/json/AMMO_from_json.py @@ -4057,7 +4057,7 @@ msgstr "手詰めされた拳銃用の徹甲弾です。着弾時に変形する #: lang/json/AMMO_from_json.py msgid "reloaded revolver ammo" msgid_plural "reloaded revolver ammo" -msgstr[0] "弾薬(リボルバー(手詰め))" +msgstr[0] "弾薬(リボルバー弾(手詰め))" #. ~ Description for reloaded revolver ammo #: lang/json/AMMO_from_json.py @@ -4067,11 +4067,11 @@ msgstr "大型のリボルバーやマグナム拳銃で使用できる、手詰 #: lang/json/AMMO_from_json.py msgid "reloaded light rifle ammo, incendiary" msgid_plural "reloaded light rifle ammo, incendiary" -msgstr[0] "弾薬(軽ライフル/焼夷(手詰め))" +msgstr[0] "弾薬(軽ライフル弾/焼夷(手詰め))" #: lang/json/AMMO_from_json.py msgid "reloaded rifle ammo, incendiary" -msgstr "弾薬(ライフル/焼夷(手詰め))" +msgstr "弾薬(ライフル弾/焼夷(手詰め))" #. ~ Description for reloaded rifle ammo, incendiary #: lang/json/AMMO_from_json.py @@ -4084,7 +4084,7 @@ msgstr "手詰めのライフル弾です。着弾時に高温で燃焼を起こ #: lang/json/AMMO_from_json.py msgid "reloaded heavy rifle ammo" msgid_plural "reloaded heavy rifle ammo" -msgstr[0] "弾薬(重ライフル(手詰め))" +msgstr[0] "弾薬(重ライフル弾(手詰め))" #. ~ Description for reloaded heavy rifle ammo #: lang/json/AMMO_from_json.py @@ -4096,7 +4096,7 @@ msgstr "マシンガンや軍用の特殊銃器で使用される、車両や大 #: lang/json/AMMO_from_json.py msgid "reloaded heavy rifle ammo, AP" msgid_plural "reloaded heavy rifle ammo, AP" -msgstr[0] "弾薬(重ライフル/徹甲(手詰め))" +msgstr[0] "弾薬(重ライフル弾/徹甲(手詰め))" #. ~ Description for reloaded heavy rifle ammo, AP #: lang/json/AMMO_from_json.py @@ -4109,7 +4109,7 @@ msgstr "マシンガンや軍用の銃器で使用される、手詰めの徹甲 #: lang/json/AMMO_from_json.py msgid "reloaded heavy rifle ammo, incendiary" msgid_plural "reloaded heavy rifle ammo, incendiary" -msgstr[0] "弾薬(重ライフル/焼夷(手詰め))" +msgstr[0] "弾薬(重ライフル弾/焼夷(手詰め))" #. ~ Description for reloaded heavy rifle ammo, incendiary #: lang/json/AMMO_from_json.py @@ -4180,7 +4180,7 @@ msgstr "拳銃用の徹甲弾です。着弾時に変形することで貫通力 #: lang/json/AMMO_from_json.py lang/json/ammunition_type_from_json.py msgid "revolver ammo" msgid_plural "revolver ammo" -msgstr[0] "弾薬(リボルバー)" +msgstr[0] "弾薬(リボルバー弾)" #. ~ Description for revolver ammo #: lang/json/AMMO_from_json.py @@ -4190,7 +4190,7 @@ msgstr "大型のリボルバーやマグナム拳銃で使用できる、強力 #: lang/json/AMMO_from_json.py lang/json/ammunition_type_from_json.py msgid "light rifle ammo" msgid_plural "light rifle ammo" -msgstr[0] "弾薬(軽ライフル)" +msgstr[0] "弾薬(軽ライフル弾)" #. ~ Description for light rifle ammo #: lang/json/AMMO_from_json.py @@ -4200,7 +4200,7 @@ msgstr "小動物の狩猟や対人用に設計された小型ライフル弾で #: lang/json/AMMO_from_json.py msgid "light rifle ammo, incendiary" msgid_plural "light rifle ammo, incendiary" -msgstr[0] "弾薬(軽ライフル/焼夷)" +msgstr[0] "弾薬(軽ライフル弾/焼夷)" #. ~ Description for light rifle ammo, incendiary #: lang/json/AMMO_from_json.py @@ -4212,7 +4212,7 @@ msgstr "小型ライフル用の弾薬です。着弾時に高温で燃焼を起 #: lang/json/AMMO_from_json.py lang/json/ammunition_type_from_json.py msgid "rifle ammo" msgid_plural "rifle ammo" -msgstr[0] "弾薬(ライフル)" +msgstr[0] "弾薬(ライフル弾)" #. ~ Description for rifle ammo #: lang/json/AMMO_from_json.py @@ -4224,7 +4224,7 @@ msgstr "大型動物の狩猟や対人用に設計された、強力で精密性 #: lang/json/AMMO_from_json.py msgid "rifle ammo, incendiary" msgid_plural "rifle ammo, incendiary" -msgstr[0] "弾薬(ライフル/焼夷)" +msgstr[0] "弾薬(ライフル弾/焼夷)" #. ~ Description for rifle ammo, incendiary #: lang/json/AMMO_from_json.py @@ -4236,7 +4236,7 @@ msgstr "軍が使用するライフル用の弾薬です。着弾時に高温で #: lang/json/AMMO_from_json.py lang/json/ammunition_type_from_json.py msgid "heavy rifle ammo" msgid_plural "heavy rifle ammo" -msgstr[0] "弾薬(重ライフル)" +msgstr[0] "弾薬(重ライフル弾)" #. ~ Description for heavy rifle ammo #: lang/json/AMMO_from_json.py @@ -4248,7 +4248,7 @@ msgstr "ヘビーマシンガンや軍用の特殊銃器で使用される、車 #: lang/json/AMMO_from_json.py msgid "heavy rifle ammo, AP" msgid_plural "heavy rifle ammo, AP" -msgstr[0] "弾薬(重ライフル/徹甲)" +msgstr[0] "弾薬(重ライフル弾/徹甲)" #. ~ Description for heavy rifle ammo, AP #: lang/json/AMMO_from_json.py @@ -4260,7 +4260,7 @@ msgstr "ヘビーマシンガンや軍用の銃器で使用される徹甲弾で #: lang/json/AMMO_from_json.py msgid "heavy rifle ammo, incendiary" msgid_plural "heavy rifle ammo, incendiary" -msgstr[0] "弾薬(重ライフル/焼夷)" +msgstr[0] "弾薬(重ライフル弾/焼夷)" #. ~ Description for heavy rifle ammo, incendiary #: lang/json/AMMO_from_json.py @@ -4304,7 +4304,7 @@ msgstr "一般的な銃器よりも火薬をやや多めに使用します。射 #: lang/json/AMMO_from_json.py msgid "fire lance shot" -msgstr "飛火槍" +msgstr "弾薬(飛火槍/散弾)" #. ~ Description for fire lance shot #: lang/json/AMMO_from_json.py @@ -4449,7 +4449,7 @@ msgstr "" #: lang/json/AMMO_from_json.py msgid "reloaded 120mm shot" -msgstr "弾薬(120mm散弾(手詰め))" +msgstr "弾薬(120mm/散弾(手詰め))" #. ~ Description for reloaded 120mm shot #: lang/json/AMMO_from_json.py @@ -5628,7 +5628,7 @@ msgstr "衣類を入れて運ぶための、プラスチック製のかごです #: lang/json/ARMOR_from_json.py msgid "pair of beekeeping gloves" msgid_plural "pairs of beekeeping gloves" -msgstr[0] "手袋(養蜂用)" +msgstr[0] "蜂防護手袋" #. ~ Description for pair of beekeeping gloves #: lang/json/ARMOR_from_json.py @@ -5638,7 +5638,7 @@ msgstr "滑らかな革で作った養蜂用の白い手袋です。" #: lang/json/ARMOR_from_json.py msgid "beekeeping hood" msgid_plural "beekeeping hoods" -msgstr[0] "フード(養蜂用)" +msgstr[0] "蜂防護フード" #. ~ Description for beekeeping hood #: lang/json/ARMOR_from_json.py @@ -5650,7 +5650,7 @@ msgstr "養蜂用のフードです。蜂を防ぎつつも新鮮な空気を取 #: lang/json/ARMOR_from_json.py msgid "beekeeping suit" msgid_plural "beekeeping suits" -msgstr[0] "作業着(養蜂用)" +msgstr[0] "蜂防護服" #. ~ Description for beekeeping suit #: lang/json/ARMOR_from_json.py @@ -12818,7 +12818,7 @@ msgid "" "universe for storage while built in joint-torsion ratchets generate the " "neccessary energy required to power the interface." msgstr "" -"セグメント化された装甲版を備えた、気密性に優れた柔軟な複合繊維製スーツです。複雑なシステムによってポケットに入れたアイテムをデジタル化して保管し、内蔵された捻れラチェットでインターフェイスに供給する電力を発電します。" +"セグメント化された装甲版を備えた、気密性に優れた柔軟な複合繊維製スーツです。複雑なシステムによってポケットに入れたアイテムをデジタル化して保管し、内蔵された捻れラチェットでインターフェースに供給する電力を発電します。" #: lang/json/ARMOR_from_json.py msgid "C.R.I.T Armored Anomaly Suit" @@ -19602,7 +19602,7 @@ msgstr "塩水に浸かった内蔵類です。まるで実験室の標本です #: lang/json/COMESTIBLE_from_json.py msgid "canned offal" msgid_plural "canned offal" -msgstr[0] "缶詰(臓物)" +msgstr[0] "臓物(保存食)" #. ~ Description for canned offal #: lang/json/COMESTIBLE_from_json.py @@ -21091,12 +21091,12 @@ msgstr "あっさりしたシロップに漬け込まれた薄切りの黄桃で #: lang/json/COMESTIBLE_from_json.py msgid "canned pineapple" -msgstr "缶詰(パイナップル)" +msgstr "パイナップル(保存食)" #. ~ Description for canned pineapple #: lang/json/COMESTIBLE_from_json.py msgid "Canned pineapple rings in water. Quite tasty." -msgstr "水とリング状のパイナップルが入った缶詰です。かなり美味しいよ。" +msgstr "水に浸かったリング状のパイナップルです。かなり美味しいです。" #: lang/json/COMESTIBLE_from_json.py msgid "lemonade drink mix" @@ -21166,7 +21166,7 @@ msgstr "甘いシロップに付け込まれた薄切りの果物です。果肉 #: lang/json/COMESTIBLE_from_json.py msgid "canned fruit" msgid_plural "canned fruit" -msgstr[0] "缶詰(果物)" +msgstr[0] "果物(保存食)" #. ~ Description for canned fruit #: lang/json/COMESTIBLE_from_json.py @@ -21174,7 +21174,7 @@ msgid "" "This sodden mass of preserved fruit was boiled and canned in an earlier " "life. Bland, mushy and losing color." msgstr "" -"調理済みの柔らかい果物が缶一杯にぐっちょりと詰まっています。味気なく、ドロドロしていて、色褪せています。果物を食べたぞという気分にはちょっとなれません。" +"調理済みの柔らかい果物がぐっちょりと詰まっています。味気なく、ドロドロしていて、色褪せています。果物を食べたぞという気分にはちょっとなれません。" #: lang/json/COMESTIBLE_from_json.py msgid "irradiated rose hips" @@ -22466,19 +22466,19 @@ msgstr[0] "魚(酢漬け)" #: lang/json/COMESTIBLE_from_json.py msgid "" "This is a serving of crisply brined and canned fish. Tasty and nutritious." -msgstr "新鮮なまま漬け込まれた魚の缶詰です。美味しいうえに栄養があります。" +msgstr "新鮮なまま漬け込まれた魚です。美味しいうえに栄養があります。" #: lang/json/COMESTIBLE_from_json.py msgid "canned fish" msgid_plural "canned fish" -msgstr[0] "缶詰(魚)" +msgstr[0] "魚(保存食)" #. ~ Description for canned fish #: lang/json/COMESTIBLE_from_json.py msgid "" "Low-sodium preserved fish. It was boiled and canned. Contains most of the " "nutrition, but little of the savor of cooked fish." -msgstr "塩分の少ない保存用の魚です。加熱調理ののち缶詰にしてあります。多くの養分を含みますが調理した魚独特の匂いがあります。" +msgstr "加熱調理してから容器に詰めた、塩分の少ない保存用の魚です。多くの養分を含みますが調理した魚独特の匂いがあります。" #: lang/json/COMESTIBLE_from_json.py msgid "batter fried fish" @@ -22537,11 +22537,11 @@ msgid "" "tasty, this SPAM remains quite filling. Completely unappetizing, but quite " "filling." msgstr "" -"不自然なピンク色、奇妙な弾性を持つ缶詰豚肉製品です。あまり美味しくありませんが、腹持ちは上々です。全く食欲をそそりませんが、腹持ちは上々です。" +"不自然なピンク色、奇妙な弾性を持つ豚肉加工食品です。あまり美味しくありませんが、腹持ちは上々です。全く食欲をそそりませんが、腹持ちは上々です。" #: lang/json/COMESTIBLE_from_json.py msgid "canned sardine" -msgstr "缶詰(イワシ)" +msgstr "イワシ(保存食)" #. ~ Description for canned sardine #: lang/json/COMESTIBLE_from_json.py @@ -22617,7 +22617,7 @@ msgstr "Greasy Prospector社が開発した定番商品です。豚肉、豆、 #: lang/json/COMESTIBLE_from_json.py msgid "canned tuna fish" msgid_plural "canned tuna fish" -msgstr[0] "缶詰(ツナ)" +msgstr[0] "ツナ(保存食)" #. ~ Description for canned tuna fish #: lang/json/COMESTIBLE_from_json.py @@ -22626,7 +22626,7 @@ msgstr "内容物の95%はマグロですが、わずかにイルカ肉が含ま #: lang/json/COMESTIBLE_from_json.py msgid "canned salmon" -msgstr "缶詰(サーモン)" +msgstr "サーモン(保存食)" #. ~ Description for canned salmon #: lang/json/COMESTIBLE_from_json.py @@ -22635,7 +22635,7 @@ msgstr "缶詰の中にはピンク色のサーモンペーストが入ってい #: lang/json/COMESTIBLE_from_json.py msgid "canned chicken" -msgstr "缶詰(鶏肉)" +msgstr "鶏肉(保存食)" #. ~ Description for canned chicken #: lang/json/COMESTIBLE_from_json.py @@ -22654,7 +22654,7 @@ msgstr "ピリ辛のホワイトソースなどで味を整えた漬け汁に、 #: lang/json/COMESTIBLE_from_json.py msgid "canned clam" msgid_plural "canned clams" -msgstr[0] "缶詰(ハマグリ)" +msgstr[0] "ハマグリ(保存食)" #. ~ Description for canned clam #: lang/json/COMESTIBLE_from_json.py @@ -22738,14 +22738,14 @@ msgstr "ふわふわで美味しそうなスクランブルエッグに、他の #: lang/json/COMESTIBLE_from_json.py msgid "canned meat" -msgstr "缶詰(肉)" +msgstr "肉(保存食)" #. ~ Description for canned meat #: lang/json/COMESTIBLE_from_json.py msgid "" "Low-sodium preserved meat. It was boiled and canned. Contains most of the " "nutrition, but little of the savor of cooked meat." -msgstr "塩分の少ない保存用の肉です。加熱調理ののち缶詰にしてあります。多くの栄養を含みますが調理した肉独特の匂いがあります。" +msgstr "加熱調理してから容器に詰めた、塩分の少ない保存用の肉です。多くの栄養を含みますが調理した肉独特の匂いがあります。" #: lang/json/COMESTIBLE_from_json.py msgid "salted meat slice" @@ -22836,7 +22836,7 @@ msgstr "肉(酢漬け)" #: lang/json/COMESTIBLE_from_json.py msgid "" "This is a serving of crisply brined and canned meat. Tasty and nutritious." -msgstr "新鮮なまま缶詰にされた漬け込み肉です。味も栄養も申し分ありません。" +msgstr "新鮮なまま容器に詰めた漬け込み肉です。味も栄養も申し分ありません。" #: lang/json/COMESTIBLE_from_json.py msgid "dehydrated meat" @@ -23104,7 +23104,7 @@ msgstr[0] "薄切り人肉" msgid "" "Low-sodium preserved human meat. It was boiled and canned. Contains most " "of the nutrition, but little of the savor of cooked meat." -msgstr "塩分の少ない保存用の人肉です。加熱調理ののち缶詰にしてあります。多くの栄養を含みますが調理した人肉独特の匂いがあります。" +msgstr "加熱調理してから容器に詰めた、塩分の少ない保存用の人肉です。多くの栄養を含みますが調理した人肉独特の匂いがあります。" #: lang/json/COMESTIBLE_from_json.py msgid "salted simpleton slices" @@ -23227,7 +23227,7 @@ msgstr "人肉(酢漬け)" msgid "" "This is a serving of crisply brined and canned human flesh. Tasty and " "nutritious if you're into that sort of thing." -msgstr "新鮮なまま缶詰にされた漬け込み人肉です。味も栄養も申し分ありません。" +msgstr "新鮮なまま容器に詰めた漬け込み人肉です。味も栄養も申し分ありません。" #: lang/json/COMESTIBLE_from_json.py msgid "Adderall" @@ -23706,7 +23706,7 @@ msgstr "綺麗に切り揃えられた医療用ガーゼです。滅菌処理が #: lang/json/COMESTIBLE_from_json.py msgid "low-grade methamphetamine" msgid_plural "low-grade methamphetamine" -msgstr[0] "メタンフェタミン(低品質)" +msgstr[0] "メタンフェタミン" #. ~ Description for low-grade methamphetamine #: lang/json/COMESTIBLE_from_json.py @@ -25335,7 +25335,7 @@ msgstr "\"sweetbread\"という名前の割に甘くはありませんが、非 #: lang/json/COMESTIBLE_from_json.py msgid "canned liver" -msgstr "缶詰(肝臓)" +msgstr "肝臓(保存食)" #. ~ Description for canned liver #: lang/json/COMESTIBLE_from_json.py @@ -25492,14 +25492,14 @@ msgstr "1枚の紙です。火を起こすのに使えます。" #: lang/json/COMESTIBLE_from_json.py msgid "canned beans" msgid_plural "beans" -msgstr[0] "豆" +msgstr[0] "豆(保存食)" #. ~ Description for canned beans #: lang/json/COMESTIBLE_from_json.py msgid "" "Canned beans. A staple among canned goods, these are reputedly good for " "one's coronary health." -msgstr "缶詰の豆です。それなりに日持ちし、健康にもいいと評判です。" +msgstr "調理して容器に詰めた豆です。それなりに日持ちし、健康にもいいと評判です。" #: lang/json/COMESTIBLE_from_json.py msgid "dried beans" @@ -25636,13 +25636,13 @@ msgstr "" #: lang/json/COMESTIBLE_from_json.py msgid "canned tomato" msgid_plural "canned tomatoes" -msgstr[0] "缶詰(トマト)" +msgstr[0] "トマト(保存食)" #. ~ Description for canned tomato #: lang/json/COMESTIBLE_from_json.py msgid "" "Canned tomato. A staple in many pantries, and useful for many recipes." -msgstr "缶詰にされたトマトです。多くのレシピに用いられるため、大抵の食料貯蔵室にいくつか置いてあります。" +msgstr "調理して容器に詰めたトマトです。多くのレシピに用いられるため、大抵の食料貯蔵室にいくつか置いてあります。" #: lang/json/COMESTIBLE_from_json.py msgid "embalmed human brain" @@ -27741,7 +27741,7 @@ msgstr "調理して軽く潰した蕎麦の実です。健康的で栄養豊富 #. ~ Description for corn #: lang/json/COMESTIBLE_from_json.py msgid "Canned corn in water. Eat up!" -msgstr "水に浸したコーンが入っている缶詰です。美味しそう!" +msgstr "水に浸したコーンが容器に入っています。美味しそう!" #: lang/json/COMESTIBLE_from_json.py msgid "cornmeal" @@ -27893,14 +27893,14 @@ msgstr "オリーブオイル、バジル、ガーリック、松の実が入っ #: lang/json/COMESTIBLE_from_json.py msgid "canned veggy" msgid_plural "canned veggies" -msgstr[0] "缶詰(野菜)" +msgstr[0] "野菜(保存食)" #. ~ Description for canned veggy #: lang/json/COMESTIBLE_from_json.py msgid "" "This mushy pile of vegetable matter was boiled and canned in an earlier " "life. Better eat it before it oozes through your fingers." -msgstr "調理済みの柔らかい野菜が缶一杯にぐっちょりと詰まっています。指の間からこぼれ落ちる前に食べましょう。" +msgstr "調理済みの柔らかい野菜が容器一杯にぐっちょりと詰まっています。指の間からこぼれ落ちる前に食べましょう。" #: lang/json/COMESTIBLE_from_json.py msgid "salted veggy chunk" @@ -27955,7 +27955,7 @@ msgstr[0] "野菜(酢漬け)" msgid "" "This is a serving of crisply brined and canned vegetable matter. Tasty and " "nutritious." -msgstr "新鮮なまま缶詰にされた漬け込み野菜です。味も栄養も申し分ありません。" +msgstr "新鮮なまま容器に詰めた漬け込み野菜です。味も栄養も申し分ありません。" #: lang/json/COMESTIBLE_from_json.py msgid "dehydrated vegetable" @@ -28669,7 +28669,7 @@ msgstr "" #: lang/json/COMESTIBLE_from_json.py msgid "gluten free fish sandwich" msgid_plural "gluten free fish sandwiches" -msgstr[0] "穀物不使用サンドイッチ(魚)" +msgstr[0] "グルテンフリーサンドイッチ(魚)" #. ~ Description for gluten free fish sandwich #: lang/json/COMESTIBLE_from_json.py @@ -28679,7 +28679,7 @@ msgstr "魚を挟んだ美味しいグルテンフリーサンドイッチです #: lang/json/COMESTIBLE_from_json.py msgid "gluten free vegetable sandwich" msgid_plural "gluten free vegetable sandwiches" -msgstr[0] "穀物不使用サンドイッチ(野菜)" +msgstr[0] "グルテンフリーサンドイッチ(野菜)" #. ~ Description for gluten free vegetable sandwich #: lang/json/COMESTIBLE_from_json.py @@ -28688,12 +28688,12 @@ msgstr "野菜をグルテンフリーパンで挟んだ物、以上だ。" #: lang/json/COMESTIBLE_from_json.py msgid "gluten free granola" -msgstr "穀物不使用グラノーラ" +msgstr "グルテンフリーグラノーラ" #: lang/json/COMESTIBLE_from_json.py msgid "gluten free meat sandwich" msgid_plural "gluten free meat sandwiches" -msgstr[0] "穀物不使用サンドイッチ(肉)" +msgstr[0] "グルテンフリーサンドイッチ(肉)" #. ~ Description for gluten free meat sandwich #: lang/json/COMESTIBLE_from_json.py @@ -28703,7 +28703,7 @@ msgstr "肉をグルテンフリーパンで挟んだ物、以上だ。" #: lang/json/COMESTIBLE_from_json.py msgid "gluten free peanut butter sandwich" msgid_plural "gluten free peanut butter sandwiches" -msgstr[0] "穀物不使用サンドイッチ(ピーナッツバター)" +msgstr[0] "グルテンフリーサンドイッチ(ピーナッツバター)" #. ~ Description for gluten free peanut butter sandwich #: lang/json/COMESTIBLE_from_json.py @@ -28715,7 +28715,7 @@ msgstr "ピーナッツバターを二枚のグルテンフリーパンで挟ん #: lang/json/COMESTIBLE_from_json.py msgid "gluten free PB&J sandwich" msgid_plural "gluten free PB&J sandwiches" -msgstr[0] "穀物不使用サンドイッチ(PB&J)" +msgstr[0] "グルテンフリーサンドイッチ(PB&J)" #. ~ Description for gluten free PB&J sandwich #: lang/json/COMESTIBLE_from_json.py @@ -28727,7 +28727,7 @@ msgstr "美味しいピーナッツバターとジャムを挟んだグルテン #: lang/json/COMESTIBLE_from_json.py msgid "gluten free PB&H sandwich" msgid_plural "gluten free PB&H sandwiches" -msgstr[0] "穀物不使用サンドイッチ(PB&H)" +msgstr[0] "グルテンフリーサンドイッチ(PB&H)" #. ~ Description for gluten free PB&H sandwich #: lang/json/COMESTIBLE_from_json.py @@ -28739,7 +28739,7 @@ msgstr "どっかの馬鹿がこのピーナッツバターサンドイッチに #: lang/json/COMESTIBLE_from_json.py msgid "gluten free PB&M sandwich" msgid_plural "gluten free PB&M sandwiches" -msgstr[0] "穀物不使用サンドイッチ(PB&M)" +msgstr[0] "グルテンフリーサンドイッチ(PB&M)" #. ~ Description for gluten free PB&M sandwich #: lang/json/COMESTIBLE_from_json.py @@ -28768,7 +28768,7 @@ msgstr "トウモロコシの粉か...それとも米粉か...そういった類 #: lang/json/COMESTIBLE_from_json.py msgid "gluten free johnnycake" -msgstr "コーンケーキ(穀物不使用)" +msgstr "コーンケーキ(グルテンフリー)" #. ~ Description for gluten free johnnycake #: lang/json/COMESTIBLE_from_json.py @@ -28780,7 +28780,7 @@ msgstr "誰にでも時折こういうケーキを無性に食べたくなるこ #: lang/json/COMESTIBLE_from_json.py msgid "gluten free fruit pancake" msgid_plural "gluten free fruit pancakes" -msgstr[0] "フルーツパンケーキ(穀物不使用)" +msgstr[0] "フルーツパンケーキ(グルテンフリー)" #. ~ Description for gluten free fruit pancake #: lang/json/COMESTIBLE_from_json.py @@ -28820,7 +28820,7 @@ msgstr "" #: lang/json/COMESTIBLE_from_json.py msgid "gluten free chocolate pancake" msgid_plural "gluten free chocolate pancakes" -msgstr[0] "チョコレートパンケーキ(穀物不使用)" +msgstr[0] "チョコレートパンケーキ(グルテンフリー)" #. ~ Description for gluten free chocolate pancake #: lang/json/COMESTIBLE_from_json.py @@ -28832,7 +28832,7 @@ msgstr "本物のメープルシロップを使用した、ふんわりと美味 #: lang/json/COMESTIBLE_from_json.py msgid "gluten free French toast" msgid_plural "gluten free French toasts" -msgstr[0] "フレンチトースト(穀物不使用)" +msgstr[0] "フレンチトースト(グルテンフリー)" #. ~ Description for gluten free French toast #: lang/json/COMESTIBLE_from_json.py @@ -28856,7 +28856,7 @@ msgstr "" #: lang/json/COMESTIBLE_from_json.py msgid "gluten free biscuit" -msgstr "ビスケット(穀物不使用)" +msgstr "ビスケット(グルテンフリー)" #. ~ Description for gluten free biscuit #: lang/json/COMESTIBLE_from_json.py @@ -28867,7 +28867,7 @@ msgstr "味が良く、お腹も満たされる、手作りのグルテンフリ #: lang/json/COMESTIBLE_from_json.py msgid "gluten free fruit pie" -msgstr "フルーツパイ(穀物不使用)" +msgstr "フルーツパイ(グルテンフリー)" #. ~ Description for gluten free fruit pie #: lang/json/COMESTIBLE_from_json.py @@ -28876,7 +28876,7 @@ msgstr "甘い果物が沢山詰まった、美味しそうなグルテンフリ #: lang/json/COMESTIBLE_from_json.py msgid "gluten free vegetable pie" -msgstr "ベジタブルパイ(穀物不使用)" +msgstr "ベジタブルパイ(グルテンフリー)" #. ~ Description for gluten free vegetable pie #: lang/json/COMESTIBLE_from_json.py @@ -28885,7 +28885,7 @@ msgstr "美味しい野菜が沢山詰まった、美味しそうなグルテン #: lang/json/COMESTIBLE_from_json.py msgid "gluten free meat pie" -msgstr "ミートパイ(穀物不使用)" +msgstr "ミートパイ(グルテンフリー)" #. ~ Description for gluten free meat pie #: lang/json/COMESTIBLE_from_json.py @@ -28894,7 +28894,7 @@ msgstr "美味しい肉が沢山詰まった、美味しそうなグルテンフ #: lang/json/COMESTIBLE_from_json.py msgid "gluten free maple pie" -msgstr "メープルパイ(穀物不使用)" +msgstr "メープルパイ(グルテンフリー)" #. ~ Description for gluten free maple pie #: lang/json/COMESTIBLE_from_json.py @@ -28903,7 +28903,7 @@ msgstr "メープルシロップをそのまま使った、甘くて美味しい #: lang/json/COMESTIBLE_from_json.py msgid "gluten free vegetable pizza" -msgstr "ベジタブルピザ(穀物不使用)" +msgstr "ベジタブルピザ(グルテンフリー)" #. ~ Description for gluten free vegetable pizza #: lang/json/COMESTIBLE_from_json.py @@ -28915,7 +28915,7 @@ msgstr "" #: lang/json/COMESTIBLE_from_json.py msgid "gluten free cheese pizza" -msgstr "チーズピザ(穀物不使用)" +msgstr "チーズピザ(グルテンフリー)" #. ~ Description for gluten free cheese pizza #: lang/json/COMESTIBLE_from_json.py @@ -28924,7 +28924,7 @@ msgstr "美味しいチーズのグルテンフリーピザです。溶けたチ #: lang/json/COMESTIBLE_from_json.py msgid "gluten free meat pizza" -msgstr "ミートピザ(穀物不使用)" +msgstr "ミートピザ(グルテンフリー)" #. ~ Description for gluten free meat pizza #: lang/json/COMESTIBLE_from_json.py @@ -28935,7 +28935,7 @@ msgstr "肉食系には堪らないグルテンフリーのミートピザです #: lang/json/COMESTIBLE_from_json.py msgid "gluten free cheeseburger" -msgstr "チーズバーガー(穀物不使用)" +msgstr "チーズバーガー(グルテンフリー)" #. ~ Description for gluten free cheeseburger #: lang/json/COMESTIBLE_from_json.py @@ -28947,7 +28947,7 @@ msgstr "" #: lang/json/COMESTIBLE_from_json.py msgid "gluten free hamburger" -msgstr "ハンバーガー(穀物不使用)" +msgstr "ハンバーガー(グルテンフリー)" #. ~ Description for gluten free hamburger #: lang/json/COMESTIBLE_from_json.py @@ -28956,7 +28956,7 @@ msgstr "グルテンフリーのパンに、挽肉と野菜と香辛料を挟ん #: lang/json/COMESTIBLE_from_json.py msgid "gluten free sloppy joe" -msgstr "スラッピー・ジョー(穀物不使用)" +msgstr "スラッピー・ジョー(グルテンフリー)" #. ~ Description for gluten free sloppy joe #: lang/json/COMESTIBLE_from_json.py @@ -28967,7 +28967,7 @@ msgstr "ひき肉とトマトソースを、ハンバーガー用のグルテン #: lang/json/COMESTIBLE_from_json.py msgid "gluten free BLT" -msgstr "穀物不使用サンドイッチ(BLT)" +msgstr "グルテンフリーサンドイッチ(BLT)" #. ~ Description for gluten free BLT #: lang/json/COMESTIBLE_from_json.py @@ -28977,7 +28977,7 @@ msgstr "ベーコン、レタス、トマトを焼いたグルテンフリーパ #: lang/json/COMESTIBLE_from_json.py msgid "gluten free sweetbread" msgid_plural "gluten free sweetbreads" -msgstr[0] "シビレのカツレツ(穀物不使用)" +msgstr[0] "シビレのカツレツ(グルテンフリー)" #. ~ Description for gluten free sweetbread #: lang/json/COMESTIBLE_from_json.py @@ -28990,7 +28990,7 @@ msgstr "茹でた動物の内臓にグルテンフリーのパン粉をまぶし #: lang/json/COMESTIBLE_from_json.py msgid "gluten free cheese sandwich" msgid_plural "gluten free cheese sandwiches" -msgstr[0] "穀物不使用サンドイッチ(チーズ)" +msgstr[0] "グルテンフリーサンドイッチ(チーズ)" #. ~ Description for gluten free cheese sandwich #: lang/json/COMESTIBLE_from_json.py @@ -29000,7 +29000,7 @@ msgstr "チーズを挟んだシンプルなグルテンフリーのサンドイ #: lang/json/COMESTIBLE_from_json.py msgid "gluten free grilled cheese sandwich" msgid_plural "gluten free grilled cheese sandwiches" -msgstr[0] "穀物不使用サンドイッチ(焼きチーズ)" +msgstr[0] "グルテンフリーサンドイッチ(焼きチーズ)" #. ~ Description for gluten free grilled cheese sandwich #: lang/json/COMESTIBLE_from_json.py @@ -29012,7 +29012,7 @@ msgstr "美味しい焼きチーズのグルテンフリーサンドイッチで #: lang/json/COMESTIBLE_from_json.py msgid "gluten free deluxe sandwich" msgid_plural "gluten free deluxe sandwiches" -msgstr[0] "穀物不使用サンドイッチ(デラックス)" +msgstr[0] "グルテンフリーサンドイッチ(デラックス)" #. ~ Description for gluten free deluxe sandwich #: lang/json/COMESTIBLE_from_json.py @@ -29024,7 +29024,7 @@ msgstr "肉、野菜、チーズ、そして各種の調味料を挟んだ豪華 #: lang/json/COMESTIBLE_from_json.py msgid "gluten free cucumber sandwich" msgid_plural "gluten free cucumber sandwiches" -msgstr[0] "穀物不使用サンドイッチ(キュウリ)" +msgstr[0] "グルテンフリーサンドイッチ(キュウリ)" #. ~ Description for gluten free cucumber sandwich #: lang/json/COMESTIBLE_from_json.py @@ -29036,7 +29036,7 @@ msgstr "爽やかなキュウリのグルテンフリーサンドイッチです #: lang/json/COMESTIBLE_from_json.py msgid "gluten free jam sandwich" msgid_plural "gluten free jam sandwiches" -msgstr[0] "穀物不使用サンドイッチ(ジャム)" +msgstr[0] "グルテンフリーサンドイッチ(ジャム)" #. ~ Description for gluten free jam sandwich #: lang/json/COMESTIBLE_from_json.py @@ -29046,7 +29046,7 @@ msgstr "ジャムを挟んだ美味しいグルテンフリーのサンドイッ #: lang/json/COMESTIBLE_from_json.py msgid "gluten free honey sandwich" msgid_plural "gluten free honey sandwiches" -msgstr[0] "穀物不使用サンドイッチ(蜂蜜)" +msgstr[0] "グルテンフリーサンドイッチ(蜂蜜)" #. ~ Description for gluten free honey sandwich #: lang/json/COMESTIBLE_from_json.py @@ -29056,7 +29056,7 @@ msgstr "蜂蜜を塗った美味しいグルテンフリーのサンドイッチ #: lang/json/COMESTIBLE_from_json.py msgid "gluten free boring sandwich" msgid_plural "gluten free boring sandwiches" -msgstr[0] "穀物不使用サンドイッチ(ソース)" +msgstr[0] "グルテンフリーサンドイッチ(ソース)" #. ~ Description for gluten free boring sandwich #: lang/json/COMESTIBLE_from_json.py @@ -29067,7 +29067,7 @@ msgstr "あまりにもシンプルなソースのグルテンフリーサンド #: lang/json/COMESTIBLE_from_json.py msgid "gluten free waffle" -msgstr "ワッフル(穀物不使用)" +msgstr "ワッフル(グルテンフリー)" #. ~ Description for gluten free waffle #: lang/json/COMESTIBLE_from_json.py @@ -29092,7 +29092,7 @@ msgstr "一般的な格子模様のグルテン/ラクトースフリーワッ #: lang/json/COMESTIBLE_from_json.py msgid "gluten free fruit waffle" -msgstr "フルーツワッフル(穀物不使用)" +msgstr "フルーツワッフル(グルテンフリー)" #. ~ Description for gluten free fruit waffle #: lang/json/COMESTIBLE_from_json.py @@ -29115,7 +29115,7 @@ msgstr "" #: lang/json/COMESTIBLE_from_json.py msgid "gluten free chocolate waffle" -msgstr "チョコレートワッフル(穀物不使用)" +msgstr "チョコレートワッフル(グルテンフリー)" #. ~ Description for gluten free chocolate waffle #: lang/json/COMESTIBLE_from_json.py @@ -36483,12 +36483,12 @@ msgstr ".380口径ACP弾の空薬莢です。" #: lang/json/GENERIC_from_json.py msgid "shotgun hull" msgid_plural "shotgun hulls" -msgstr[0] "空薬莢(散弾)" +msgstr[0] "空薬莢(12ゲージ)" #. ~ Description for shotgun hull #: lang/json/GENERIC_from_json.py msgid "An empty hull from a shotgun shell." -msgstr "散弾の空薬莢です。" +msgstr "ショットガン用12ゲージ弾の空薬莢です。" #: lang/json/GENERIC_from_json.py msgid "Merch" @@ -40027,7 +40027,7 @@ msgstr "槍やハルバードに似た、骨から作られた邪悪な武器で #: lang/json/GENERIC_from_json.py msgid "A Technomancer's Guide to Debugging C:DDA" msgid_plural "A Technomancer's Guide to Debugging C:DDAs" -msgstr[0] "本(魔法/テクノマンサーのC:DDAデバッグガイド)" +msgstr[0] "本(呪文/テクノマンサーのC:DDAデバッグガイド)" #. ~ Description for A Technomancer's Guide to Debugging C:DDA #: lang/json/GENERIC_from_json.py @@ -40037,7 +40037,7 @@ msgstr "static std::string description( spell sp ) const;" #: lang/json/GENERIC_from_json.py msgid "A Beginner's Guide to Magic" msgid_plural "A Beginner's Guide to Magics" -msgstr[0] "本(魔法/はじめての魔法)" +msgstr[0] "本(呪文/はじめての魔法)" #. ~ Description for A Beginner's Guide to Magic #: lang/json/GENERIC_from_json.py @@ -40049,7 +40049,7 @@ msgstr "呪文書というよりもパンフレットに見えますが、少な #: lang/json/GENERIC_from_json.py msgid "Wizarding Guide to Backpacking" msgid_plural "Wizarding Guide to Backpackings" -msgstr[0] "本(魔法/バックパッカー用魔法ガイド)" +msgstr[0] "本(呪文/バックパッカー用魔法ガイド)" #. ~ Description for Wizarding Guide to Backpacking #: lang/json/GENERIC_from_json.py @@ -40062,7 +40062,7 @@ msgstr "バックパッカーとして活動する際の持ち物、ではなく #: lang/json/GENERIC_from_json.py msgid "Pyromancy for Heretics" msgid_plural "Pyromancy for Hereticss" -msgstr[0] "本(魔法/異端者のための炎術)" +msgstr[0] "本(呪文/異端者のための炎術)" #. ~ Description for Pyromancy for Heretics #: lang/json/GENERIC_from_json.py @@ -40073,7 +40073,7 @@ msgstr "焼け残った本の中には、ものを燃やし尽くす様々な方 #: lang/json/GENERIC_from_json.py msgid "A Treatise on Magical Elements" msgid_plural "A Treatise on Magical Elementss" -msgstr[0] "本(魔法/魔法の諸要素に関する一考察)" +msgstr[0] "本(呪文/魔法の諸要素に関する一考察)" #. ~ Description for A Treatise on Magical Elements #: lang/json/GENERIC_from_json.py @@ -40085,7 +40085,7 @@ msgstr "様々な呪文を示す複雑な図形、儀式、身振りなどを詳 #: lang/json/GENERIC_from_json.py msgid "Introduction to the Divine" msgid_plural "Introduction to the Divines" -msgstr[0] "本(魔法/聖職者入門)" +msgstr[0] "本(呪文/聖職者入門)" #. ~ Description for Introduction to the Divine #: lang/json/GENERIC_from_json.py @@ -40097,7 +40097,7 @@ msgstr "文章のほとんどが宗教的なものですが、治癒に関する #: lang/json/GENERIC_from_json.py msgid "The Paladin's Guide to Modern Spellcasting" msgid_plural "The Paladin's Guide to Modern Spellcastings" -msgstr[0] "本(魔法/聖騎士現代呪文集)" +msgstr[0] "本(呪文/聖騎士現代呪文集)" #. ~ Description for The Paladin's Guide to Modern Spellcasting #: lang/json/GENERIC_from_json.py @@ -40109,7 +40109,7 @@ msgstr "「現代」というタイトルですが、内容は中世英語で書 #: lang/json/GENERIC_from_json.py msgid "Winter's Eternal Grasp" msgid_plural "Winter's Eternal Grasps" -msgstr[0] "本(魔法/永遠なる冬の支配)" +msgstr[0] "本(呪文/永遠なる冬の支配)" #. ~ Description for Winter's Eternal Grasp #: lang/json/GENERIC_from_json.py @@ -40120,7 +40120,7 @@ msgstr "氷で作られたかのような華奢な本です。触ると寒さす #: lang/json/GENERIC_from_json.py msgid "The Tome of The Oncoming Storm" msgid_plural "The Tome of The Oncoming Storms" -msgstr[0] "本(魔法/来たるべき嵐の書)" +msgstr[0] "本(呪文/来たるべき嵐の書)" #. ~ Description for The Tome of The Oncoming Storm #: lang/json/GENERIC_from_json.py @@ -40132,7 +40132,7 @@ msgstr "雷雲と交差する稲妻が表紙に浮き彫りで描かれた大き #: lang/json/GENERIC_from_json.py msgid "Nondescript Spellbook" msgid_plural "Nondescript Spellbooks" -msgstr[0] "本(魔法/名もなき呪文書)" +msgstr[0] "本(呪文/名もなき呪文書)" #. ~ Description for Nondescript Spellbook #: lang/json/GENERIC_from_json.py @@ -40142,7 +40142,7 @@ msgstr "魔術の初心者によって書かれた、呪文などが載ってい #: lang/json/GENERIC_from_json.py msgid "The Tome of Flesh" msgid_plural "The Tome of Fleshs" -msgstr[0] "本(魔法/肉の書)" +msgstr[0] "本(呪文/肉の書)" #. ~ Description for The Tome of Flesh #: lang/json/GENERIC_from_json.py @@ -40152,7 +40152,7 @@ msgstr "小さな書物です。表紙が鞣した人間の皮膚で覆われて #: lang/json/GENERIC_from_json.py msgid "The Book of Trees" msgid_plural "The Book of Treess" -msgstr[0] "本(魔法/木々の書)" +msgstr[0] "本(呪文/木々の書)" #. ~ Description for The Book of Trees #: lang/json/GENERIC_from_json.py @@ -41536,7 +41536,7 @@ msgstr[0] "空薬莢(.410口径)" #. ~ Description for .410 hull #: lang/json/GENERIC_from_json.py msgid "An empty hull from a .410 bore shotgun shell." -msgstr ".410口径散弾の空薬莢です。" +msgstr "ショットガン用.410口径弾の空薬莢です。" #: lang/json/ITEM_CATEGORY_from_json.py msgid "GUNS" @@ -43678,7 +43678,7 @@ msgstr "弾倉(ショットガン/サイガ410)" msgid "" "A removable plastic magazine for the Saiga-410 shotgun. Holds 10 rounds of " ".410 bore shotshells." -msgstr "サイガ410に対応する樹脂製10発弾倉です。.410口径散弾を装填できます。" +msgstr "サイガ410に対応する樹脂製10発弾倉です。ショットガン用.410口径弾を装填できます。" #: lang/json/MAGAZINE_from_json.py msgid "Saiga-410 drum magazine" @@ -43689,7 +43689,7 @@ msgstr "弾倉(ショットガン/サイガ410/ドラム)" msgid "" "A removable plastic magazine for the Saiga-410 shotgun. Holds 30 rounds of " ".410 bore shotshells." -msgstr "サイガ410に対応する樹脂製10発ドラム弾倉です。.410口径散弾を装填できます。" +msgstr "サイガ410に対応する樹脂製10発ドラム弾倉です。ショットガン用.410口径弾を装填できます。" #: lang/json/MAGAZINE_from_json.py msgid ".357 Magnum speedloader" @@ -44418,7 +44418,7 @@ msgstr "生体部品のスロットシステムを有効化します。" #: lang/json/MOD_INFO_from_json.py msgid "Classic zombies" -msgstr "クラシックモード" +msgstr "変更 - クラシックモード" #. ~ Description for Classic zombies #: lang/json/MOD_INFO_from_json.py @@ -45911,7 +45911,7 @@ msgstr "真菌ゾンビ" msgid "" "Once human, fungal tendrils now sprout from its mouth, eyes, and other " "orifices, holding together a shambling mass of mold-covered flesh." -msgstr "かつては人間でしたが、今や真菌の糸が口、目、ほかのあらゆる穴から飛び出し、よろめきながら歩く肉塊の形をなんとか支えています。" +msgstr "かつては人間でしたが、今や真菌の糸が口、目、他のあらゆる穴から飛び出し、よろめきながら歩く肉塊の形をなんとか支えています。" #: lang/json/MONSTER_from_json.py msgid "bloated zombie" @@ -61034,7 +61034,7 @@ msgid "" "Place the turret and it will ID you as friendly with its advanced IFF " "software. Consult your safety manual in the event of a malfunction." msgstr "" -"停止している防衛用ショットガンタレットです。起動すると内部に保管されている最大100発の12ゲージ散弾が自動的に装填されます。タレットを設置するとIFFソフトウェアの初期設定が行われ、設置者を味方として登録します。誤作動があった場合は安全マニュアルを参照してください。" +"停止している防衛用ショットガンタレットです。起動すると内部に保管されている最大100発のショットガン用12ゲージ弾が自動的に装填されます。タレットを設置するとIFFソフトウェアの初期設定が行われ、設置者を味方として登録します。誤作動があった場合は安全マニュアルを参照してください。" #: lang/json/TOOL_from_json.py msgid "inactive riot control turret" @@ -63143,7 +63143,7 @@ msgstr "石つぶて" #: lang/json/ammunition_type_from_json.py msgid "shot" -msgstr "散弾/単発弾" +msgstr "12ゲージ" #: lang/json/ammunition_type_from_json.py lang/json/gun_from_json.py #: lang/json/gun_from_json.py @@ -72546,7 +72546,7 @@ msgid "" "other for shotgun shells. It is made from pipes and parts cannibalized from" " a double barrel shotgun." msgstr "" -"銃身が3つ連なった自家製の銃器です。.30-06口径弾を装填する銃身が1つあり、残り2つの銃身には散弾を装填します。二連ショットガンから取り外した部品とパイプから作られています。" +"銃身が3つ連なった自家製の銃器です。.30-06口径弾を装填する銃身が1つあり、残り2つの銃身にはショットガン用12ゲージ弾を装填します。二連ショットガンから取り外した部品とパイプから作られています。" #: lang/json/gun_from_json.py lang/json/gunmod_from_json.py msgctxt "gun_type_type" @@ -72671,7 +72671,7 @@ msgid "" " bore barrels. Historically used by egomaniac hunters in Africa, now used " "by their egomaniac descendants in New England." msgstr "" -".30-06口径の銃身と2つの散弾用滑腔銃身を併せ持った、中折式の複合銃です。かつて自己中心的なハンター達がアフリカで振り回していた銃を、自己中心的な子孫達がニューイングランドで振り回しています。" +".30-06口径の銃身と2つの12ゲージ弾用滑腔銃身を併せ持った、中折式の複合銃です。かつて自己中心的なハンター達がアフリカで振り回していた銃を、自己中心的な子孫達がニューイングランドで振り回しています。" #: lang/json/gun_from_json.py msgid "crude rocket launcher" @@ -73971,7 +73971,7 @@ msgid "" "cartridges and a single 12 gauge shell, it makes a great companion for those" " who wander the \"Earth-that-was\"." msgstr "" -"19世紀中頃にアメリカ南北戦争で使われたレマットリボルバーを、現代式に再設計した銃です。巨大なシリンダーに.44口径弾薬を9発、中央の軸の部分に散弾を1発装填できます。失われた世界をさすらう放浪者のよき友となるでしょう。" +"19世紀中頃にアメリカ南北戦争で使われたレマットリボルバーを、現代式に再設計した銃です。巨大なシリンダーに.44口径弾薬を9発、中央の軸の部分に12ゲージ弾を1発装填できます。失われた世界をさすらう放浪者のよき友となるでしょう。" #: lang/json/gun_from_json.py msgid "pipe rifle: .44 Magnum" @@ -74967,7 +74967,7 @@ msgstr "9x18mmマカロフ弾を使用するモデルです。標準型よりも #: lang/json/gun_from_json.py msgid "bionic shotgun" msgid_plural "bionic shotguns" -msgstr[0] "ショットガン(CBM)" +msgstr[0] "ショットガン(12ゲージ/CBM)" #: lang/json/gun_from_json.py msgid "Bionic one-shot retracting shotgun integrated with your arm." @@ -75194,7 +75194,7 @@ msgstr "小さなペイントボールを発射する、殺傷性のない銃で #: lang/json/gun_from_json.py msgid "heavy automatic shotgun" msgid_plural "heavy automatic shotguns" -msgstr[0] "ショットガン(ヘビーオート)" +msgstr[0] "ショットガン(12ゲージ/ヘビーオート)" #: lang/json/gun_from_json.py msgid "" @@ -75202,23 +75202,23 @@ msgid "" "chambered and re-bored for shotgun shells, and completely redesigned to be " "wielded unmounted by one user." msgstr "" -"ブローニングM2重機関銃を大改造して作った、言うなればまさに重機関散弾銃です。散弾に対応する滑腔銃身が組み込まれています。地形に設置しなくても射撃が可能です。" +"ブローニングM2重機関銃を大改造して作った、言うなればまさに重機関ショットガンです。12ゲージ弾に対応する滑腔銃身が組み込まれています。地形に設置しなくても射撃が可能です。" #: lang/json/gun_from_json.py msgid "12 gauge pistol" msgid_plural "12 gauge pistols" -msgstr[0] "ハンドガン(散弾/12ゲージピストル)" +msgstr[0] "ハンドガン(12ゲージ/12ゲージピストル)" #: lang/json/gun_from_json.py msgid "" "A single shot pistol that loads 12 gauge shotgun shells, handcrafted from " "scrap." -msgstr "鉄くずから作られた、散弾を使用する単発式の拳銃です。" +msgstr "鉄くずから作られた、12ゲージ弾を使用する単発式の拳銃です。" #: lang/json/gun_from_json.py msgid "manual autoshotgun" msgid_plural "manual autoshotguns" -msgstr[0] "ショットガン(手回し車両部品銃)" +msgstr[0] "ショットガン(12ゲージ/手回し車両部品銃)" #: lang/json/gun_from_json.py msgid "" @@ -75230,7 +75230,7 @@ msgstr "" #: lang/json/gun_from_json.py msgid "Kel-Tec KSG" msgid_plural "Kel-Tec KSG" -msgstr[0] "ショットガン(ケルテックKSG)" +msgstr[0] "ショットガン(12ゲージ/ケルテックKSG)" #: lang/json/gun_from_json.py msgid "" @@ -75243,7 +75243,7 @@ msgstr "" #: lang/json/gun_from_json.py msgid "L12 Defender" msgid_plural "L12 Defender" -msgstr[0] "ショットガン(L12ディフェンダー)" +msgstr[0] "ショットガン(12ゲージ/L12ディフェンダー)" #: lang/json/gun_from_json.py msgid "" @@ -75258,7 +75258,7 @@ msgstr "" #: lang/json/gun_from_json.py msgid "M1014 shotgun" msgid_plural "M1014 shotguns" -msgstr[0] "ショットガン(M1014)" +msgstr[0] "ショットガン(12ゲージ/M1014)" #: lang/json/gun_from_json.py msgid "" @@ -75269,7 +75269,7 @@ msgstr "簡便性と信頼性に定評のある、セミオートマチック・ #: lang/json/gun_from_json.py msgid "Mossberg 500" msgid_plural "Mossberg 500" -msgstr[0] "ショットガン(モスバーグ500)" +msgstr[0] "ショットガン(12ゲージ/モスバーグ500)" #: lang/json/gun_from_json.py msgid "" @@ -75280,7 +75280,7 @@ msgstr "非常に人気のあるポンプアクション・ショットガンで #: lang/json/gun_from_json.py msgid "double-barrel pipe shotgun" msgid_plural "double-barrel pipe shotguns" -msgstr[0] "ショットガン(2連パイプ銃)" +msgstr[0] "ショットガン(12ゲージ/2連パイプ銃)" #: lang/json/gun_from_json.py msgid "" @@ -75295,7 +75295,7 @@ msgstr "ダブル" #: lang/json/gun_from_json.py msgid "pipe shotgun" msgid_plural "pipe shotguns" -msgstr[0] "ショットガン(パイプ銃)" +msgstr[0] "ショットガン(12ゲージ/パイプ銃)" #: lang/json/gun_from_json.py msgid "" @@ -75306,7 +75306,7 @@ msgstr "自家製ショットガンです。単発式で、パイプと銃床を #: lang/json/gun_from_json.py msgid "Remington 870" msgid_plural "Remington 870" -msgstr[0] "ショットガン(レミントン870)" +msgstr[0] "ショットガン(12ゲージ/レミントン870)" #: lang/json/gun_from_json.py msgid "" @@ -75319,7 +75319,7 @@ msgstr "" #: lang/json/gun_from_json.py msgid "shotgun revolver" msgid_plural "shotgun revolvers" -msgstr[0] "ショットガン(リボルバー)" +msgstr[0] "ショットガン(12ゲージ/リボルバー)" #: lang/json/gun_from_json.py msgid "" @@ -75330,7 +75330,7 @@ msgstr "6発の弾薬を装填できる回転弾倉式に改造したショッ #: lang/json/gun_from_json.py msgid "Saiga-12" msgid_plural "Saiga-12s" -msgstr[0] "ショットガン(サイガ12)" +msgstr[0] "ショットガン(12ゲージ/サイガ12)" #: lang/json/gun_from_json.py msgid "" @@ -75343,7 +75343,7 @@ msgstr "" #: lang/json/gun_from_json.py msgid "double barrel shotgun" msgid_plural "double barrel shotguns" -msgstr[0] "ショットガン(2連)" +msgstr[0] "ショットガン(12ゲージ/2連)" #: lang/json/gun_from_json.py msgid "" @@ -75354,7 +75354,7 @@ msgstr "骨董品としての価値がありそうなほど古めかしいショ #: lang/json/gun_from_json.py msgid "single barrel shotgun" msgid_plural "single barrel shotguns" -msgstr[0] "ショットガン(単銃身)" +msgstr[0] "ショットガン(12ゲージ/単銃身)" #: lang/json/gun_from_json.py msgid "" @@ -75367,7 +75367,7 @@ msgstr "" #: lang/json/gun_from_json.py msgid "handmade lever shotgun" msgid_plural "handmade lever shotguns" -msgstr[0] "ショットガン(手製レバーアクション銃)" +msgstr[0] "ショットガン(12ゲージ/手製レバーアクション)" #: lang/json/gun_from_json.py msgid "" @@ -75462,7 +75462,7 @@ msgstr "" #: lang/json/gun_from_json.py msgid "sawn-off shotgun" msgid_plural "sawn-off shotguns" -msgstr[0] "ショットガン(短銃身)" +msgstr[0] "ショットガン(12ゲージ/短銃身)" #: lang/json/gun_from_json.py msgid "" @@ -75474,7 +75474,7 @@ msgstr "" #: lang/json/gun_from_json.py msgid "sawn pipe shotgun" msgid_plural "sawn pipe shotguns" -msgstr[0] "ショットガン(短銃身パイプ銃)" +msgstr[0] "ショットガン(12ゲージ/短銃身パイプ銃)" #: lang/json/gun_from_json.py msgid "" @@ -76018,7 +76018,7 @@ msgstr "単発式のポンプアクションショットガンです。内部の #: lang/json/gun_from_json.py msgid "combat shotgun" msgid_plural "combat shotguns" -msgstr[0] "ショットガン(コンバットショットガン)" +msgstr[0] "ショットガン(12ゲージ/コンバット)" #: lang/json/gun_from_json.py msgid "" @@ -76364,7 +76364,7 @@ msgstr "これはモンスターが攻撃をする際の疑似アイテムです #: lang/json/gun_from_json.py msgid "integral 12 gauge shotgun" msgid_plural "integral 12 gauge shotguns" -msgstr[0] "内蔵型銃器(12ゲージショットガン)" +msgstr[0] "内蔵型銃器(12ゲージ/ショットガン)" #: lang/json/gun_from_json.py msgid "integral 50 caliber machinegun" @@ -77129,7 +77129,7 @@ msgid "" "military aircraft pilots who might be stranded after a crash, later produced" " commercially by various companies." msgstr "" -"コンパクトに折り畳んで収納できる、.410口径散弾銃の銃身と.22口径リムファイア式銃身を組み合わせた軽量ライフルです。軍用機のパイロットが墜落して取り残された際に使えるよう設計されましたが、開発以後は様々な企業が一般市場向けに製造しました。" +"コンパクトに折り畳んで収納できる、.410口径ショットガンの銃身と.22口径リムファイア式銃身を組み合わせた軽量ライフルです。軍用機のパイロットが墜落して取り残された際に使えるよう設計されましたが、開発以後は様々な企業が一般市場向けに製造しました。" #: lang/json/gun_from_json.py msgid "Colt Single Action Army" @@ -77169,7 +77169,7 @@ msgid "" " commonly chambered for .45 Long Colt, with chambers long enough to accept " ".410 shotgun shells." msgstr "" -"ボンドアームズ社のデリンジャーは二連式のコンパクトな拳銃です。一般的には.45口径ロングコルト弾を使用しますが、.410口径散弾も十分装填できる長さを備えています。" +"ボンドアームズ社のデリンジャーは二連式のコンパクトな拳銃です。一般的には.45口径ロングコルト弾を使用しますが、ショットガン用.410口径弾も十分装填できる長さを備えています。" #: lang/json/gun_from_json.py msgid ".410 youth shotgun" @@ -77181,7 +77181,7 @@ msgid "" "An old break-action shotgun, chambered in .410 bore. Designed as a lower-" "recoil alternative to 12 gauge, it is light and simple in manufacture." msgstr "" -".410散弾を装填できる古い中折れ式のショットガンです。通常のショットガンよりも反動の少ない代替品として開発された銃で、軽量かつ構造も単純です。" +"ショットガン用.410口径弾を装填できる古い中折れ式のショットガンです。通常のショットガンよりも反動の少ない代替品として開発された銃で、軽量かつ構造も単純です。" #: lang/json/gun_from_json.py msgid ".410 pipe shotgun" @@ -77192,7 +77192,7 @@ msgstr[0] "ショットガン(.410口径/パイプ銃)" msgid "" "A home-made shotgun, in .410 bore. It is simply a pipe attached to a stock," " with a hammer to strike the single round it holds." -msgstr ".410口径散弾を使用する自家製のショットガンです。単発式で、パイプと銃床を組み合わせたフレームに引き金と撃鉄が付いています。" +msgstr "ショットガン用.410口径弾を使用する自家製のショットガンです。単発式で、パイプと銃床を組み合わせたフレームに引き金と撃鉄が付いています。" #: lang/json/gun_from_json.py msgid "AF2011A1 .38 Super" @@ -77227,7 +77227,7 @@ msgid "" "Casull. It has the ability to fire .410 shotshells and .45 Long Colt " "cartridges." msgstr "" -".454カスール弾を使用する5連発リボルバーです。その名に恥じない絶大な制止力を発揮します。.410口径散弾と.45口径ロングコルト弾を装填できます。" +".454カスール弾を使用する5連発リボルバーです。その名に恥じない絶大な制止力を発揮します。ショットガン用.410口径弾と.45口径ロングコルト弾を装填できます。" #: lang/json/gunmod_from_json.py msgid "barrel extension" @@ -77254,7 +77254,7 @@ msgid "" "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." -msgstr "ショットガンの銃身にライフリングを刻むことでスラッグ弾の精度を向上させます。ショットガンらしくないと言えばらしくない改造ですけど、ね。" +msgstr "ショットガンの銃身にライフリングを刻むことで単発弾の精度を向上させます。ショットガンらしくないと言えばらしくない改造ですけど、ね。" #: lang/json/gunmod_from_json.py msgid "rapid blowback" @@ -78451,7 +78451,8 @@ msgstr[0] "LWアンダーバレル・ショットガン" msgid "" "Leadworks built in minimalist pump action shotgun module. It allows 4 " "shotgun shells to be loaded and fired." -msgstr "最小限の部品で構成された、Leadworks社製の内蔵式ポンプアクションショットガン機構です。散弾を4発装填して発砲できます。" +msgstr "" +"最小限の部品で構成された、Leadworks社製の内蔵式ポンプアクションショットガン機構です。ショットガン用12ゲージ弾を4発装填して発砲できます。" #: lang/json/gunmod_from_json.py msgid "LW GLM" @@ -79164,7 +79165,7 @@ msgid "" " create certain items. Traps, Marksmanship, and First Aid are all required " "for certain items." msgstr "" -"主要な製作関連スキルに加え、そのほかのスキルも特定のアイテム製作で必要になるかもしれません。罠や射撃、応急手当スキルは、それぞれの分野に関連するアイテムの製作に必要です。" +"主要な製作関連スキルに加え、その他のスキルも特定のアイテム製作で必要になるかもしれません。罠や射撃、応急手当スキルは、それぞれの分野に関連するアイテムの製作に必要です。" #: lang/json/help_from_json.py msgid "" @@ -79872,7 +79873,7 @@ msgstr "^>v< 薬局 - 貴重な医療品がたくさん msgid "" "^>v< Grocery store - A good source of canned " "food and other supplies." -msgstr "^>v< 食料雑貨店 - 缶詰などの食料がたくさん揃っている。" +msgstr "^>v< 食料雑貨店 - 保存食などがたくさん揃っている。" #: lang/json/help_from_json.py msgid "" @@ -79963,7 +79964,7 @@ msgid "" "The biggest drawback to shotguns is their noisiness. They are very loud, and impossible to silence. A shot that kills one zombie might attract three more! Beware of that." msgstr "" "( ショットガン\n" -"ショットガンはゲーム中で最も強力な銃器の一種であり、大抵の相手を一発で仕留められます。小ペレット弾や散弾は拡散するので、近くの相手に簡単に命中します。しかし、装甲の厚い相手には効果が薄く、散弾を完全に無効化するものもいます。単発弾は射程距離が長く、このような相手に効果的です。\n" +"ショットガンはゲーム中で最も強力な銃器の一種であり、大抵の相手を一発で仕留められます。バードショットや散弾は拡散するので、近くの相手に簡単に命中します。しかし、装甲の厚い相手には効果が薄く、散弾を完全に無効化するものもいます。単発弾は射程距離が長く、このような相手に効果的です。\n" "最大の欠点は銃声です。とても大きく、抑える事ができません。ゾンビを1体撃ち殺すと3体集まってくるかもしれません!気を付けましょう。" #: lang/json/help_from_json.py @@ -80027,7 +80028,7 @@ msgid "" "A: Lots of the food found in towns is perishable and will only last a few days after the start of a new game. The electricity went out several days ago so fruit, milk and others are the first to go bad. After the first couple of days, you should switch to canned food, jerky, and hunting. Also, you should make sure to cook any food and purify any water you hunt up as it may contain parasites or otherwise be unsafe." msgstr "" "Q: 何を食べても体調が悪くなる! どういうことだ?\n" -"A: 町で見つかる大抵の食料は腐りやすく、ゲーム開始からわずか数日しか保ちません。数日前から送電が停止しているので、果物、牛乳などはすぐに傷みます。しばらく経ったら缶詰、干し肉、狩猟で得た肉に移行しましょう。また、見つけた食料には寄生虫など色々な危険が潜んでいる場合もあるのできちんと調理し、水は浄水しましょう。" +"A: 町で見つかる大抵の食料は腐りやすく、ゲーム開始からわずか数日しか保ちません。数日前から送電が停止しているので、果物、牛乳などはすぐに傷みます。しばらく経ったら保存食、干し肉、狩猟で得た肉に移行しましょう。また、見つけた食料には寄生虫など色々な危険が潜んでいる場合もあるのできちんと調理し、水は浄水しましょう。" #: lang/json/help_from_json.py msgid "" @@ -80122,7 +80123,7 @@ msgstr "" "Q: 銃の口径や種類が多すぎてよく分からない。どれをどれに装填できるのか把握できない。\n" "A: 以下の一般的な口径と種類を覚えておきましょう。\n" "9x19mm (単に9mmとも) - 大抵の基本的なハンドガン(例: グロック) とサブマシンガンに装填でき、入手も容易で、通常のゾンビに対してなら十分通用します。\n" -"散弾、大ペレット弾 - 大抵のショットガンに装填できます。近くにいる装甲を持たない敵に対して非常に有効です。\n" +"散弾 - 大抵のショットガンに装填できます。近くにいる装甲を持たない敵に対して非常に有効です。\n" " .223口径(5.56mm) - ライフル用の弾薬です。遠くの敵に対して有効です。\n" " .308口径(7.62mm) - 更に強力なライフルのための弾薬です。遠くの敵に対して有効です。\n" "基本的にはこれだけ覚えれば十分です。もちろんショットガンだけを持って、散弾をたっぷり装填し、敵を地獄に送る戦法を選んでも構いません!" @@ -87105,7 +87106,7 @@ msgid "" "scavengers in smaller lots. This should be enough to test out our " "equipment." msgstr "" -"ありがとう。仲間と小規模の事業を始めたら、君やほかのスカベンジャーからもっと少ない個数の瓶も引き取るようにするよ。下準備としてはこれで十分だ。" +"ありがとう。仲間と小規模の事業を始めたら、君や他のスカベンジャーからもっと少ない個数の瓶も引き取るようにするよ。下準備としてはこれで十分だ。" #: lang/json/mission_def_from_json.py msgid "Oh well. I'll see if I can find another supplier, thanks." @@ -106387,7 +106388,7 @@ msgstr "ライフル弾" #. ~ Crafting recipes subcategory of 'AMMO' category #: lang/json/recipe_category_from_json.py msgid "SHOT" -msgstr "散弾" +msgstr "ショットガン弾" #. ~ Crafting recipes subcategory of 'AMMO' category #: lang/json/recipe_category_from_json.py @@ -106974,7 +106975,7 @@ msgstr "調理: アスピック(野菜)" #: lang/json/recipe_group_from_json.py msgid " Cook: Meat, Canned" -msgstr "調理: 缶詰(肉)" +msgstr "調理: 肉(保存食)" #: lang/json/recipe_group_from_json.py msgid " Cook: Meat Aspic" @@ -108852,7 +108853,7 @@ msgid "" "effectiveness and accuracy decline rapidly with range. Slugs can be loaded " "into shotguns to provide greater range, though they are somewhat inaccurate." msgstr "" -"ショットガンは扱いが簡単なうえに絶大なダメージを叩き込んでくれる非常に頼れる武器ですが、距離が遠くなると極端に威力と精度が落ちてしまいます。スラッグ弾(単発弾)を装填すれば射程は伸びますが、依然として精度は頼りないものです。" +"ショットガンは扱いが簡単なうえに絶大なダメージを叩き込んでくれる非常に頼れる武器ですが、距離が遠くなると極端に威力と精度が落ちてしまいます。単発弾を装填すれば射程は伸びますが、依然として精度は頼りないものです。" #: lang/json/skill_from_json.py msgid "submachine guns" @@ -112148,7 +112149,7 @@ msgid "" "Cataclysm\" " msgstr "" "『グラネード氏が出資者を募る』本紙でもお馴染み、疑惑の元科学者Kevin " -"Granade氏が出資者を募っています。現実歪曲武器「趣榴弾」と呼ばれるそれは「(省略)という仕組みにより、現実を塗り替える事で効果を発揮する」との謳い文句の品物のようで、キックスターターを通してクラウドソーシングされるようです。プロジェクト名は「Project" +"Granade氏が出資者を募っています。現実歪曲武器「趣榴弾」と呼ばれるそれは「(省略)という仕組みにより、現実を塗り替える効果を発揮する」という謳い文句の品物のようで、キックスターターを通してクラウドソーシングされるようです。プロジェクト名は「Project" " Cataclysm」です。 " #: lang/json/snippet_from_json.py @@ -114083,7 +114084,7 @@ msgstr "食料雑貨店にフルーツがたくさんあるのは知ってるだ msgid "" "Next time you visit a grocery store, load up on canned goods. They never go" " bad!" -msgstr "食料雑貨店に行ったら、缶詰を持って帰ろう。缶詰は腐らない!" +msgstr "食料雑貨店に行ったら、保存食を持って帰ろう。缶詰は腐らない!" #: lang/json/snippet_from_json.py msgid "" @@ -117654,7 +117655,7 @@ msgstr "あんた" #: lang/json/snippet_from_json.py msgid "" "\"Don't let the ember go out please don't go out I need you precious fire.\"" -msgstr "「火口は外に出すな、いいか絶対外に出すなよ、火は貴重なんだ」" +msgstr "「火口は切らすな、いいか絶対外に切らすなよ、火は貴重なんだ」" #: lang/json/snippet_from_json.py msgid "\"ITS A TRAP NO WAIT ITS A TARP\"" @@ -123100,7 +123101,7 @@ msgid "" "spending a long time there after all, while I figured out how to get in good" " with my crew." msgstr "" -"倉庫の中ではインターネットもできたから、YouTubeライブでいかれた映像を見て死ぬほどビビったよ。ありがたいことに食料の缶詰は山ほどあったから、倉庫の中ではのんびりと過ごせた。仲間たちの機嫌を取る方法を思いつくまでは、ずっと籠っていようとも考えていたんだけどな。" +"倉庫の中ではインターネットもできたから、YouTubeライブでいかれた映像を見て死ぬほどビビったよ。ありがたいことに保存食は山ほどあったから、倉庫の中ではのんびりと過ごせた。仲間たちの機嫌を取る方法を思いつくまでは、ずっと籠っていようとも考えていたんだけどな。" #: lang/json/talk_topic_from_json.py msgid "Something must have driven you out of there." @@ -124375,7 +124376,7 @@ msgid "" " switch though, the fighting was starting to die off, and I was mostly just " "avoiding attention from zombies and other things." msgstr "" -"ああ。まったくだ。仕事場から徒歩で市街地を越えるのに2日もかかったよ。ゴミ置き場か何かの中で野宿しつつ夜中に移動して、軍隊を避ける術をすぐに学んだ。奴らはを集める磁石みたいなものだし、大抵は化け物が通る場所に駐屯していたからな。最初の内は、街中でも楽に進める場所は残っていた。市民が完全に避難して無人になった区画もいくつかあって、そこにはもいなかった。しばらく時間が経つと、他の市民も無事な家へと移動を始めたので、私は跡形もなくなった商業地区を突っ切って動くようにした。とにかく、家へ帰りたかった。その頃には戦闘も治まり始めていたから、ゾンビやほかの化け物の注意を引かないように進んでいった。" +"ああ。まったくだ。仕事場から徒歩で市街地を越えるのに2日もかかったよ。ゴミ置き場か何かの中で野宿しつつ夜中に移動して、軍隊を避ける術をすぐに学んだ。奴らはを集める磁石みたいなものだし、大抵は化け物が通る場所に駐屯していたからな。最初の内は、街中でも楽に進める場所は残っていた。市民が完全に避難して無人になった区画もいくつかあって、そこにはもいなかった。しばらく時間が経つと、他の市民も無事な家へと移動を始めたので、私は跡形もなくなった商業地区を突っ切って動くようにした。とにかく、家へ帰りたかった。その頃には戦闘も治まり始めていたから、ゾンビや他の化け物の注意を引かないように進んでいった。" #: lang/json/talk_topic_from_json.py msgid "" @@ -128150,7 +128151,7 @@ msgid "" " can pay a premium for any you have on you. Canned food and other edibles " "are handled by the merchant in the front in trade." msgstr "" -"この3品目は大量に自家製造しやすい上、腐りにくい。地元の農家と数人のハンターも、栄養価の高い食料を提供すると言っているが、物資は常に多ければ多いほどいい。物資は一度にたくさん取り引きするほど安くなるものだが、ここに持ってくれば割増金も付けて買い取ろう。缶詰や他の食品はフロントの商人と取り引きしてくれ。" +"この3品目は大量に自家製造しやすい上、腐りにくい。地元の農家と数人のハンターも、栄養価の高い食料を提供すると言っているが、物資は常に多ければ多いほどいい。物資は一度にたくさん取り引きするほど安くなるものだが、ここに持ってくれば割増金も付けて買い取ろう。保存食や他の食品はフロントの商人と取り引きしてくれ。" #: lang/json/talk_topic_from_json.py msgid "Are you looking to buy anything else?" @@ -128704,7 +128705,7 @@ msgid "" " here, we've been doing alright. As to where it is, I don't have the " "foggiest of ideas." msgstr "" -"十数人でチームを組んでる「スカベンジャー」が、いくつかの政府関係施設を見つけたんだ。ほぼ毎週やってきて、文字通りトラックの荷台一杯にツナギの戦闘服やM4カービン、缶詰などを届けてくれている。連中の何人かはここではもう顔なじみだから、うまくやっているよ。物資をどこから拝借してるかなんて、見当もつかないけどな。" +"十数人でチームを組んでる「スカベンジャー」が、いくつかの政府関係施設を見つけたんだ。ほぼ毎週やってきて、文字通りトラックの荷台一杯にツナギの戦闘服やM4カービン、保存食などを届けてくれている。連中の何人かはここではもう顔なじみだから、うまくやっているよ。物資をどこから拝借してるかなんて、見当もつかないけどな。" #: lang/json/talk_topic_from_json.py msgid "Thanks, I'll keep an eye out." @@ -157750,12 +157751,12 @@ msgstr "格子の隙間をスルリと通り抜けました。" #: src/iexamine.cpp #, c-format msgid "Take down the %s?" -msgstr "%sを分解しますか?" +msgstr "%sを片付けますか?" #: src/iexamine.cpp src/map.cpp #, c-format msgid "You take down the %s." -msgstr "%sを分解しました。" +msgstr "%sを片付けました。" #: src/iexamine.cpp #, c-format @@ -158204,7 +158205,7 @@ msgstr "CBMを使って火をつける" #: src/iexamine.cpp #, c-format msgid "Take down the %s" -msgstr "%sを分解する" +msgstr "%sを片付ける" #: src/iexamine.cpp #, c-format @@ -158218,7 +158219,7 @@ msgstr "火をつけられませんでした。" #: src/iexamine.cpp #, c-format msgid "Really take down the %s while it's on fire?" -msgstr "本当に火が燃えている%sを分解しますか?" +msgstr "本当に火が燃えている%sを片付けますか?" #: src/iexamine.cpp msgid "This keg is empty." @@ -165905,7 +165906,7 @@ msgstr "%sが邪魔です。" #: src/iuse_actor.cpp #, c-format msgid "The %s in that direction is not passable." -msgstr "その方向の%sは通行できません。" +msgstr "%sが邪魔なため、その方向には設置できません。" #: src/iuse_actor.cpp #, c-format diff --git a/lang/po/pl.po b/lang/po/pl.po index f13867f9ef38b..2e7a85c3fc110 100644 --- a/lang/po/pl.po +++ b/lang/po/pl.po @@ -7,8 +7,8 @@ # Artur Gromek , 2019 # Chris Bittner , 2019 # Brett Dong , 2019 -# Aleksander Sienkiewicz , 2019 # Ewa Cichosz , 2019 +# Aleksander Sienkiewicz , 2019 # msgid "" msgstr "" @@ -16,7 +16,7 @@ msgstr "" "Report-Msgid-Bugs-To: \n" "POT-Creation-Date: 2019-06-07 17:32+0800\n" "PO-Revision-Date: 2018-04-26 14:47+0000\n" -"Last-Translator: Ewa Cichosz , 2019\n" +"Last-Translator: Aleksander Sienkiewicz , 2019\n" "Language-Team: Polish (https://www.transifex.com/cataclysm-dda-translators/teams/2217/pl/)\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" @@ -41423,16 +41423,17 @@ msgstr "" #: lang/json/GENERIC_from_json.py msgid "handful of chamomile flowers" msgid_plural "handfuls of chamomile flowers" -msgstr[0] "" -msgstr[1] "" -msgstr[2] "" -msgstr[3] "" +msgstr[0] "garść kwiatów rumianku" +msgstr[1] "garście kwiatów rumianku" +msgstr[2] "garści kwiatów rumianku" +msgstr[3] "garści kwiatów rumianku" #. ~ Description for handful of chamomile flowers #: lang/json/GENERIC_from_json.py msgid "" "White chamomile flowers, used as a herbal remedy since the ancient times." msgstr "" +"Białe kwiaty rumianku, stosowane jako środek ziołowy od czasów starożytnych." #: lang/json/GENERIC_from_json.py msgid "lump of clay" @@ -41476,20 +41477,20 @@ msgstr "Zaprawa murarska, gotowa do użycia w projektach budowlanych." #: lang/json/GENERIC_from_json.py msgid "soft adobe brick" msgid_plural "soft adobe bricks" -msgstr[0] "" -msgstr[1] "" -msgstr[2] "" -msgstr[3] "" +msgstr[0] "miękka cegła suszona na słońcu" +msgstr[1] "miękkie cegły suszone na słońcu" +msgstr[2] "miękkich cegieł suszonych na słońcu" +msgstr[3] "miękkich cegieł suszonych na słońcu" #. ~ Use action msg for soft adobe brick. #: lang/json/GENERIC_from_json.py msgid "You test the brick, and it seems solid enough to use." -msgstr "" +msgstr "Testujesz cegłę i wydaje się ona wystarczająco solidna, by ją użyć." #. ~ Use action not_ready_msg for soft adobe brick. #: lang/json/GENERIC_from_json.py msgid "The brick is still too damp to bear weight." -msgstr "" +msgstr "Cegła jest nadal zbyt wilgotna, aby wytrzymać ciężar." #. ~ Description for soft adobe brick #: lang/json/GENERIC_from_json.py @@ -41501,10 +41502,10 @@ msgstr "" #: lang/json/GENERIC_from_json.py msgid "adobe brick" msgid_plural "adobe bricks" -msgstr[0] "" -msgstr[1] "" -msgstr[2] "" -msgstr[3] "" +msgstr[0] "cegła suszona na słońcu" +msgstr[1] "cegły suszone na słońcu" +msgstr[2] "cegieł suszonych na słońcu" +msgstr[3] "cegieł suszonych na słońcu" #. ~ Description for adobe brick #: lang/json/GENERIC_from_json.py @@ -41512,6 +41513,8 @@ msgid "" "A compacted mass of soil and natural fibers, baked dry enough to harden into" " a brick." msgstr "" +"Zagęszczona masa gleby i włókien naturalnych, upieczona na tyle, by " +"utwardzić się w cegłę." #: lang/json/GENERIC_from_json.py msgid "adobe mortar" @@ -41914,10 +41917,10 @@ msgstr "" #: lang/json/GENERIC_from_json.py msgid "desiccated corpse" msgid_plural "desiccated corpses" -msgstr[0] "" -msgstr[1] "" -msgstr[2] "" -msgstr[3] "" +msgstr[0] "wysuszone zwłoki" +msgstr[1] "wysuszonych zwłok" +msgstr[2] "wysuszonych zwłok" +msgstr[3] "wysuszonych zwłok" #. ~ Description for desiccated corpse #: lang/json/GENERIC_from_json.py @@ -41925,6 +41928,8 @@ msgid "" "A badly mangled and desiccated partial corpse. It seems whatever thing " "killed him did so with a single swipe of a gigantic claw." msgstr "" +"Poważnie rozszarpane i wysuszone części zwłok. Wygląda na to, że cokolwiek " +"go zabiło, zrobiło to jednym pociągnięciem gigantycznego pazura." #: lang/json/GENERIC_from_json.py msgid "science ID card" @@ -79855,7 +79860,7 @@ msgstr "wytwarza" #: lang/json/activity_type_from_json.py msgid "disassembly" -msgstr "" +msgstr "demontuje" #: lang/json/activity_type_from_json.py lang/json/tool_quality_from_json.py msgid "butchering" @@ -79863,151 +79868,151 @@ msgstr "rzeźnicki" #: lang/json/activity_type_from_json.py msgid "field dressing" -msgstr "" +msgstr "patroszy" #: lang/json/activity_type_from_json.py msgid "skinning" -msgstr "" +msgstr "oskórowuje" #: lang/json/activity_type_from_json.py msgid "quartering" -msgstr "" +msgstr "ćwiartuje" #: lang/json/activity_type_from_json.py msgid "dismembering" -msgstr "" +msgstr "rozczłonkowuje" #: lang/json/activity_type_from_json.py msgid "dissecting" -msgstr "" +msgstr "sekcjonuje" #: lang/json/activity_type_from_json.py msgid "salvaging" -msgstr "" +msgstr "odzyskuje" #: lang/json/activity_type_from_json.py msgid "foraging" -msgstr "" +msgstr "zbiera" #: lang/json/activity_type_from_json.py msgid "construction" -msgstr "" +msgstr "konstruuje" #: lang/json/activity_type_from_json.py msgid "interacting with the vehicle" -msgstr "" +msgstr "manipuluje pojazdem" #: lang/json/activity_type_from_json.py msgid "training" -msgstr "" +msgstr "trenuje" #: lang/json/activity_type_from_json.py msgid "socializing" -msgstr "" +msgstr "rozmawia" #: lang/json/activity_type_from_json.py msgid "using first aid" -msgstr "" +msgstr "stosuje pierwszą pomoc" #: lang/json/activity_type_from_json.py msgid "fishing" -msgstr "" +msgstr "wędkuje" #: lang/json/activity_type_from_json.py msgid "mining" -msgstr "" +msgstr "kopie" #: lang/json/activity_type_from_json.py msgid "burrowing" -msgstr "" +msgstr "zagrzebuje" #: lang/json/activity_type_from_json.py msgid "smashing" -msgstr "" +msgstr "rozbija" #: lang/json/activity_type_from_json.py msgid "cranking" -msgstr "" +msgstr "nakręca" #: lang/json/activity_type_from_json.py msgid "de-stressing" -msgstr "" +msgstr "odstresowuje" #: lang/json/activity_type_from_json.py msgid "cutting tissues" -msgstr "" +msgstr "tnie tkanki" #: lang/json/activity_type_from_json.py msgid "dropping" -msgstr "" +msgstr "upuszcza" #: lang/json/activity_type_from_json.py msgid "stashing" -msgstr "" +msgstr "chomikuje" #: lang/json/activity_type_from_json.py msgid "picking up" -msgstr "" +msgstr "podnosi" #: lang/json/activity_type_from_json.py msgid "moving items" -msgstr "" +msgstr "przemieszcza przedmioty" #: lang/json/activity_type_from_json.py msgid "sorting out the loot" -msgstr "" +msgstr "sortuje zdobycz" #: lang/json/activity_type_from_json.py msgid "tilling the farm plot" -msgstr "" +msgstr "przekopuje pole" #: lang/json/activity_type_from_json.py msgid "planting seeds" -msgstr "" +msgstr "sadzi nasiona" #: lang/json/activity_type_from_json.py msgid "harvesting plots" -msgstr "" +msgstr "zbiera plony" #: lang/json/activity_type_from_json.py msgid "fertilizing plots" -msgstr "" +msgstr "nawozi pole" #: lang/json/activity_type_from_json.py msgid "interacting with inventory" -msgstr "" +msgstr "manipuluje wyposażeniem" #: lang/json/activity_type_from_json.py msgid "fiddling with your clothes" -msgstr "" +msgstr "manipuluje ubraniami" #: lang/json/activity_type_from_json.py msgid "lighting the fire" -msgstr "" +msgstr "rozpala ogień" #: lang/json/activity_type_from_json.py msgid "working the winch" -msgstr "" +msgstr "pracuje korbą" #: lang/json/activity_type_from_json.py msgid "filling the container" -msgstr "" +msgstr "wypełnia pojemnik" #: lang/json/activity_type_from_json.py msgid "hotwiring the vehicle" -msgstr "" +msgstr "spina na krótko pojazd" #: lang/json/activity_type_from_json.py msgid "aiming" -msgstr "" +msgstr "celuje" #: lang/json/activity_type_from_json.py msgid "using the ATM" -msgstr "" +msgstr "używa bankomatu" #: lang/json/activity_type_from_json.py msgid "trying to start the vehicle" -msgstr "" +msgstr "uruchamia pojazd" #: lang/json/activity_type_from_json.py lang/json/tool_quality_from_json.py msgid "welding" @@ -80015,47 +80020,47 @@ msgstr "spawajacy" #: lang/json/activity_type_from_json.py msgid "cracking" -msgstr "" +msgstr "krakuje" #: lang/json/activity_type_from_json.py msgid "repairing" -msgstr "" +msgstr "naprawia" #: lang/json/activity_type_from_json.py msgid "mending" -msgstr "" +msgstr "łata" #: lang/json/activity_type_from_json.py msgid "modifying gun" -msgstr "" +msgstr "modyfikuje broń" #: lang/json/activity_type_from_json.py msgid "modifying tool" -msgstr "" +msgstr "modyfikuje narzędzie" #: lang/json/activity_type_from_json.py msgid "interacting with the NPC" -msgstr "" +msgstr "rozmawia z NPC" #: lang/json/activity_type_from_json.py msgid "clearing that rubble" -msgstr "" +msgstr "oczyszcza gruz" #: lang/json/activity_type_from_json.py msgid "meditating" -msgstr "" +msgstr "medytuje" #: lang/json/activity_type_from_json.py msgid "washing" -msgstr "" +msgstr "myje" #: lang/json/activity_type_from_json.py msgid "cutting the metal" -msgstr "" +msgstr "tnie metal" #: lang/json/activity_type_from_json.py msgid "chopping down" -msgstr "" +msgstr "rąbie drewno" #: lang/json/activity_type_from_json.py lang/json/tool_quality_from_json.py msgid "drilling" @@ -80067,71 +80072,71 @@ msgstr "kopiacy" #: lang/json/activity_type_from_json.py msgid "filling" -msgstr "" +msgstr "zasypuje" #: lang/json/activity_type_from_json.py msgid "shaving" -msgstr "" +msgstr "goli" #: lang/json/activity_type_from_json.py msgid "cutting your hair" -msgstr "" +msgstr "obcina włosy" #: lang/json/activity_type_from_json.py msgid "playing with your pet" -msgstr "" +msgstr "bawi się ze zwierzakiem" #: lang/json/activity_type_from_json.py msgid "trying to fall asleep" -msgstr "" +msgstr "próbuje zasnąć" #: lang/json/activity_type_from_json.py msgid "unloading" -msgstr "" +msgstr "rozładowuje" #: lang/json/activity_type_from_json.py msgid "programming override" -msgstr "" +msgstr "programuje obejście" #: lang/json/activity_type_from_json.py msgid "putting on items" -msgstr "" +msgstr "zakłada przemioty" #: lang/json/activity_type_from_json.py msgid "communing with the trees" -msgstr "" +msgstr "jednoczy się z drzewami" #: lang/json/activity_type_from_json.py msgid "eating" -msgstr "" +msgstr "spożywa" #: lang/json/activity_type_from_json.py msgid "consuming" -msgstr "" +msgstr "konsumuje" #: lang/json/activity_type_from_json.py msgid "casting" -msgstr "" +msgstr "rzuca" #: lang/json/activity_type_from_json.py msgid "studying" -msgstr "" +msgstr "studiuje" #: lang/json/activity_type_from_json.py msgid "drinking" -msgstr "" +msgstr "pije" #: lang/json/activity_type_from_json.py msgid "using drugs" -msgstr "" +msgstr "używa dragów" #: lang/json/activity_type_from_json.py msgid "using the mind splicer" -msgstr "" +msgstr "używa sklejarki umysłu" #: lang/json/activity_type_from_json.py msgid "hacking console" -msgstr "" +msgstr "hakuje konsolę" #: lang/json/ammunition_type_from_json.py msgid ".700 Nitro Express" @@ -80143,7 +80148,7 @@ msgstr ".50 BMG" #: lang/json/ammunition_type_from_json.py msgid ".45-70" -msgstr "" +msgstr ".45-70" #: lang/json/ammunition_type_from_json.py msgid "nails" @@ -80196,7 +80201,7 @@ msgstr "9x18mm" #: lang/json/ammunition_type_from_json.py msgid ".380 ACP" -msgstr "" +msgstr ".380 ACP" #: lang/json/ammunition_type_from_json.py msgid ".38" @@ -80388,11 +80393,11 @@ msgstr "rozpylane chemikalium" #: lang/json/ammunition_type_from_json.py msgid "compressed air" -msgstr "" +msgstr "skompresowane powietrze" #: lang/json/ammunition_type_from_json.py msgid "pulse ammo" -msgstr "" +msgstr "amunicja pulsacyjna" #: lang/json/ammunition_type_from_json.py msgid "6.54x42mm" @@ -82046,7 +82051,7 @@ msgstr "Zbuduj Ścianę z Worków z Piaskiem" #: lang/json/construction_from_json.py msgid "Build Earthbag Wall" -msgstr "" +msgstr "Zbuduj Ścianę z Worków z Ziemią" #: lang/json/construction_from_json.py msgid "Build Metal Wall" @@ -82186,11 +82191,11 @@ msgstr "Musi mieć obustronne podparcie w ogrodzeniu, ścianach, itp." #: lang/json/construction_from_json.py msgid "Build Chickenwire Fence" -msgstr "" +msgstr "Zbuduj Ogrodzenie z Siatki" #: lang/json/construction_from_json.py msgid "Build Chickenwire Gate" -msgstr "" +msgstr "Zbuduj Bramę z Siatki" #: lang/json/construction_from_json.py msgid "Seal Crate" @@ -82282,7 +82287,7 @@ msgstr "Zbuduj Siennik" #: lang/json/construction_from_json.py msgid "Build Pile of Leaves" -msgstr "" +msgstr "Zbuduj Stos Liści" #: lang/json/construction_from_json.py msgid "Build Bed from Scratch" @@ -82590,7 +82595,7 @@ msgstr "Zbuduj Ścianę z Ubitej Ziemi" #: lang/json/construction_from_json.py msgid "Build Counter Gate" -msgstr "" +msgstr "Zbuduj Drzwi Lady" #: lang/json/construction_from_json.py msgid "Build Split Rail Fence Gate" @@ -82622,23 +82627,27 @@ msgstr "Zbuduj Schronienie z Plandeki" #: lang/json/construction_from_json.py msgid "Convert Fridge Power Supply" -msgstr "" +msgstr "Przerób Zasilacz Lodówki" #: 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 "" +"Konwertuje lodówkę na zasilanie z pojazdu. Możesz ją zbadać by wziąć ja do " +"montażu." #: lang/json/construction_from_json.py msgid "Convert Vehicle Fridge to Freezer" -msgstr "" +msgstr "Przerób Chłodziarkę Samochodową na Zamrażarkę" #: 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 "" +"Przerabia dalej przerobioną lodówkę na zamrażarkę. Możesz ją zbadać by wziąć" +" ja do montażu." #: lang/json/construction_from_json.py msgid "Chop Tree Trunk Into Logs" @@ -82767,7 +82776,7 @@ msgstr "Masz dziwny sen o życiu w jaskini." #: lang/json/dream_from_json.py msgid "Your dreams give you a strange reclusive feeling." -msgstr "" +msgstr "Twoje sny sprawiają, że czujesz się lepiej w izolacji." #: lang/json/dream_from_json.py msgid "You have a strange dream about sea creatures." @@ -83503,67 +83512,72 @@ msgstr "" #: lang/json/dream_from_json.py msgid "You have a strange dream about the shadows." -msgstr "" +msgstr "Masz dziwny sen o cieniach." #: lang/json/dream_from_json.py msgid "Your dreams give you a peculiar feeling of sinking into the dark." -msgstr "" +msgstr "Twoje sny napawają cię uczuciem zatapiania się w ciemność." #: lang/json/dream_from_json.py msgid "You have a vivid dream of talking a midnight stroll." -msgstr "" +msgstr "Masz sugestywny sen o nocnej przechadzce." #: lang/json/dream_from_json.py msgid "You dream of drinking copious amounts of warm water." -msgstr "" +msgstr "Śnisz o piciu olbrzymich ilości ciepłej wody." #: lang/json/dream_from_json.py msgid "" "You have a dream of being chased by dogs as something warm drips from your " "mouth." -msgstr "" +msgstr "Śnisz o byciu ściganym przez psy podczas gdy coś ci kapie z ust." #: lang/json/dream_from_json.py msgid "Snippets of stalking something in the star-lit night shakes you awake." msgstr "" +"Budzisz się przez przebłyski skradania się za czymś w środku gwieździstej " +"nocy." #: lang/json/dream_from_json.py msgid "You dream of sinking your fangs into more and more enemies." -msgstr "" +msgstr "Śnisz o zatapianiu zębów w coraz to kolejnych przeciwników." #: lang/json/dream_from_json.py msgid "" "You have a lucid dream where streams of blood are slowly pooling around your" " feet." msgstr "" +"Masz wyrazisty sen o tym jak strumienie krwi powoli zbierają się w kałużę u " +"twych stóp." #: lang/json/dream_from_json.py msgid "You have a strange dream about the mountain forests." -msgstr "" +msgstr "Masz dziwny sen o górskich lasach." #: lang/json/dream_from_json.py msgid "Your dreams give you a peculiar feeling of sinking into the treelines." -msgstr "" +msgstr "Twoje sny napawają cię uczuciem zatapiania się w linię lasu." #: lang/json/dream_from_json.py msgid "You have a vivid dream of strolling through the woods." -msgstr "" +msgstr "Masz sugestywny sen o spacerowaniu w lasach." #: lang/json/dream_from_json.py msgid "You have a dream of chasing something as a raw hunger sears your mind." msgstr "" +"Masz sen o pogoni za czymś, podczas gdy pierwotny głód pali twój umysł." #: lang/json/dream_from_json.py msgid "Recollections of stalking a human shakes you awake." -msgstr "" +msgstr "Budzisz się przez przebłyski skradania się za człowiekiem." #: lang/json/dream_from_json.py msgid "You dream of tearing into more and more enemies." -msgstr "" +msgstr "Śnisz o rozrywaniu coraz to kolejnych przeciwników." #: lang/json/dream_from_json.py msgid "You have a lucid dream where nature carefully welcomes your body." -msgstr "" +msgstr "Masz wyrazisty sen o tym jak natura delikatnie wita twoje ciało." #: lang/json/effects_from_json.py msgid "Hit By Player" @@ -85973,12 +85987,12 @@ msgstr "" #: lang/json/effects_from_json.py msgid "Acidic burn" -msgstr "" +msgstr "Poparzenie kwasem" #. ~ Description of effect 'Acidic burn'. #: lang/json/effects_from_json.py msgid "Burned with acid" -msgstr "" +msgstr "Poparzony kwasem" #: lang/json/effects_from_json.py msgid "Stuck in a light snare" @@ -86720,7 +86734,7 @@ msgstr "" #: lang/json/faction_from_json.py msgid "Hub 01" -msgstr "" +msgstr "Hub 01" #. ~ Description for Hub 01 #: lang/json/faction_from_json.py @@ -86729,6 +86743,9 @@ msgid "" "leave their lab, if at all, and rely on their robots and advanced technology" " to survive." msgstr "" +"Ocalała załoga Hub 01, laboratorium badawczego sprzed kataklizmu. Rzadko " +"wychodzą z laboratorium, jeśli w ogóle, i bazują na swoich robotach i " +"zaawansowanej technologii by przeżyć." #: lang/json/faction_from_json.py src/game.cpp msgid "The Old Guard" @@ -86758,7 +86775,7 @@ msgstr "" #: lang/json/faction_from_json.py msgid "The Beggars in the Lobby" -msgstr "" +msgstr "Żebracy w Lobby" #. ~ Description for The Beggars in the Lobby #: lang/json/faction_from_json.py @@ -86766,6 +86783,8 @@ msgid "" "A collection of mentally and physically disadvantaged survivors who beg for " "food in the Evac Center lobby." msgstr "" +"Zbiór umysłowo i fizycznie upośledzonych ocalonych, którzy żebrzą o jedzenie" +" w lobby Centrum Ewakuacyjnego." #: lang/json/faction_from_json.py src/game.cpp msgid "The Tacoma Commune" @@ -86782,7 +86801,7 @@ msgstr "" #: lang/json/faction_from_json.py msgid "Marloss Evangelists" -msgstr "" +msgstr "Ewangeliści Marloss" #. ~ Description for Marloss Evangelists #: lang/json/faction_from_json.py @@ -86790,6 +86809,8 @@ msgid "" "Diverse bands, congregations and organizations with the common goal of " "preaching human survival through symbiosis with fungaloids." msgstr "" +"Różnorodne bandy, zbiory i organizacje o wspólnym celu głoszenia przetrwania" +" ludzkości przez symbiozę z grzyboidami." #: lang/json/faction_from_json.py src/game.cpp msgid "The Wasteland Scavengers" @@ -86820,16 +86841,16 @@ msgstr "" #: lang/json/faction_from_json.py msgid "Mutants Bees" -msgstr "" +msgstr "Zmutowane Pszczoły" #. ~ Description for Mutants Bees #: lang/json/faction_from_json.py msgid "Mutant bees who hate everyone." -msgstr "" +msgstr "Zmutowane pszczoły, które wszystkich nienawidzą." #: lang/json/faction_from_json.py msgid "God's Community" -msgstr "" +msgstr "Komuna Boża" #. ~ Description for God's Community #: lang/json/faction_from_json.py @@ -86837,6 +86858,8 @@ msgid "" "A small group of churchgoers that formed a community in the woods. They " "welcome anyone in their faction, but hate the unnatural." msgstr "" +"Mała grupa uczęszczających do kościoła, która utworzyła komunę w lesie. " +"Witają każdego w swoich szeregach, ale nienawidzą nienaturalnych." #: lang/json/faction_from_json.py msgid "Captives" @@ -87137,11 +87160,11 @@ msgstr "łóżko" #: lang/json/furniture_from_json.py msgid "" "This is a bed. A luxury in these times. Quite comfortable to sleep in." -msgstr "" +msgstr "To łóżko. Luksus w tych czasach. Bardzo wygodne do spania." #: lang/json/furniture_from_json.py msgid "bed frame" -msgstr "" +msgstr "rama łóżka" #. ~ Description for bed frame #: lang/json/furniture_from_json.py @@ -87149,10 +87172,12 @@ msgid "" "This is an empty bed frame. With a mattress on it, it would be a nice place" " to sleep. Sleeping on it right now wouldn't be great." msgstr "" +"Pusta rama łóżka. Zaopatrzona w materac byłaby dobrym miejscem do spania. " +"Spanie na nie obecnie to nie najlepszy pomysł." #: lang/json/furniture_from_json.py msgid "whack." -msgstr "" +msgstr "łup." #. ~ Description for mattress #: lang/json/furniture_from_json.py @@ -87160,6 +87185,8 @@ msgid "" "A comfortable mattress has been tossed on the floor for sleeping here. It's" " not quite as comfy as a real bed, but it's pretty close." msgstr "" +"Komfortowy materac rzucono na podłogę by tu spać. Nie tak komfortowy jak " +"łóżko, ale całkiem blisko mu do niego." #: 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 @@ -87176,6 +87203,7 @@ msgid "" "A porcelain throne. Emergency water source, from the tank, and provider of " "relief." msgstr "" +"Porcelanowy tron. W potrzebie źródło wody ze zbiornika, oraz miejsce ulgi." #: lang/json/furniture_from_json.py msgid "porcelain breaking!" @@ -87205,7 +87233,7 @@ msgstr "Trochę swędzi gdy się na nim kładziesz." #: lang/json/furniture_from_json.py msgid "pile of leaves" -msgstr "" +msgstr "stos liści" #. ~ Description for pile of leaves #: lang/json/furniture_from_json.py @@ -87213,6 +87241,7 @@ msgid "" "A sizeable pile of leaves. You could sleep on it if you don't care about " "comfort or warmth." msgstr "" +"Spory stos liści. Możesz na nim spać jeśli nie dbasz o komfort lub ciepło." #: lang/json/furniture_from_json.py msgid "sink" @@ -87223,6 +87252,7 @@ msgstr "zlew" msgid "" "Emergency relief provider. Water isn't running, so it's basically useless." msgstr "" +"W potrzebie miejsce ulgi. Nie ma bieżącej wody, praktycznie bezużyteczny." #: lang/json/furniture_from_json.py msgid "oven" @@ -87235,6 +87265,9 @@ msgid "" "working, although it still has parts. It might be safe to light a fire " "inside of it, if you had to." msgstr "" +"Używany do podgrzewania i gotowania żywności z użyciem prądu elektrycznego. " +"Nie działa najwyraźniej, ale nadal ma wszystkie części. W środku można " +"bezpiecznie rozpalić ogień, jeśli musisz." #: lang/json/furniture_from_json.py lang/json/furniture_from_json.py #: lang/json/terrain_from_json.py lang/json/terrain_from_json.py @@ -87255,6 +87288,8 @@ msgstr "piecyk koza" msgid "" "Wood stove for heating and cooking. Much more efficient than an open flame." msgstr "" +"Kuchenka na drewno do podgrzewania i gotowania. Bardziej efektywna od " +"otwartego ognia." #: lang/json/furniture_from_json.py msgid "fireplace" @@ -87267,6 +87302,8 @@ msgid "" "crumbles. Towards the End, you could also get this service on your " "television." msgstr "" +"Ah, relaksująca nasiadówka przy ogniu gdy świat w okół popada w ruinę. " +"Bliżej Końca taka usługa była też dostępna na telewizor." #: lang/json/furniture_from_json.py lang/json/terrain_from_json.py src/map.cpp msgid "crash!" @@ -87327,7 +87364,7 @@ msgstr "sofa" #. ~ Description for sofa #: lang/json/furniture_from_json.py msgid "Lie down OR sit down! Perfect!" -msgstr "" +msgstr "Połóż się LUB usiądź! Doskonale!" #: lang/json/furniture_from_json.py msgid "cupboard" @@ -87345,7 +87382,7 @@ msgstr "kosz na śmieci" #. ~ Description for trash can #: lang/json/furniture_from_json.py msgid "One man's trash is another man's dinner." -msgstr "" +msgstr "Śmieci dla jednego, obiad dla drugiego." #: lang/json/furniture_from_json.py msgid "recycle bin" @@ -87363,7 +87400,7 @@ msgstr "biurko" #. ~ Description for desk #: lang/json/furniture_from_json.py msgid "Sit down at it or work on it." -msgstr "" +msgstr "Usiądź na tym, lub pracuj na tym." #: lang/json/furniture_from_json.py msgid "exercise machine" @@ -87375,6 +87412,8 @@ msgid "" "Typically used for, well, exercising. You're getting quite enough of that; " "running for your life." msgstr "" +"Zwykle używane do, cóż, ćwiczeń. Masz tego pod dostatkiem ratując życie " +"uciekając." #: lang/json/furniture_from_json.py msgid "ball machine" @@ -87395,7 +87434,7 @@ msgstr "ławka" #. ~ Description for bench #: lang/json/furniture_from_json.py msgid "Hobo bed. Airy. Use at your own risk." -msgstr "" +msgstr "Łóżko żula. Przewiewne. Używasz na własną odpowiedzialność." #: lang/json/furniture_from_json.py msgid "lane guard" @@ -87435,14 +87474,14 @@ msgstr "Przeczytaj to. Ostrzeżenia przed tobą." #: lang/json/furniture_from_json.py msgid "warning sign" -msgstr "" +msgstr "znak ostrzegawczy" #. ~ Description for warning sign #: lang/json/furniture_from_json.py msgid "" "A triangle-shaped sign on a post meant to indicate something important or " "hazard." -msgstr "" +msgstr "Trójkątny znak na słupku, który ostrzega lub wskazuje coś ważnego." #: lang/json/furniture_from_json.py msgid "mailbox" @@ -87454,6 +87493,8 @@ msgid "" "A metal box attached to the top of a wooden post. Mail delivery hasn't come" " for awhile. Doesn't look like it's coming again anytime soon." msgstr "" +"Metalowa skrzynka zamontowana na drewnianym słupku. Listonosza już długo tu " +"nie było. I chyba nieprędko się pojawi." #: lang/json/furniture_from_json.py msgid "pool table" diff --git a/lang/po/ru.po b/lang/po/ru.po index a72f65c996bc4..03d1cc89b1ae2 100644 --- a/lang/po/ru.po +++ b/lang/po/ru.po @@ -37,7 +37,6 @@ # Timofey Kostenko , 2019 # Zhar the Mad , 2019 # Darkon Rabbit, 2019 -# Victor_U , 2019 # Barabylka Fish , 2019 # Валентин Литовченко , 2019 # Arex , 2019 @@ -47,11 +46,13 @@ # Brett Dong , 2019 # d1909449b5a6b5b275919a9512c8e7ef, 2019 # Vlasov Vitaly , 2019 -# AndyProhor , 2019 # Nikita Yushchenko , 2019 # Alexey Mostovoy , 2019 # Антон Бурмистров <22.valiant@gmail.com>, 2019 +# AndyProhor , 2019 +# Victor_U , 2019 # Midas , 2019 +# Михаил Семенчин , 2019 # msgid "" msgstr "" @@ -59,7 +60,7 @@ msgstr "" "Report-Msgid-Bugs-To: \n" "POT-Creation-Date: 2019-06-07 17:32+0800\n" "PO-Revision-Date: 2018-04-26 14:47+0000\n" -"Last-Translator: Midas , 2019\n" +"Last-Translator: Михаил Семенчин , 2019\n" "Language-Team: Russian (https://www.transifex.com/cataclysm-dda-translators/teams/2217/ru/)\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" @@ -84271,11 +84272,11 @@ msgstr "Строить Земляную Стену" #: lang/json/construction_from_json.py msgid "Build Counter Gate" -msgstr "" +msgstr "Построить Рабочие Ворота" #: lang/json/construction_from_json.py msgid "Build Split Rail Fence Gate" -msgstr "" +msgstr "Построить Откатные Рельсовые Ворота" #: lang/json/construction_from_json.py msgid "Build Privacy Fence Gate" @@ -84287,7 +84288,7 @@ msgstr "" #: lang/json/construction_from_json.py msgid "Build Privacy Fence" -msgstr "" +msgstr "Строить Ограждающий Забор" #: lang/json/construction_from_json.py msgid "Build Brick Wall from Adobe" @@ -84340,7 +84341,7 @@ msgstr "Самодельная стена" #: lang/json/construction_from_json.py msgid "Build Hydroponics" -msgstr "" +msgstr "Построить Гидропонику" #: lang/json/construction_from_json.py msgid "Harvest Blob Feed from Corpse Pit: Smash to Harvest" @@ -94544,10 +94545,10 @@ msgstr "" #: lang/json/gun_from_json.py msgid "Magnum Research BFR" msgid_plural "Magnum Research BFRs" -msgstr[0] "" -msgstr[1] "" -msgstr[2] "" -msgstr[3] "" +msgstr[0] "Магнум Исследователь BFR" +msgstr[1] "Магнумов Исследователь BFR" +msgstr[2] "Магнумов Исследователь BFR" +msgstr[3] "Магнумы Исследователь BFR" #: lang/json/gun_from_json.py msgid "" @@ -94555,14 +94556,18 @@ msgid "" "significant velocity in its short pistol barrel, it still competes with " "other large magnum handguns in terms of power." msgstr "" +"Массивный револьвер одностороннего действия. Не смотря на то, что " +"винтовочный патрон калибра .45-70 теряет значительную скорость в коротком " +"стволе пистолета, он по-прежнему конкурирует с другими крупнокалиберными " +"пистолетами по мощности." #: lang/json/gun_from_json.py msgid "1874 Sharps" msgid_plural "1874 Sharps" -msgstr[0] "" -msgstr[1] "" -msgstr[2] "" -msgstr[3] "" +msgstr[0] "Винтовка Шарпс (образца 1874 года)" +msgstr[1] "Винтовок Шарпс (образца 1874 года)" +msgstr[2] "Винтовок Шарпс (образца 1874 года)" +msgstr[3] "Винтовки Шарпс (образца 1874 года)" #: lang/json/gun_from_json.py msgid "" @@ -94571,6 +94576,10 @@ msgid "" "powerful for the time, this one is made to handle modern smokeless " "ammunition." msgstr "" +"Репродукция старинной однозарядной винтовки калибра .45-70, когда-то " +"использовавшейся для охоты на бизонов и другую крупную дичь в конце 19-го " +"века. Очень точный и мощный для того времени, переоборудован для стрельбы " +"современными бездымными боеприпасами." #: lang/json/gun_from_json.py msgid "H&K MP7A2" @@ -100773,16 +100782,19 @@ msgstr "" #: lang/json/gunmod_from_json.py msgid "Underslung flare launcher" msgid_plural "Underslung flare launchers" -msgstr[0] "" -msgstr[1] "" -msgstr[2] "" -msgstr[3] "" +msgstr[0] "Пусковая ракетная установка" +msgstr[1] "Пусковые ракетные установки" +msgstr[2] "Пусковые ракетные установки" +msgstr[3] "Пусковые ракетные установки" #: 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 "" +"Маленькая бочка, которая запускает сигнальные ракеты. Тем не менее, из-за " +"его неудобного положения, он имеет более низкую точность по сравнению с " +"актуальным огнеметом." #: lang/json/gunmod_from_json.py msgid "butt hook stock" @@ -100798,6 +100810,9 @@ msgid "" "and the pivoting hook which latches onto your forearm allows for greater " "stability. " msgstr "" +", Военная разгрузка для оружия, которая складывается, уменьшая объем оружия." +" Размер которого и поворотный крюк, защелкивающийся на предплечье, " +"обеспечивает большую устойчивость." #: lang/json/gunmod_from_json.py msgid "diffracting lens" @@ -102966,11 +102981,11 @@ msgstr "Начать отсчёт" #: lang/json/item_action_from_json.py msgid "Learn spell" -msgstr "" +msgstr "Выучить заклинание" #: lang/json/item_action_from_json.py msgid "Cast spell" -msgstr "" +msgstr "Скастовать заклинание" #: lang/json/item_action_from_json.py msgid "Use holster" @@ -105126,7 +105141,7 @@ msgstr "Посмотреть температурную карту" #: lang/json/keybinding_from_json.py msgid "View Visibility Map" -msgstr "" +msgstr "Посмотреть Карту Видимости" #: lang/json/keybinding_from_json.py msgid "Switch Sidebar Style" @@ -105170,7 +105185,7 @@ msgstr "Вкл/выкл авто-сбор" #: lang/json/keybinding_from_json.py msgid "Toggle Auto Pickup" -msgstr "" +msgstr "Переключение Автоматического Подбора" #: lang/json/keybinding_from_json.py msgid "Action Menu" @@ -105270,7 +105285,7 @@ msgstr "Меню режима передвижения" #: lang/json/keybinding_from_json.py msgid "Spellcasting" -msgstr "" +msgstr "Применение заклинания" #: lang/json/keybinding_from_json.py src/game_inventory.cpp msgid "Compare" @@ -132652,7 +132667,7 @@ msgstr "Кузница" #: lang/json/recipe_group_from_json.py msgid " Craft: Tinder" -msgstr "" +msgstr "Создать: Трут" #: lang/json/recipe_group_from_json.py msgid " Cook: Meat, Cooked" @@ -132820,7 +132835,7 @@ msgstr " Производство: кусок стали" #: lang/json/recipe_group_from_json.py msgid " Craft: Crucible" -msgstr "" +msgstr "Создать: Тигель" #: lang/json/recipe_group_from_json.py msgid " Craft: Anvil" @@ -155895,9 +155910,9 @@ msgid "" " I'm pretty nervous about going outside." msgstr "" "Тут напряжно. Знаю, было б куда легче, если бы мои навыки пригодились, или " -"если бы у меня хотя бы было место помолиться. Я стесняюсь молиться в " -"общественном месте. Дженни говорила про какой-то проект, где бы я могла " -"помочь, но признаю, мне страшно выходить наружу." +"если бы у меня хотя бы было место помолиться. Я стесняюсь молиться на людях." +" Дженни говорила про какой-то проект, где бы я могла помочь, но признаю, мне" +" страшно выходить наружу." #: lang/json/talk_topic_from_json.py msgid "Well, hello." @@ -161029,7 +161044,7 @@ msgstr " пронзает плоть %s" #: lang/json/technique_from_json.py msgid "LUNGE" -msgstr "" +msgstr "LUNGE" #. ~ Description for LUNGE #: lang/json/technique_from_json.py @@ -161037,6 +161052,8 @@ msgid "" "Crit only, 115% Stab damage, Crit only, Strength (D) and Perception (D) " "provides bonus damage, min 2 melee" msgstr "" +"Только Крит, 115% урона от удара, Сила (D) и Восприятие (D) дают бонус к " +"урону, минимум 2 к рукопашному бою" #: lang/json/technique_from_json.py #, python-format @@ -161046,11 +161063,11 @@ msgstr "" #: lang/json/technique_from_json.py #, python-format msgid " violently jabs at %s" -msgstr "" +msgstr " яростно тычет в %s" #: lang/json/technique_from_json.py msgid "PROD" -msgstr "" +msgstr "PROD" #. ~ Description for PROD #: lang/json/technique_from_json.py @@ -161058,6 +161075,8 @@ msgid "" "66% movecost, 70% Stab damage, STR (E) and PER (C) provides bonus damage, " "DEX (C) reduces action cost, min 3 melee" msgstr "" +"66% стоимость движения, 70% урона от удара, СИЛ (E) и ВОС (C) дают бонусный " +"урон, ЛОВ (C) снижает стоимость действия, минимум 3 к рукопашному бою." #: lang/json/technique_from_json.py #, python-format @@ -161067,11 +161086,11 @@ msgstr "" #: lang/json/technique_from_json.py #, python-format msgid " prods at %s " -msgstr "" +msgstr " толкает %s " #: lang/json/technique_from_json.py msgid "PROBE" -msgstr "" +msgstr "PROBE" #. ~ Description for PROBE #: lang/json/technique_from_json.py @@ -161079,6 +161098,9 @@ msgid "" "80% movecost, 75% Stab damage, STR (C) and PER (C) provides bonus damage and" " also provides armor pierce (E), min 3 melee" msgstr "" +"80% стоимость движения, 75% урона от удара, СИЛ (C) и ВОС (C) наносят " +"дополнительный урон, а также пробивают броню (E), минимум 3 к рукопашному " +"бою" #: lang/json/technique_from_json.py #, python-format @@ -164903,22 +164925,22 @@ msgstr "" #: lang/json/terrain_from_json.py msgid "high gauge pipe" -msgstr "" +msgstr "увесистая труба" #. ~ Description for high gauge pipe #: lang/json/terrain_from_json.py msgid "This is a section of high gauge pipe." -msgstr "" +msgstr "Это участок трубы большого сечения." #: lang/json/terrain_from_json.py msgid "high gauge pump" -msgstr "" +msgstr "насос высокого давления" #. ~ Description for high gauge pump #: lang/json/terrain_from_json.py msgid "" "This unpowered pump previously would have moved fluids around in a hurry." -msgstr "" +msgstr "Этот насос без питания раньше перемещал бы жидкости в спешке." #: lang/json/terrain_from_json.py msgid "centrifuge" @@ -165484,12 +165506,12 @@ msgstr "" #: lang/json/terrain_from_json.py msgid "water dispenser" -msgstr "" +msgstr "рукомойник" #. ~ Description for water dispenser #: lang/json/terrain_from_json.py msgid "A machine with several taps that dispenses clean water." -msgstr "" +msgstr "Машина с несколькими кранами, которая подает чистую воду." #: lang/json/terrain_from_json.py msgid "improvised shelter" @@ -165556,7 +165578,7 @@ msgstr "плиточная плоская крыша" #. ~ Description for tile flat roof #: lang/json/terrain_from_json.py msgid "A section of tiled, flat rooftop." -msgstr "" +msgstr "Часть черепичной, плоской крыши." #: lang/json/terrain_from_json.py msgid "skylight" @@ -165595,6 +165617,8 @@ msgid "" "A cabinet full of telecoms equipment. With the lines down, you might be " "able to take it apart for its useful electronics." msgstr "" +"Шкаф, полный телекоммуникационного оборудования. С линиями вниз, вы можете " +"разобрать его на полезную электронику." #: lang/json/terrain_from_json.py msgid "damaged telecom cabinet" @@ -165606,6 +165630,8 @@ msgid "" "A damaged telecoms cabinet. Might still be able to salvage some useful " "electronics scrap from it." msgstr "" +"Поврежденный телекоммуникационный кабинет. Возможно, еще удастся извлечь из " +"него полезный лом электроники." #: lang/json/terrain_from_json.py msgid "large metal support" @@ -165775,7 +165801,7 @@ msgstr "тротуар моста" #. ~ Description for bridge sidewalk #: lang/json/terrain_from_json.py msgid "The sidewalk section of a concrete bridge." -msgstr "" +msgstr "Тротуарный участок бетонного моста." #: lang/json/terrain_from_json.py msgid "guard rail" @@ -165787,6 +165813,8 @@ msgid "" "A section of metal railing, put in place to prevent people from falling or " "taking the easy way out." msgstr "" +"Секция металлических перил, установленная, чтобы люди не падали и не " +"выходили из нее." #: lang/json/terrain_from_json.py msgid "blackjack oak" @@ -165972,7 +166000,7 @@ msgstr "Участок вощёного и покрашенного пола." #. ~ Description for backboard #: lang/json/terrain_from_json.py msgid "A metal backboard." -msgstr "" +msgstr "Металлический щит." #: lang/json/terrain_from_json.py msgid "buffer stop" @@ -166128,7 +166156,7 @@ msgstr "громкий гул!" #: lang/json/terrain_from_json.py msgid "split rail fence" -msgstr "" +msgstr "ворота в ограждении" #. ~ Description for split rail fence #: lang/json/terrain_from_json.py @@ -166136,18 +166164,20 @@ msgid "" "A rather stout fence made of 2x4s and fence posts, suitable for containing " "livestock like horses, cows and pigs." msgstr "" +"Довольно прочный забор, сделанный из 2х4 досок и столбов для забора, " +"подходит для содержания скота, такого как лошади, коровы и свиньи." #: lang/json/terrain_from_json.py msgid "closed wooden split rail gate" -msgstr "" +msgstr "закрытые деревянные ворота в ограждении" #: lang/json/terrain_from_json.py msgid "open wooden split rail gate" -msgstr "" +msgstr "открытые деревянные ворота в ограждении" #: lang/json/terrain_from_json.py msgid "wooden privacy fence" -msgstr "" +msgstr "деревянная ограда" #. ~ Description for wooden privacy fence #: lang/json/terrain_from_json.py @@ -166155,6 +166185,8 @@ msgid "" "A rather stout fence made of 2x4s and fence posts, it is tall and prevents " "people from seeing into your yard." msgstr "" +"Довольно прочный забор, сделанный из 2х4 и столбов, он высокий и не " +"позволяет людям заглядывать в ваш двор." #: lang/json/terrain_from_json.py msgid "shallow pool water" @@ -166227,7 +166259,7 @@ msgstr "ядро ядерного реактора" #: lang/json/terrain_from_json.py msgid "stick wall" -msgstr "" +msgstr "изгородь из палок" #. ~ Description for stick wall #: lang/json/terrain_from_json.py @@ -166236,6 +166268,9 @@ msgid "" "is capable of supporting an upper level or roof. Dirt and stones make the " "wall secure. Somewhat flammable." msgstr "" +"Дешевая стена из досок и палок с бревенчатой ​​колонной, чтобы держать все " +"вместе и способная поддерживать верхний уровень или крышу. Грязь и камни " +"делают стену безопасной. Несколько огнеопасно." #: lang/json/terrain_from_json.py msgid "krick!" @@ -167149,7 +167184,7 @@ msgstr "электро-внедорожник со стойкой для бай #: lang/json/vehicle_from_json.py msgid "Engine Crane" -msgstr "" +msgstr "Кран-подъемник для двигателя" #: lang/json/vehicle_from_json.py msgid "Food Vendor Cart" @@ -167465,7 +167500,7 @@ msgstr "атомное авто" #: lang/json/vehicle_from_json.py msgid "Flaming Atomic Car" -msgstr "" +msgstr "Пылающий атомный автомобиль" #: lang/json/vehicle_from_json.py msgid "Robotic Taxi" @@ -167906,7 +167941,7 @@ msgstr "автомобильный обогреватель" #: lang/json/vehicle_part_from_json.py msgid "vehicle-mounted cooler" -msgstr "" +msgstr "Монтируемый на автомобиль кондиционер" #. ~ Description for electronics control unit #: lang/json/vehicle_part_from_json.py @@ -171297,12 +171332,12 @@ msgstr "Транспорт на парковке" #. ~ Vehicle Spawn Description #: lang/json/vehicle_spawn_from_json.py msgid "Clear section of subway" -msgstr "" +msgstr "Очищенный участок метро" #. ~ Vehicle Spawn Description #: lang/json/vehicle_spawn_from_json.py msgid "Vehicle on the subway" -msgstr "" +msgstr "Транспорт на линии метро" #: lang/json/vitamin_from_json.py msgid "Calcium" @@ -171876,7 +171911,7 @@ msgstr "Здесь нечего поджечь." #: src/activity_handlers.cpp msgid "This item requires tinder to light." -msgstr "" +msgstr "Этот предмет требует трут для свечения." #: src/activity_handlers.cpp msgid "You have lost the item you were using to start the fire." @@ -172363,10 +172398,12 @@ msgid "" "Choose part\n" "to draw blood from." msgstr "" +"Выберите часть\n" +"из которой черпать кровь." #: src/activity_handlers.cpp msgid "Stop casting spell? Time spent will be lost." -msgstr "" +msgstr "Остановить чтение заклинания? Потраченное время будет потеряно." #: src/activity_handlers.cpp #, c-format @@ -172376,7 +172413,7 @@ msgstr "Вы получили %i опыта. %i всего." #: src/activity_handlers.cpp #, c-format msgid "You cast %s!" -msgstr "" +msgstr "Вы применяете %s!" #: src/activity_handlers.cpp msgid "" @@ -175100,7 +175137,7 @@ msgstr "%s разбивается!" #: src/ballistics.cpp #, c-format msgid "The %s bursts!" -msgstr "" +msgstr "The %s лопается!" #: src/ballistics.cpp #, c-format @@ -175472,7 +175509,7 @@ msgstr "Вы убираете %s." #: src/bionics.cpp #, c-format msgid "%s withdraws %s %s." -msgstr "" +msgstr "%s изымает у %s %s." #: src/bionics.cpp #, c-format @@ -179343,7 +179380,7 @@ msgstr "У вас нет необходимых компонентов, нель #: src/crafting.cpp msgid "Consume the missing components and continue crafting?" -msgstr "" +msgstr "Подобрать недостающие компоненты и продолжить изготовление?" #: src/crafting.cpp msgid "You stop crafting." @@ -180007,7 +180044,7 @@ msgstr "Тест группы предметов" #: src/debug_menu.cpp msgid "Show sound clustering" -msgstr "" +msgstr "Отобразить звуковые эффекты" #: src/debug_menu.cpp msgid "Display weather" @@ -180019,15 +180056,15 @@ msgstr "Показать запахи" #: src/debug_menu.cpp msgid "Toggle display local scents" -msgstr "" +msgstr "Переключить отображение окружающих запахов" #: src/debug_menu.cpp msgid "Toggle display temperature" -msgstr "" +msgstr "Переключить отображение температуры" #: src/debug_menu.cpp msgid "Toggle display visibility" -msgstr "" +msgstr "Переключить отображение видимости" #: src/debug_menu.cpp msgid "Show mutation category levels" @@ -180051,7 +180088,7 @@ msgstr "Вылет игры (тест обработки вылета)" #: src/debug_menu.cpp msgid "Toggle NPC pathfinding on map" -msgstr "" +msgstr "Переключить отображение пути НПС на карте" #: src/debug_menu.cpp msgid "Test weather" @@ -180843,7 +180880,7 @@ msgstr "Произошла ошибка при попытке сохранени #: src/debug_menu.cpp msgid "Report written to debug.log" -msgstr "" +msgstr "Сообщить о баге на debug.log" #: src/debug_menu.cpp msgid " and to the clipboard." @@ -186421,7 +186458,7 @@ msgstr "Уверены, что хотите зайти в %s?" #: src/game.cpp #, c-format msgid "Your %s refuses to move over that ledge!" -msgstr "" +msgstr "Вы %s отказываетесь двигаться по этому выступу! " #: src/game.cpp src/monexamine.cpp msgid "You let go of the grabbed object." @@ -186502,7 +186539,7 @@ msgstr "Вы травмируете правую ступню о %s!" #: src/game.cpp #, c-format msgid "Your %s gets cut!" -msgstr "" +msgstr "Ваш %s был порезан!" #. ~ 1$s - bodypart name in accusative, 2$s is terrain name. #: src/game.cpp @@ -187421,11 +187458,11 @@ msgstr "боевые искусства" #: src/game_inventory.cpp #, c-format msgid "%s to %d (%d)" -msgstr "" +msgstr "%s из %d (%d)" #: src/game_inventory.cpp msgid "TRAINS (CURRENT)" -msgstr "" +msgstr "НАВЫК (ТЕКУЩЕЕ)" #: src/game_inventory.cpp msgid "RECIPES" @@ -187552,12 +187589,15 @@ msgid "" "Enter new letter. Press SPACE to clear a manually assigned letter, ESCAPE to" " cancel." msgstr "" +"Введите новую букву. Нажмите SPACE для пустого значения, ESCAPE для отмены." #: src/game_inventory.cpp msgid "" "Note: The Auto Inventory Letters setting might still reassign a letter to this item.\n" "If this is undesired, you may wish to change the setting in Options." msgstr "" +"Примечание. Автоматическое назначение буквы может по-прежнему переназначать букву этому предмету.\n" +"Если это нежелательно, вы можете изменить настройки в меню «Параметры»." #: src/game_inventory.cpp msgid "" @@ -187601,11 +187641,11 @@ msgstr "КБМ уже установлено" #: src/game_inventory.cpp msgid "No base version installed" -msgstr "" +msgstr "Базовая версия не установлена" #: src/game_inventory.cpp msgid "Superior version installed" -msgstr "" +msgstr "Улучшенная версия установлена" #: src/game_inventory.cpp msgid "CBM not compatible with patient" @@ -187704,6 +187744,7 @@ msgstr "Здесь нет техники, чтобы её схватить." #, c-format msgid "You cannot move this vehicle whilst your %s is harnessed!" msgstr "" +"Вы не можете перемещать это транспортное средство, пока ваш %s используется!" #: src/grab.cpp #, c-format @@ -188137,37 +188178,37 @@ msgstr "Вы не знаете никаких заклинаний." #: src/handle_action.cpp msgid "RNG" -msgstr "" +msgstr "RNG" #: src/handle_action.cpp msgid "XP%" -msgstr "" +msgstr "XP%" #: src/handle_action.cpp msgid "Cast Time" -msgstr "" +msgstr "Время каста" #: src/handle_action.cpp msgid "Cost" -msgstr "" +msgstr "Стоимость" #: src/handle_action.cpp msgid "DMG" -msgstr "" +msgstr "УРН" #: src/handle_action.cpp msgid "FAIL%" -msgstr "" +msgstr "ПРОВАЛ%" #: src/handle_action.cpp #, c-format msgid "%i turns" -msgstr "" +msgstr "%i ходов" #: src/handle_action.cpp #, c-format msgid "%i moves" -msgstr "" +msgstr "%i движения" #: src/handle_action.cpp msgid "You can't cast any of the spells you know!" @@ -188192,7 +188233,7 @@ msgstr "Что вы хотите употребить?" #: src/handle_action.cpp msgid "Medication" -msgstr "" +msgstr "Медикаменты" #: src/handle_action.cpp msgid "Auto-move canceled" @@ -188983,6 +189024,7 @@ msgstr "Вы колетесь о колючки кактуса!" #, c-format msgid "You don't have a digging tool to dig up roots. Pick %s anyway?" msgstr "" +"У вас нет инструмента для копания корней. Подобрать %s в любом случае?" #: src/iexamine.cpp msgid "Nothing can be harvested from this plant in current season." @@ -189857,7 +189899,7 @@ msgstr "" #: src/iexamine.cpp msgid "Autodoc Mk. XI. Status: Online. Please choose operation." -msgstr "Автодок, модель XI. Статус: В работе. Пожалуйста, выберите операцию." +msgstr "Автодок Mk. XI. Статус: В работе. Пожалуйста, выберите операцию." #: src/iexamine.cpp msgid "Choose Compact Bionic Module to install." @@ -189890,7 +189932,7 @@ msgstr "" #: src/iexamine.cpp msgid "Autodoc Mk. XI. Status: Online. Please choose operation" -msgstr "" +msgstr "Автодок Mk. XI. Статус: В работе. Пожалуйста, выберите операцию." #: src/iexamine.cpp msgid "Choose Compact Bionic Module to install" @@ -190482,7 +190524,7 @@ msgstr "Монстры: фракции" #: src/init.cpp msgid "Factions" -msgstr "" +msgstr "Фракции" #: src/init.cpp msgid "Crafting recipes" @@ -190506,7 +190548,7 @@ msgstr "Миссии" #: src/init.cpp msgid "Behaviors" -msgstr "" +msgstr "Поведение" #: src/init.cpp msgid "Harvest lists" @@ -190598,7 +190640,7 @@ msgstr "Шаблоны NPC" #: src/init.cpp msgid "Spells" -msgstr "" +msgstr "Заклинания" #: src/input.cpp msgid "key bindings configuration" @@ -190611,11 +190653,11 @@ msgstr "неизвестная клавиша «%ld»" #: src/input.cpp msgid "Unbound globally!" -msgstr "" +msgstr "Не привязан глобально!" #: src/input.cpp msgid "Unbound locally!" -msgstr "" +msgstr "Не привязан локально!" #: src/input.cpp msgctxt "keybinding" @@ -190677,7 +190719,7 @@ msgstr "Очистить клавиши для «%s»?" #: src/input.cpp #, c-format msgid "Reset to global bindings for %s?" -msgstr "" +msgstr "Восстановить глобальные связи для %s?" #: src/input.cpp msgid "" @@ -190990,7 +191032,7 @@ msgstr "Материал: %s" #: src/item.cpp #, c-format msgid "Owner: %s" -msgstr "" +msgstr "Владелец: %s" #: src/item.cpp #, c-format @@ -191709,7 +191751,7 @@ msgstr[3] "Максимум заряд." #: src/item.cpp #, c-format msgid "Using: %s" -msgstr "" +msgstr "Используется: %s" #: src/item.cpp #, c-format @@ -196376,7 +196418,7 @@ msgstr "Дверь не заперта." #: src/iuse_actor.cpp msgid "That cannot be picked." -msgstr "Это нельзя подобрать." +msgstr "Это нельзя взломать." #: src/iuse_actor.cpp msgid "The lock stumps your efforts to pick it, and you destroy your tool." @@ -196723,15 +196765,15 @@ msgstr "%s производит раздражающий звук." #: src/iuse_actor.cpp msgid "This can teach you a spell." -msgstr "" +msgstr "Может научить заклинанию." #: src/iuse_actor.cpp msgid "This can teach you a number of spells." -msgstr "" +msgstr "Может научить нескольким заклинаниям." #: src/iuse_actor.cpp msgid "Spells Contained:" -msgstr "" +msgstr "Содержащиеся заклинания:" #: src/iuse_actor.cpp #, c-format @@ -196744,23 +196786,23 @@ msgstr "(Макс)" #: src/iuse_actor.cpp msgid "Study to Learn" -msgstr "" +msgstr "Изучать до запоминания" #: src/iuse_actor.cpp msgid "Can't learn!" -msgstr "" +msgstr "Нельзя изучать!" #: src/iuse_actor.cpp msgid "You already know everything this could teach you." -msgstr "" +msgstr "Вы уже знаете всё, чему это может вас научить." #: src/iuse_actor.cpp msgid "Study a spell:" -msgstr "" +msgstr "Изучить заклинание:" #: src/iuse_actor.cpp msgid "Spend how long studying?" -msgstr "" +msgstr "Сколько времени потратить на изучение?" #: src/iuse_actor.cpp msgid "30 minutes" @@ -196789,11 +196831,11 @@ msgstr "До получения уровня заклинания" #: src/iuse_actor.cpp #, c-format msgid "This item casts %s at level %i." -msgstr "" +msgstr "Этот предмет кастует %s на уровне %i." #: src/iuse_actor.cpp msgid "This item never fails." -msgstr "" +msgstr "Этот предмет никогда не сбоит." #: src/iuse_actor.cpp #, c-format @@ -196982,11 +197024,11 @@ msgstr "Ушивание" #: src/iuse_actor.cpp msgid "Downsizing" -msgstr "" +msgstr "Уменьшить размер" #: src/iuse_actor.cpp msgid "Upsizing" -msgstr "" +msgstr "Увеличить размер" #: src/iuse_actor.cpp msgid "Practicing" @@ -198533,7 +198575,7 @@ msgstr "Загрузка" #: src/magic.cpp msgid "ERROR: Invalid energy string. Defaulting to NONE" -msgstr "" +msgstr "ОШИБКА: неверная энергетическая строка. По умолчанию NONE" #: src/magic.cpp msgid "ERROR: Invalid damage type string. Defaulting to none" @@ -198569,7 +198611,7 @@ msgstr "" #: src/magic.cpp msgid "infinite" -msgstr "" +msgstr "бесконечный" #: src/magic.cpp #, c-format @@ -199338,15 +199380,15 @@ msgstr "Попадание" #: src/martialarts.cpp msgid "Miss" -msgstr "" +msgstr "Промах" #: src/martialarts.cpp msgid "Crit" -msgstr "" +msgstr "Крит" #: src/martialarts.cpp msgid "Kill" -msgstr "" +msgstr "Убийство" #: src/martialarts.cpp msgid "Get hit" @@ -204237,7 +204279,7 @@ msgstr "активировано" #: src/newcharacter.cpp msgid "Pets:" -msgstr "" +msgstr "Питомцы:" #: src/newcharacter.cpp #, c-format @@ -204792,7 +204834,7 @@ msgstr "" #: src/npc.cpp msgid "Trying to recover stolen goods" -msgstr "" +msgstr "Попытка вернуть украденный товар" #: src/npc.cpp msgid "NPC Legacy Attitude" @@ -205243,7 +205285,7 @@ msgstr "" #: src/npctalk.cpp msgid "As you were." -msgstr "" +msgstr "Отставить." #: src/npctalk.cpp #, c-format @@ -206634,13 +206676,15 @@ msgstr "" #: src/options.cpp msgid "Message cooldown" -msgstr "" +msgstr "Задержка сообщения" #: src/options.cpp msgid "" "Number of turns during which similar messages are hidden. '0' disables this" " option." msgstr "" +"Количество ходов, в течение которых подобные сообщения скрыты. '0' отключает" +" эту опцию." #: src/options.cpp msgid "Suppress \"unknown command\" messages" @@ -206747,6 +206791,9 @@ msgid "" "Disabled: do not auto-assign letters. Favorites: only auto-assign letters to" " favorited items." msgstr "" +"Включено: автоматически присваивает буквы всем переносимым предметам, в " +"которых они отсутствуют . Отключено: не назначать буквы автоматически. " +"Избранное: автоматически назначать буквы только избранным элементам. " #: src/options.cpp msgid "Disabled" @@ -206754,11 +206801,11 @@ msgstr "Отключено" #: src/options.cpp msgid "Enabled" -msgstr "" +msgstr "Включено" #: src/options.cpp msgid "Favorites" -msgstr "" +msgstr "Favorites" #: src/options.cpp msgid "Show item health bars" @@ -206821,15 +206868,15 @@ msgstr "Прокрутка по краю" #: src/options.cpp msgid "Edge scrolling with the mouse." -msgstr "" +msgstr "Перемещение края карты с помощью мыши." #: src/options.cpp msgid "Slow" -msgstr "" +msgstr "Медленно." #: src/options.cpp msgid "Fast" -msgstr "" +msgstr "Быстро." #: src/options.cpp msgid "Animations" @@ -208424,7 +208471,7 @@ msgstr "Направление:" #: src/overmap_ui.cpp msgid "'<-' '->' Cycle targets." -msgstr "" +msgstr "'<-' '->' Смена цели." #: src/overmap_ui.cpp msgid "Enter/Spacebar to select." @@ -208876,7 +208923,7 @@ msgstr "Ступни:" #: src/panels.cpp #, c-format msgid "Goal: %s" -msgstr "" +msgstr "Цель: %s" #: src/panels.cpp msgid "Weather :" @@ -209105,7 +209152,7 @@ msgstr "Фильтр ничего не выдал" #: src/pickup.cpp #, c-format msgid "%s %s of %s" -msgstr "" +msgstr "%s %s на сумму %s" #: src/pickup.cpp #, c-format @@ -212534,22 +212581,22 @@ msgstr "У вас не хватает %s для этого заклинания" #: src/ranged.cpp #, c-format msgid "Casting: %s (Level %u)" -msgstr "" +msgstr "Каст: %s (Уровень %u)" #: src/ranged.cpp #, c-format msgid "Cost: %s %s" -msgstr "" +msgstr "Стоимость: %s %s" #: src/ranged.cpp #, c-format msgid "Cost: %s %s (Current: %s)" -msgstr "" +msgstr "Стоимость: %s %s (Сейчас: %s)" #: src/ranged.cpp #, c-format msgid "0.0 % Failure Chance" -msgstr "" +msgstr "0.0 % Шанс провала" #: src/ranged.cpp #, c-format @@ -212928,7 +212975,7 @@ msgstr "Выберите язык" #: src/translations.cpp msgctxt "grammatical gender list" msgid "n" -msgstr "" +msgstr "n" #: src/trapfunc.cpp msgid "You step on some bubble wrap!" @@ -215151,7 +215198,7 @@ msgstr "автомобильный обогреватель" #: src/vehicle_use.cpp msgid "cooler" -msgstr "" +msgstr "куллер" #: src/vehicle_use.cpp msgid "recharger" @@ -215362,7 +215409,7 @@ msgstr "Вы тщательно сложили %s в компактное сос #: src/vehicle_use.cpp #, c-format msgid "You let go of %s as you fold it." -msgstr "" +msgstr "Вы отпускаете %s в сложенном виде." #: src/vehicle_use.cpp #, c-format diff --git a/lang/po/zh_CN.po b/lang/po/zh_CN.po index 94c5590d282da..3738068d4be12 100644 --- a/lang/po/zh_CN.po +++ b/lang/po/zh_CN.po @@ -26,18 +26,18 @@ # 羽 偌 , 2019 # startobira , 2019 # Brett Dong , 2019 -# L rient <1972308206@qq.com>, 2019 # 何方神圣 何 <1366003560@qq.com>, 2019 # Dao Da , 2019 # cainiao , 2019 # CK LU <1965630970@qq.com>, 2019 -# Amans Tofu , 2019 # Jamie Cyril-Marlowe , 2019 # 智也 三上 <464337873@qq.com>, 2019 # space J <871171244@qq.com>, 2019 -# 曾泰瑋 , 2019 -# lu ck , 2019 # fei li , 2019 +# lu ck , 2019 +# L rient <1972308206@qq.com>, 2019 +# 曾泰瑋 , 2019 +# Amans Tofu , 2019 # 万 和 <380014507@qq.com>, 2019 # msgid "" @@ -1448,7 +1448,7 @@ msgstr "松香" #. ~ Description for rosin #: lang/json/AMMO_from_json.py msgid "This is a chunk of yellowish rosin, usable as a flux for soldering." -msgstr "这是一块黄色松香,可用作焊剂的助焊剂。" +msgstr "这是一块淡黄色的松香,可作为助焊剂用于焊接。" #: lang/json/AMMO_from_json.py msgid "crude wooden bolt" @@ -2097,7 +2097,7 @@ msgid "" "Its light weight, high accuracy, and manageable recoil lead to widespread " "use in the 20th century and it remains popular among militaries and " "civilians." -msgstr "62格令的5.56x45mm 全金属被甲钢芯弹。重量轻,高精准和可接受的后座力令该弹种在20世纪被广泛使用,至今仍在军用和民用领域流行。" +msgstr "62格令的5.56x45mm 全金属被甲钢芯弹。重量轻,高命中率和可接受的后座力令该弹种在20世纪被广泛使用,至今仍在军用和民用领域流行。" #: lang/json/AMMO_from_json.py msgid "5.56 NATO tracer" @@ -4353,14 +4353,14 @@ msgstr "重型通用燃烧弹,重机枪和军用设施使用,弹头受撞击 #: lang/json/AMMO_from_json.py lang/json/ammunition_type_from_json.py msgid "crystallized mana" msgid_plural "crystallized mana" -msgstr[0] "晶化玛哪" +msgstr[0] "魔力水晶" #. ~ Description for crystallized mana #: lang/json/AMMO_from_json.py msgid "" "Some crystallized mana. This can be reloaded into rechargable mana crystals," " but can never be unloaded." -msgstr "一些晶化的玛哪。可以被导入可充能的玛哪水晶,但无法再抽取出来。" +msgstr "一些结晶化的魔力。可以注入魔力进行充能,但无法再抽取出来。" #: lang/json/AMMO_from_json.py msgid "bronze" @@ -8763,7 +8763,7 @@ msgstr[0] "青色的围巾" msgid "" "A simple cloth scarf worn by Marloss Voices. Wherever the Voices go, long " "sought peace soon follows, for better or for worse." -msgstr "一条Marloss Voices戴过的简易布围巾。据说只要是Voices所到之处,人们期盼已久的和平总会到来。" +msgstr "一条马洛斯之声戴过的简易布围巾。据说只要是马洛斯之声所到之处,人们期盼已久的和平总会到来。" #: lang/json/ARMOR_from_json.py msgid "keikogi" @@ -14969,7 +14969,7 @@ msgstr "你的背上安装了一排可伸缩的太阳能面板。当你站在阳 #: lang/json/BIONIC_ITEM_from_json.py msgid "Precision Solderers CBM" msgid_plural "Precision Solderers CBMs" -msgstr[0] "CBM精密焊接仪" +msgstr[0] "精密焊接仪CBM" #. ~ Description for Precision Solderers CBM #: lang/json/BIONIC_ITEM_from_json.py @@ -22151,7 +22151,7 @@ msgstr[0] "焦糖" #. ~ Description for caramel #: lang/json/COMESTIBLE_from_json.py msgid "Some caramel. Still bad for your health." -msgstr "一些焦糖。仍然对的健康不利。" +msgstr "一些焦糖。对你的健康没好处。" #. ~ Description for potato chips #: lang/json/COMESTIBLE_from_json.py @@ -29576,35 +29576,35 @@ msgstr "外科医生的警告:吸烟导致肺癌,心脏病,肺气肿和妊 #: lang/json/CONTAINER_from_json.py msgid "small cardboard box" msgid_plural "small cardboard boxes" -msgstr[0] "小纸板箱" +msgstr[0] "小纸盒" #. ~ Description for small cardboard box #: lang/json/CONTAINER_from_json.py msgid "A small cardboard box. No bigger than a foot in dimension." -msgstr "一个小纸箱。尺寸不大于一英寸。" +msgstr "小纸板盒。尺寸不大于一英寸。" #: lang/json/CONTAINER_from_json.py msgid "cardboard box" msgid_plural "cardboard boxes" -msgstr[0] "小纸盒" +msgstr[0] "纸板盒" #. ~ Description for cardboard box #: lang/json/CONTAINER_from_json.py msgid "" "A sturdy cardboard box, about the size of a banana box. Great for packing." -msgstr "一个结实的纸板盒,有香蕉盒子那么大。很适合打包。" +msgstr "结实的纸板盒,有香蕉盒子那么大。很适合打包。" #: lang/json/CONTAINER_from_json.py lang/json/furniture_from_json.py msgid "large cardboard box" msgid_plural "large cardboard boxes" -msgstr[0] "大型纸板箱" +msgstr[0] "纸板箱" #. ~ Description for large cardboard box #: lang/json/CONTAINER_from_json.py msgid "" "A very large cardboard box, the sort children would have loved to hide in, " "when there were still children." -msgstr "一个很大的纸板盒,孩子们会喜欢藏在里面,当还有孩子的时候。" +msgstr "很大的纸板箱,孩子们会喜欢藏在里面,当还有孩子的时候。" #: lang/json/CONTAINER_from_json.py msgid "bucket" @@ -30083,7 +30083,7 @@ msgid "" "A gentleman's balloon. A single use life preventer. A thumbless latex " "mitten. This could be used as a makeshift water container, but otherwise " "it's anyone's guess what it's for." -msgstr "可以称为绅士的气球,一次性生命预防器,或者是乳胶无指手套。可以当临时容器使用,不装水也可以装其他液体,但大家都会猜测里面装的是体液。" +msgstr "绅士的气球,一次性生命预防器,乳胶无指手套。可以当临时容器使用,不装水也可以装其他液体,但大家都会猜测里面装的是体液。" #: lang/json/CONTAINER_from_json.py msgid "blood draw kit" @@ -30141,7 +30141,7 @@ msgstr "一只用来装液体或气体的小型金属罐,可用于制造其他 #: lang/json/CONTAINER_from_json.py lang/json/overmap_terrain_from_json.py msgid "basin" msgid_plural "basins" -msgstr[0] "盆地" +msgstr[0] "调菜盆" #. ~ Description for basin #: lang/json/CONTAINER_from_json.py @@ -31404,7 +31404,7 @@ msgstr[0] "破碎的护士机器人" msgid "" "A broken nurse bot. Its smooth face staring vacantly into empty space. " "Could be gutted for parts." -msgstr "一个坏掉的护士机器人。它光滑的脸茫然地凝视着空旷的空间。可能会因为零件而被掏空。" +msgstr "一个坏掉的护士机器人。它光滑的脸茫然地凝视着空旷的空间。可以掏空它以获得零件。" #: lang/json/GENERIC_from_json.py msgid "broken riot control bot" @@ -34884,7 +34884,7 @@ msgstr "" #: lang/json/GENERIC_from_json.py lang/json/TOOL_from_json.py msgid "atomic reading light" msgid_plural "atomic reading lights" -msgstr[0] "原子阅读灯(关)" +msgstr[0] "原子阅读灯" #. ~ Use action msg for atomic reading light. #: lang/json/GENERIC_from_json.py @@ -42497,7 +42497,7 @@ msgid "" "A makeshift 25-round single-column steel magazine which fits Taurus Pro .38 " "pistol, but may fit some makeshift magazine-fed firearms as well. Don't " "expect much reliability." -msgstr "一个自制的25轮单柱钢弹匣,适合Taurus Pro .38手枪,但也适合一些自制弹匣式枪械。不要期望太多的可靠性。" +msgstr "一个自制的25轮单柱钢弹匣,适合陶鲁斯 Pro .38手枪,但也适合一些自制弹匣式枪械。不要期望太多的可靠性。" #: lang/json/MAGAZINE_from_json.py msgid "Taurus .38 magazine" @@ -51118,7 +51118,7 @@ msgstr "硬木投掷" msgid "" "This spell creates a projectile of hardwood that shoots forth from the " "caster's hand at high speed to stab into an enemy." -msgstr "这个咒语会能创造一个硬木投射物,从施法者的手高速射出,刺伤敌人。" +msgstr "这个咒语会能创造一个硬木投射物,从施法者的手中高速射出,刺伤敌人。" #: lang/json/SPELL_from_json.py msgid "Nature's Bow" @@ -51151,7 +51151,7 @@ msgstr "战争践踏" msgid "" "Focusing mana into your leg, you stomp your foot and send out a shockwave, " "knocking enemies around you onto the ground." -msgstr "聚集玛哪进入你的腿,重重跺脚,发出冲击波,把周围的敌人击倒在地。" +msgstr "聚集魔力进入你的腿,重重跺脚,发出冲击波,把周围的敌人击倒在地。" #: lang/json/SPELL_from_json.py msgid "Point Flare" @@ -59530,7 +59530,7 @@ msgstr "一堆简陋的泥砖,在你冒着生命危险出去的时候,已经 #: lang/json/TOOL_from_json.py msgid "stone hand axe" msgid_plural "stone hand axes" -msgstr[0] "石斧" +msgstr[0] "石手斧" #. ~ Description for stone hand axe #: lang/json/TOOL_from_json.py @@ -60518,7 +60518,7 @@ msgstr "这颗手雷上挂着一个标签,上面有一个签名:Kevin。看 #: lang/json/TOOL_from_json.py msgid "precision solderers" msgid_plural "precision soldererss" -msgstr[0] "精密焊料" +msgstr[0] "精密焊接" #: lang/json/TOOL_from_json.py msgid "atomic smartphone" @@ -60853,7 +60853,7 @@ msgstr[0] "魔杖(火球)" msgid "" "A classic, this wand shoots fireballs without fail. A more skilled " "Kelvinist could cast them more efficiently, though." -msgstr "" +msgstr "这是一款经典的魔杖,它可以发射火球。不过,一个熟练的魔法师可以更有效地使用它。" #: lang/json/TOOL_from_json.py msgid "wand of magic missiles" @@ -60865,7 +60865,7 @@ msgstr[0] "魔杖(魔法飞弹)" msgid "" "A classic, this wand shoots magic missiles without fail. A more skilled " "Magus could cast them more efficiently, though." -msgstr "" +msgstr "这是一款经典的魔杖,可以发射魔法飞弹。不过,更熟练的法师可以更有效地施放它们。" #: lang/json/TOOL_from_json.py msgid "Dusk" @@ -62411,14 +62411,14 @@ msgstr "只属于你的丧尸奴仆。他处于一种特殊的麻痹状态,等 #: lang/json/WHEEL_from_json.py lang/json/vehicle_part_from_json.py msgid "yoke and harness" -msgstr "" +msgstr "轭和马具" #. ~ Description for yoke and harness #: lang/json/WHEEL_from_json.py msgid "" "A bar and harness to attach a creature to a wheeled vehicle, they then " "should be able to pull it." -msgstr "" +msgstr "把动物拴在有轮子的车辆上的一根杆子和挽具,这样动物就可以拉动车子了。" #: lang/json/WHEEL_from_json.py lang/json/vehicle_part_from_json.py msgid "wheel" @@ -62756,11 +62756,11 @@ msgstr "装填中" #: lang/json/activity_type_from_json.py msgid "reading" -msgstr "阅读" +msgstr "阅读中" #: lang/json/activity_type_from_json.py msgid "playing" -msgstr "" +msgstr "游戏中" #: lang/json/activity_type_from_json.py msgid "waiting" @@ -65289,7 +65289,7 @@ msgstr "建造柜台门" #: lang/json/construction_from_json.py msgid "Build Split Rail Fence Gate" -msgstr "建造铁路分隔栅栏门" +msgstr "建造分离式围栏门" #: lang/json/construction_from_json.py msgid "Build Privacy Fence Gate" @@ -65297,7 +65297,7 @@ msgstr "建造隐私栅栏门" #: lang/json/construction_from_json.py msgid "Build Split Rail Fence" -msgstr "建造铁路分隔铁丝网" +msgstr "建造分离式围栏" #: lang/json/construction_from_json.py msgid "Build Privacy Fence" @@ -66137,7 +66137,7 @@ msgstr "狂信之众试图将非马卡斯们与马洛斯莓隔绝开来。吾等 #: lang/json/dream_from_json.py msgid "You have a strange dream about the shadows." -msgstr "你做了一个关于阴影的奇怪梦。" +msgstr "你做了一个关于阴影的怪梦。" #: lang/json/dream_from_json.py msgid "Your dreams give you a peculiar feeling of sinking into the dark." @@ -66211,12 +66211,12 @@ msgstr "AI专用标签:被玩家击中。" #: lang/json/effects_from_json.py msgid "Ridden" -msgstr "骑" +msgstr "被骑乘" #. ~ Description of effect 'Ridden'. #: lang/json/effects_from_json.py msgid "AI tag for when critter is being ridden. This is a bug if you have it." -msgstr "当怪物被驯服,赋予此AI标签.如果你的状态中出现此标签,意味着你遭遇了一个bug。" +msgstr "AI专用标签:此生物正在被骑着。如果你的状态中出现此标签,意味着你遭遇了一个bug。" #: lang/json/effects_from_json.py msgid "Harnessed" @@ -66227,7 +66227,7 @@ msgstr "驾驭" msgid "" "AI tag for when critter is being harnessed by a vehicle. This is a bug if " "you have it." -msgstr "" +msgstr "AI专用标签:此生物被套在车上,如果你有这个标签,说明遇到bug了。" #: lang/json/effects_from_json.py msgid "Docile Monster" @@ -66504,13 +66504,13 @@ msgstr "AI专用标签:表示动物穿着盔甲。" #: lang/json/effects_from_json.py msgid "Has Saddle" -msgstr "有马鞍" +msgstr "有鞍具" #. ~ Description of effect 'Has Saddle'. #: lang/json/effects_from_json.py msgid "" "AI tag used for critters wearing a saddle. This is a bug if you have it." -msgstr "" +msgstr "AI专用标签:此动物戴着鞍具。如果你有这个标签说明遇到bug了。" #: lang/json/effects_from_json.py msgid "Tied Up" @@ -66660,7 +66660,7 @@ msgstr "骑" #. ~ Description of effect 'Riding'. #: lang/json/effects_from_json.py msgid "You are riding an animal." -msgstr "你骑的是一只动物。" +msgstr "你骑着动物。" #. ~ Apply message for effect(s) 'Riding'. #: lang/json/effects_from_json.py src/monexamine.cpp @@ -68458,7 +68458,7 @@ msgstr "你充满了能量,它能改善你所做的每一件事。" #. ~ 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 "你充满了能量,这会改善你所做的每一件事!" #. ~ Remove message for effect(s) 'Blessed'. #: lang/json/effects_from_json.py @@ -69716,7 +69716,7 @@ msgid "" "An unpowered machine that seems like it could've been used to launch various" " balls for different types of sports. It's only good for parts now if " "disassembled." -msgstr "" +msgstr "这台没有动力的机器似乎可以用来发射各种不同运动项目的球。现在只适合拆解零件了。" #: lang/json/furniture_from_json.py msgid "bench" @@ -70489,7 +70489,7 @@ msgstr "一种开黄花的普通杂草。种子通过灰色细丝在风中传播 #. ~ Description for chamomile #: lang/json/furniture_from_json.py msgid "Ahh, soothing chamomile tea." -msgstr "啊,舒缓甘菊茶。" +msgstr "啊,温暖人心的甘菊茶。" #. ~ Description for tulip #: lang/json/furniture_from_json.py @@ -70551,7 +70551,7 @@ msgstr "百合花" msgid "" "These lilypads don't look they'd support the weight of the things you've " "heard croaking in the swamp." -msgstr "" +msgstr "这些睡莲看起来承受不了你在沼泽里听到的发出呱呱声音的动物的重量。" #: lang/json/furniture_from_json.py msgid "forge" @@ -70583,7 +70583,7 @@ msgstr "蜘蛛卵袋" msgid "" "Much too large, off-white egg sack. Kind of icky. Something IS moving in " "there." -msgstr "" +msgstr "非常大的灰白色卵袋。有点恶心,里面有东西在移动。" #: lang/json/furniture_from_json.py msgid "splat!" @@ -70601,7 +70601,7 @@ msgstr "球状的蜘蛛卵团。不只是有点恶心。里面有东西在动。 msgid "" "A horrifyingly oversized egg sack. Something IS moving in there. If you're" " seeing this, you're already too close to it." -msgstr "" +msgstr "一个大得吓人的卵袋。有东西在里面移动。如果你看到这个,你已经离它太近了。" #: lang/json/furniture_from_json.py msgid "ruptured egg sack" @@ -70610,7 +70610,7 @@ msgstr "蜘蛛卵袋(破裂)" #. ~ Description for ruptured egg sack #: lang/json/furniture_from_json.py msgid "Super icky. Spider stuff's spilling out." -msgstr "" +msgstr "太恶心了,蜘蛛从里面涌了出来。" #: lang/json/furniture_from_json.py msgid "reinforced vending machine" @@ -70633,7 +70633,7 @@ msgid "" "Play stupid games, win stupid prizes. That was the idea, anyway. Now, " "without power, it's just stupid. Smarter to disassemble for all kinds of " "useful electronic parts." -msgstr "" +msgstr "玩这愚蠢的游戏,赢得愚蠢的奖品。无论如何,这就是我的想法。但是现在没有电力了,只能拆卸各种有用的电子零件了。" #: lang/json/furniture_from_json.py msgid "pinball machine" @@ -70645,18 +70645,18 @@ msgid "" "Most underrated game of the 20th century. Press buttons so the ball doesn't" " go in the hole. It doesn't seem to be working without electricity. Could " "be disassembled for various electronic parts." -msgstr "" +msgstr "20世纪最被低估的游戏。按下按钮,保证弹珠不会进洞。没有电它似乎不能工作。可拆卸用于各种电子零件。" #: lang/json/furniture_from_json.py msgid "ergometer" -msgstr "室内自行车" +msgstr "划船健身器" #. ~ Description for ergometer #: lang/json/furniture_from_json.py msgid "" "An rowing exercise machine. Without power, it can no longer help you with " "your workout. Might have useful electronic parts in it." -msgstr "" +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 src/map.cpp @@ -70673,7 +70673,7 @@ msgstr "跑步机" msgid "" "Used for training leg muscles. It'll be extra hard without power. Could be" " taken apart for its... parts." -msgstr "" +msgstr "用于训练腿部肌肉。如果没有电源,它会难以启动。可以拆开它的…零件。" #: lang/json/furniture_from_json.py msgid "display case" @@ -70762,7 +70762,7 @@ msgid "" "Automation! Science! Industry! Make a better horse! This robot arm " "promises to do it all. Except it's currently unpowered. You could remove " "the casing and retrieve the electronics through disassembly." -msgstr "" +msgstr "自动化!科学!工业!这个机器人手臂可以完成所有的工作。只是现在没有动力。你可以拆下外壳,通过拆卸取回电子零件。" #: lang/json/furniture_from_json.py lang/json/terrain_from_json.py #: lang/json/terrain_from_json.py @@ -70776,7 +70776,7 @@ msgstr "自助加油机" #. ~ Description for automated gas console #: lang/json/furniture_from_json.py msgid "Automated gas flow control console." -msgstr "" +msgstr "自助加油机控制台" #: lang/json/furniture_from_json.py msgid "broken automated gas console" @@ -70786,7 +70786,7 @@ msgstr "自助加油机(损坏)" #: lang/json/furniture_from_json.py msgid "" "Automated gas flow control console. Broken. This is not a good thing." -msgstr "" +msgstr "自助加油机控制台。坏了,这不是一件好事。" #: lang/json/furniture_from_json.py msgid "smoking rack" @@ -70891,7 +70891,7 @@ msgstr "镣铐" msgid "" "Chain serfs in your dungeon. All you need now is an iron ball to chain to " "it." -msgstr "" +msgstr "把农奴锁在地牢里。现在你只需要一个铁球来把它拴在上面。" #: lang/json/furniture_from_json.py lang/json/terrain_from_json.py #: lang/json/terrain_from_json.py @@ -70932,7 +70932,7 @@ msgstr "方尖碑" #. ~ Description for obelisk #: lang/json/furniture_from_json.py msgid "Monument to pride." -msgstr "" +msgstr "骄傲的纪念碑。" #: lang/json/furniture_from_json.py msgid "thunk!" @@ -70941,7 +70941,7 @@ msgstr "咚!" #. ~ Description for brazier #: lang/json/furniture_from_json.py msgid "A raised metal dish in which to safely burn things." -msgstr "" +msgstr "一个金属盆,用于安全的燃烧物品。" #: lang/json/furniture_from_json.py msgid "fire ring" @@ -70950,7 +70950,7 @@ msgstr "火塘" #. ~ Description for fire ring #: lang/json/furniture_from_json.py msgid "A ring of stones to safely contain a fire." -msgstr "" +msgstr "一圈石头,用来安全的控制火势。" #: lang/json/furniture_from_json.py msgid "Autodoc Mk. XI" @@ -71050,15 +71050,15 @@ msgstr "塑料防潮布" 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 "" +msgstr "地上铺着一大块厚塑料防潮垫,也许这是一个屠宰的好地方。" #: lang/json/furniture_from_json.py msgid "whuff!" -msgstr "" +msgstr "沙咔!" #: lang/json/furniture_from_json.py msgid "crinkle." -msgstr "" +msgstr "沙沙~" #. ~ Description for fiber mat #: lang/json/furniture_from_json.py @@ -71090,11 +71090,11 @@ msgstr "纸箱城堡" 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 "" +msgstr "纸盒子堆叠成的“堡垒”,以毛毯衬里,部分屋顶被塑料薄膜盖住。" #: lang/json/furniture_from_json.py msgid "crumple!" -msgstr "" +msgstr "噗咔!" #: lang/json/furniture_from_json.py src/ballistics.cpp msgid "thud." @@ -71109,14 +71109,14 @@ msgstr "纸板墙" 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 "这是一堆纸箱,装满了破布和垃圾,像砖块一样堆放在一起,形成了一堵墙。" +msgstr "这是一堆纸板盒,装满了破布和垃圾,像砖块一样堆放在一起,形成了一堵墙。" #. ~ Description for large cardboard box #: lang/json/furniture_from_json.py msgid "" "A large cardboard box: this could be used to store things, or as a hiding " "place." -msgstr "一个大的纸板盒:可以用来存放东西,也可以作为藏匿的地方。" +msgstr "一个纸板箱:可以用来存放东西,也可以作为藏匿的地方。" #: lang/json/furniture_from_json.py msgid "beaded curtain" @@ -71178,7 +71178,7 @@ msgstr "钢琴" msgid "" "The ol' ebony and ivory. Really classes up the place. You could take it " "apart if you wanted... you monster." -msgstr "" +msgstr "乌木和象牙制成。真的很适合这个地方。如果你想的话,你可以把它拆开…" #: lang/json/furniture_from_json.py msgid "a suffering piano!" @@ -71723,7 +71723,7 @@ msgstr "地面制造点" 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 "" +msgstr "在空地上建立的制作点,虽然比使用工作台的时候速度会慢很多。但随时可用。" #: lang/json/furniture_from_json.py msgid "tatami mat" @@ -71734,7 +71734,7 @@ msgstr "榻榻米" msgid "" "A tatami is a type of mat used as a flooring material in traditional " "Japanese-style rooms." -msgstr "榻榻米是一种在传统的日本风格的房间里用作地板材料的垫子。" +msgstr "榻榻米,传统日式房间中铺在地板上的垫子。" #: lang/json/furniture_from_json.py msgid "mutated cactus" @@ -72787,7 +72787,7 @@ msgstr "一支流行的小型.22口径手枪。在20世纪末到21世纪初期 #: lang/json/gun_from_json.py msgid "Luty SMG: .22" msgid_plural "Luty SMGs: .22" -msgstr[0] "" +msgstr[0] "Luty冲锋枪:.22 弹" #: lang/json/gun_from_json.py msgid "" @@ -72798,6 +72798,8 @@ msgid "" "cartridges and accepts Ruger 10/22 magazines, or alternatively custom-made " "makeshift ones." msgstr "" +"Luty式自制无膛线冲锋枪,使用具有更先进动力的手动工具,由各种钢制零件粗制而成。也许是能够在工厂车间外制造出的最复杂的枪支之一,但仍然很不可靠。这一款专为.22" +" LR弹设计,支持鲁格10/22弹匣,或者定制的手工弹匣。" #: lang/json/gun_from_json.py msgid "S&W 22A" @@ -72851,7 +72853,7 @@ msgstr "这把普及的步枪是 M16 步枪系列的前身,它重量轻,准 #: lang/json/gun_from_json.py msgid "HK416 A5" msgid_plural "HK416 A5s" -msgstr[0] "" +msgstr[0] "HK416 A5s" #: lang/json/gun_from_json.py msgid "" @@ -73102,7 +73104,7 @@ msgid "" "A well-designed improvised carbine with a shortened barrel. Accepting crude" " detachable magazines or STANAG magazines, this is one of the better " "homemade weapons." -msgstr "" +msgstr "一把设计精良的自制卡宾枪,已经锯短枪管。支持原始的可拆卸弹匣或STANAG北约制式弹匣,算是把比较好的自制武器。" #: lang/json/gun_from_json.py msgid "M2010 ESR" @@ -73379,37 +73381,37 @@ msgstr "" #: lang/json/gun_from_json.py msgid "HK417 A2" msgid_plural "HK417 A2s" -msgstr[0] "" +msgstr[0] "HK417 A2s" #: lang/json/gun_from_json.py msgid "" "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." -msgstr "" +msgstr "一种德国战斗步枪,枪管13英寸,枪托可伸缩。它是一种气动旋转螺栓步枪,具有类似G36的短冲程活塞设计。" #: lang/json/gun_from_json.py msgid "M110A1" msgid_plural "M110A1s" -msgstr[0] "" +msgstr[0] "M110A1s" #: lang/json/gun_from_json.py msgid "" "A derivative of H&K's G28 with an aluminium upper reciever to meet US Army " "weight requirements. It is a gas operated, rotating bolt rifle accurate to " "1.5 MOA with standard ammunition." -msgstr "" +msgstr "G28的衍生版产物,配备可调节枪托及可拆卸两脚架。它是一种气动、旋转的栓式步枪,精确到1.5 mA,使用标准弹药。" #: lang/json/gun_from_json.py msgid "AR-10" msgid_plural "AR-10s" -msgstr[0] "" +msgstr[0] "AR-10s" #: 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 "" +msgstr "与后来的AR-15有点相似,AR-10是一种气动旋转式螺栓步枪,枪膛可容纳7.62x51毫米的子弹。" #: lang/json/gun_from_json.py msgid "SIG Sauer P230" @@ -73527,7 +73529,7 @@ msgstr "一支紧凑的、仅双动发射的左轮手枪,其设计目标是用 #: lang/json/gun_from_json.py msgid "Luty SMG: .38 Special" msgid_plural "Luty SMGs: .38 Special" -msgstr[0] "" +msgstr[0] "Luty冲锋枪:.38 特制弹" #: lang/json/gun_from_json.py msgid "" @@ -73538,6 +73540,8 @@ msgid "" "cartridges and accepts Taurus Pro .38 pistol magazines, or alternatively " "custom-made makeshift ones." msgstr "" +"Luty式自制无膛线冲锋枪,使用具有更先进动力的手工工具,由各种钢制零件粗制而成。也许是能够在工厂车间外制造出的最复杂的枪支之一,但仍然很不可靠。这一款专为.38" +" 弹设计,支持陶鲁斯Pro .38 手枪弹匣,或者定制的手工弹匣。" #: lang/json/gun_from_json.py msgid "S&W 619" @@ -73651,7 +73655,7 @@ msgstr "上市之初,这款.40口径手枪作为旧版西格&绍尔手枪的 #: lang/json/gun_from_json.py msgid "Luty SMG: .40 S&W" msgid_plural "Luty SMGs: .40 S&W" -msgstr[0] "" +msgstr[0] "Luty冲锋枪:.40 S&W弹" #: lang/json/gun_from_json.py msgid "" @@ -73662,6 +73666,8 @@ msgid "" "cartridges and accepts Glock 22 magazines, or alternatively custom-made " "makeshift ones." msgstr "" +"Luty式自制无膛线冲锋枪,使用具有更先进动力的手动工具,由各种钢制零件粗制而成。也许是能够在工厂车间外制造出的最复杂的枪支之一,但仍然很不可靠。这一款专为.40" +" S&W弹设计,支持格洛克22弹匣,或者定制的手工弹匣。" #: lang/json/gun_from_json.py msgid "handmade six-shooter" @@ -73919,7 +73925,7 @@ msgstr[0] "自制钢管步枪(.45口径)" #: lang/json/gun_from_json.py msgid "Luty SMG: .45" msgid_plural "Luty SMGs: .45" -msgstr[0] "" +msgstr[0] "Luty冲锋枪:.45 弹" #: lang/json/gun_from_json.py msgid "" @@ -73930,6 +73936,8 @@ msgid "" "cartridges and accepts MAC-10 magazines, or alternatively custom-made " "makeshift ones." msgstr "" +"Luty式自制无膛线冲锋枪,使用具有更先进动力的手动工具,由各种钢制零件粗制而成。也许是能够在工厂车间外制造出的最复杂的枪支之一,但仍然很不可靠。这一款专为.45" +" ACP弹设计,支持MAC-10冲锋枪弹匣,或者定制的手工弹匣。" #: lang/json/gun_from_json.py msgid "homemade hand cannon" @@ -73978,31 +73986,31 @@ msgstr "陶鲁斯\"愤怒公牛\"左轮手枪发射.454 卡苏尔弹,弹容量 #: lang/json/gun_from_json.py msgid "Marlin 1895 SBL" msgid_plural "Marlin 1895 SBLs" -msgstr[0] "" +msgstr[0] "Marlin 1895SBL 步枪" #: lang/json/gun_from_json.py msgid "" "A handy but powerful lever-action rifle chambered for .45-70 Government. " "Designed for wilderness guides for defense against large predators such as " "grizzly bears, moose, and dinosaurs." -msgstr "" +msgstr "一种轻便但威力强大的杠杆式步枪,使用威力极大的.45-70弹药。专为野外狩猎大型动物,例如灰熊、驼鹿等而设计。" #: lang/json/gun_from_json.py msgid "Magnum Research BFR" msgid_plural "Magnum Research BFRs" -msgstr[0] "" +msgstr[0] "马格南左轮手枪" #: lang/json/gun_from_json.py msgid "" "A massive single-action revolver. While the .45-70 rifle round loses " "significant velocity in its short pistol barrel, it still competes with " "other large magnum handguns in terms of power." -msgstr "" +msgstr "大型单动左轮手枪。虽然使用.45-70口径步枪子弹使其的射击速度相比其他手枪会显得稍慢一些,但是巨大的威力是其他手枪无法比拟的。" #: lang/json/gun_from_json.py msgid "1874 Sharps" msgid_plural "1874 Sharps" -msgstr[0] "" +msgstr[0] "夏普斯步枪 1874" #: lang/json/gun_from_json.py msgid "" @@ -74011,11 +74019,12 @@ msgid "" "powerful for the time, this one is made to handle modern smokeless " "ammunition." msgstr "" +"一把19世纪单发步枪的仿制品,45-70口径,曾在19世纪末用于狩猎野牛和其他大型猎物。在当时高度精确和威力强大,这个是用来处理现代无烟弹药的。" #: lang/json/gun_from_json.py msgid "H&K MP7A2" msgid_plural "H&K MP7A2s" -msgstr[0] "" +msgstr[0] "H&K MP7A2 冲锋枪" #: lang/json/gun_from_json.py msgid "" @@ -74056,6 +74065,9 @@ msgid "" "red dot, recoil compensator and laser sights. Similar to other Leadworks " "products it doesn't accept third-party modifications." msgstr "" +"在9x19mm自动手枪大获成功之后,Leadworks LLC从原有的 .460 罗兰德弹半自动系列中研发出了 L39B-45 手枪,并准备让它使用 " +".45 ACP 弹。由于它的大部分部件与 L39-460 手枪通用,这个型号保留了发射威力可怕的 .460 " +"罗兰德弹的能力,不过公司强烈建议用户不要在全自动射击模式下这样做。内部集成了红点瞄准镜,制退器和激光瞄具。但是就和该公司出品的其他枪械一样,第三方配件基本都是安不上去的。" #: lang/json/gun_from_json.py msgid "L2031 Enforcer" @@ -74394,13 +74406,13 @@ msgstr "卡尔古斯塔夫M3 84mm无后坐力炮由瑞典FFV公司制造,是 #: lang/json/gun_from_json.py msgid "AT4" msgid_plural "AT4s" -msgstr[0] "" +msgstr[0] "AT4s" #: 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 "" +msgstr "Mil-Spec火箭发射器。一种84毫米无制导、便携式、单发无后座力平滑口径武器,主要用于美国军方。" #: lang/json/gun_from_json.py msgid "RM103A automagnum" @@ -74677,7 +74689,7 @@ msgstr[0] "自制钢管步枪(9x19mm口径)" #: lang/json/gun_from_json.py msgid "Luty SMG: 9x19mm" msgid_plural "Luty SMGs: 9x19mm" -msgstr[0] "" +msgstr[0] "Luty冲锋枪: 9x19mm 弹" #: lang/json/gun_from_json.py msgid "" @@ -74688,6 +74700,8 @@ msgid "" "cartridges and accepts STEN magazines, or alternatively custom-made " "makeshift ones." msgstr "" +"Luty式自制无膛线冲锋枪,使用具有更先进动力的手动工具,由各种钢制零件粗制而成。也许是能够在工厂车间外制造出的最复杂的枪支之一,但仍然很不可靠。这一款专为" +" 9x19mm 弹设计,支持司登冲锋枪弹匣,或者定制的手工弹匣。" #: lang/json/gun_from_json.py msgid "STEN" @@ -75380,7 +75394,7 @@ msgstr "这是一把采用常见物品组装而成的简易激光步枪。威力 #: lang/json/gun_from_json.py msgid "C.R.I.T .5 LP" msgid_plural "C.R.I.T .5 LPs" -msgstr[0] "" +msgstr[0] "C.R.I.T .5激光手枪" #: lang/json/gun_from_json.py msgid "" @@ -75389,11 +75403,12 @@ 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 "" +"C.R.I.T试验型低功率激光手枪,这是一种高精准度但是威力较小的试验型手枪。双管设计弥补了原始动力的不足,但由于采用了高温合金结构,相对容易瞄准和重量较轻" #: lang/json/gun_from_json.py msgid "C.R.I.T Chain Laser" msgid_plural "C.R.I.T Chain Lasers" -msgstr[0] "" +msgstr[0] "C.R.I.T 链式激光枪" #: lang/json/gun_from_json.py msgid "" @@ -75401,7 +75416,7 @@ msgid "" "researcher's video on three taped-together .5 LPs on a hand held power " "drill, this gun is a relatively light weapon for the amount of UPS and " "destruction it can cause." -msgstr "" +msgstr "内部研发尝试的一款试验型武器,这把武器将五只.5激光手枪安装在了一个手持电钻上,它可以造成大量的伤害以及消耗较少的UPS能量。" #: lang/json/gun_from_json.py msgid "burst" @@ -75410,31 +75425,31 @@ msgstr "连发" #: lang/json/gun_from_json.py msgid "C.R.I.T Laser Carbine" msgid_plural "C.R.I.T Laser Carbines" -msgstr[0] "" +msgstr[0] "C.R.I.T 激光卡宾枪" #: lang/json/gun_from_json.py msgid "" "A lightweight laser gun developed by C.R.I.T R&D. Mainly developed to test " "out a new breakthrough in laser weapons." -msgstr "" +msgstr "C.R.I.T研发的一种轻型激光枪。研制这种武器是为了试验激光武器的新突破。" #: lang/json/gun_from_json.py msgid "C.R.I.T Fire Glove" msgid_plural "C.R.I.T Fire Gloves" -msgstr[0] "" +msgstr[0] "C.R.I.T 火焰手枪" #: lang/json/gun_from_json.py msgid "Experimental CQB weapon system under development in C.R.I.T R&D." -msgstr "" +msgstr "C.R.I.T实验性的近距离武器系统。" #: lang/json/gun_from_json.py msgid "blast" -msgstr "" +msgstr "燃爆" #: lang/json/gun_from_json.py msgid "pellet gun" msgid_plural "pellet guns" -msgstr[0] "" +msgstr[0] "弹丸枪" #: lang/json/gun_from_json.py msgid "" @@ -75444,6 +75459,7 @@ msgid "" "but the break action charging system requires some arm strength to load a " "pellet." msgstr "" +"令人惊讶的强大气枪,可以可靠地狩猎。小的铅或合金球团可被装入枪膛内,使它在每次射击中都能散射出大量的弹丸。虽然每次装弹都非常缓慢,但是精准度相当可靠。" #: lang/json/gun_from_json.py msgid "Plasma Cutter" @@ -75454,12 +75470,12 @@ msgstr[0] "等离子切割机" 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 "" +msgstr "C.R.I.T试验型武器,可以发射一束温度很高的等离子波。瞬间摧毁融化目标。" #: lang/json/gun_from_json.py msgid "Rivet Driver" msgid_plural "Rivet Drivers" -msgstr[0] "" +msgstr[0] "铆钉激发器" #: lang/json/gun_from_json.py msgid "" @@ -75467,18 +75483,18 @@ msgid "" "a regular nail and then enlongates it within a fraction of a second before " "firing it out, upon reaching a target, the fragile stake explodes into " "shards." -msgstr "" +msgstr "C.R.I.T 研发的实验性两用工具,它可以将普通钉子在几分之一秒内快速拉长后射出,到达目标后,脆弱的金属钉会当场破碎。" #: lang/json/gun_from_json.py msgid "Line Gun" msgid_plural "Line Guns" -msgstr[0] "" +msgstr[0] "线性等离子炮" #: 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 "" +msgstr "C.R.I.T研发的试验型武器,可以发射一束非常宽的线性等离子光束,击中后可以切割摧毁目标。" #: lang/json/gun_from_json.py msgid "Pulse Rifle" @@ -75490,7 +75506,7 @@ msgid "" "Experimental tri-barrel sub-sonic rifle under development in C.R.I.T R&D. " "Great for enclosed spaces and mobs of enemies. Shoots alloy rounds which " "instantly mushroom out upon impact." -msgstr "" +msgstr "C.R.I.T研发的试验型三管亚音速步枪,非常适合在封闭空间内消灭大量敌人。发射合金弹丸,弹丸在撞击后立即爆炸。" #: lang/json/gun_from_json.py msgid "Ripper" @@ -75501,11 +75517,11 @@ msgstr[0] "开膛手" msgid "" "Experimental EM saw under development in C.R.I.T R&D. Great for distance " "cutting of material." -msgstr "" +msgstr "C.R.I.T研发的实验性电磁场锯,非常适合远距离切割材料。" #: lang/json/gun_from_json.py msgid "em field saw" -msgstr "" +msgstr "电磁场锯" #: lang/json/gun_from_json.py msgid "" @@ -76144,7 +76160,7 @@ msgstr[0] "木弓" 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 "" +msgstr "一把具有神奇魔法的华丽反曲弓。由结实而有弹性的木料制成,拉开弓弦就会自动生成一只箭。" #: lang/json/gun_from_json.py msgid "fire lance" @@ -77329,7 +77345,7 @@ msgstr "cop_38" #: lang/json/gunmod_from_json.py msgctxt "gun_type_type" msgid "moss_brownie" -msgstr "moss_brownie" +msgstr "莫斯-布朗尼" #: lang/json/gunmod_from_json.py msgid "shortened barrel" @@ -77397,7 +77413,7 @@ msgstr[0] "强力射击" msgid "" "This is a pseudo item -- the builtin part of a fusion blaster for the " "maximum power firing mode." -msgstr "" +msgstr "这是一个伪物品——核聚变爆破器的内置部分,用于最大功率的发射模式。" #: lang/json/gunmod_from_json.py msgid "underbarrel" @@ -78315,59 +78331,59 @@ msgstr "这是一整套枪械改装组件,可以将大部分的普通步枪改 #: lang/json/gunmod_from_json.py msgid "Underslung flare launcher" msgid_plural "Underslung flare launchers" -msgstr[0] "" +msgstr[0] "悬挂式信号弹发射器" #: 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 "" +msgstr "一个悬挂式的信号弹发射组建,相比于正常的信号枪而言体积更小,所以命中率也会更差一些。" #: lang/json/gunmod_from_json.py msgid "butt hook stock" msgid_plural "butt hook stocks" -msgstr[0] "" +msgstr[0] "可折叠对接支架" #: lang/json/gunmod_from_json.py msgid "" ", 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. " -msgstr "" +msgstr "这是一种军用级装备,可以减少枪支体积。固定在前臂上的旋转挂钩使你的手臂持枪更加稳定。" #: lang/json/gunmod_from_json.py msgid "diffracting lens" msgid_plural "diffracting lenss" -msgstr[0] "" +msgstr[0] "衍射透镜" #: lang/json/gunmod_from_json.py msgid "" "A set of optics made to fit on laser weapons, which will diffract the laser " "beam into several lower powered beams. This slightly increases point-blank " "damage and makes it difficult to not hit, but reduces range" -msgstr "" +msgstr "一套安装在激光武器上的光学装置,它将激光束衍射成几个低功率光束。这稍微增加了近距离的伤害,但减少了射程。" #: lang/json/gunmod_from_json.py msgid "tactical flashlight" msgid_plural "tactical flashlights" -msgstr[0] "" +msgstr[0] "战术手电筒" #: 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 "" +msgstr "一个紧凑型手电筒,安装在你的武器旁边,功率虽然不大,但是足够耐用。" #: lang/json/gunmod_from_json.py msgid "tactical flashlight (on)" msgid_plural "tactical flashlight (on)s" -msgstr[0] "" +msgstr[0] "战术手电筒 (开)" #: lang/json/gunmod_from_json.py msgid "" "A compact flashlight which is attatched to the side of your weapon, not " "powerful, but good enough for tight hallways." -msgstr "" +msgstr "一个紧凑型手电筒,安装在你的武器旁边,功率虽然不大,但是足够耐用。" #: lang/json/gunmod_from_json.py msgid "5.45 caliber conversion kit" @@ -79506,7 +79522,7 @@ msgstr "" #: lang/json/help_from_json.py msgid "<1>: List of item types and data" -msgstr "1:列出物品类型和数据" +msgstr "<1>:列出物品类型和数据" #: lang/json/help_from_json.py #, no-python-format @@ -80426,7 +80442,7 @@ msgstr "背包与披衣层" #. ~ Please leave anything in unchanged. #: lang/json/json_flag_from_json.py msgid "This gear is strapped onto you." -msgstr "这件装备用带子在身上。" +msgstr "这件装备用带子在身上。" #. ~ Please leave anything in unchanged. #: lang/json/json_flag_from_json.py @@ -80449,7 +80465,7 @@ msgstr "这件装备会阻挡视线,让你完全失明 #. ~ Please leave anything in unchanged. #: lang/json/json_flag_from_json.py msgid "This item can be used to block attacks when worn." -msgstr "* 这件物品穿戴后可以格挡攻击。" +msgstr "这件装备穿戴后可以格挡攻击。" #. ~ Please leave anything in unchanged. #: lang/json/json_flag_from_json.py @@ -81378,7 +81394,7 @@ msgstr "切换标志" #: lang/json/keybinding_from_json.py msgid "Toggle lights" -msgstr "点灯游戏" +msgstr "开/关照明" #: lang/json/keybinding_from_json.py msgid "Reset level" @@ -84492,18 +84508,18 @@ msgstr "你引诱住对手了!下一击便是毒蛇疯咬!" #: lang/json/martial_art_from_json.py msgid "C.R.I.T Blade-work" -msgstr "" +msgstr "C.R.I.T刀术" #. ~ Description for martial art 'C.R.I.T Blade-work' #: lang/json/martial_art_from_json.py msgid "" "An offensive style that is centered around rapid slashes and prodding. Each" " attack landed increases your speed by 3 and offers other combat bonuses" -msgstr "" +msgstr "以快速劈砍和戳刺为核心的进攻性战技。每次攻击使你的速度提高3并获得其他战斗奖励。" #: lang/json/martial_art_from_json.py msgid "C.R.I.T Intensity" -msgstr "" +msgstr "C.R.I.T之强度" #. ~ Description of buff 'C.R.I.T Intensity' for martial art 'C.R.I.T Blade- #. work' @@ -84511,11 +84527,11 @@ msgstr "" msgid "" "+3 Atk Speed and other small bonuses per stack. Bash damage decreases by 10 " "percent per stack. Max of 10 stacks" -msgstr "" +msgstr "每层+3攻击速度,并获得其他微小奖励,-10%钝伤。最大叠加10层。" #: lang/json/martial_art_from_json.py msgid "C.R.I.T Calculation" -msgstr "" +msgstr "C.R.I.T之演算" #. ~ Description of buff 'C.R.I.T Calculation' for martial art 'C.R.I.T Blade- #. work' @@ -84523,11 +84539,11 @@ msgstr "" msgid "" "DEX provides accuracy and minor cut and stab damage with slight piercing " "capability." -msgstr "" +msgstr "敏捷提供命中和少量砍、刺伤害,以及轻微的护甲穿透。" #: lang/json/martial_art_from_json.py msgid "C.R.I.T Enforcement" -msgstr "" +msgstr "C.R.I.T镇压术" #. ~ Description for martial art 'C.R.I.T Enforcement' #: lang/json/martial_art_from_json.py @@ -84535,31 +84551,31 @@ msgid "" "A defensive style that is centered around stunning swings, knockback and " "grounding enemies. Each attack landed increases your armor by 0.125 and " "offers other combat bonuses based on stats." -msgstr "" +msgstr "以击昏、击退、击倒敌人为核心的防御性战技,每次攻击增加0.125的护甲,并根据属性值提供其他战斗奖励。" #: lang/json/martial_art_from_json.py msgid "C.R.I.T Endurance" -msgstr "" +msgstr "C.R.I.T之忍耐" #. ~ Description of buff 'C.R.I.T Endurance' for martial art 'C.R.I.T #. Enforcement' #: lang/json/martial_art_from_json.py msgid "" "+0.05 armor, +0.1 bash and other small bonuses per stack. Max of 10 stacks" -msgstr "" +msgstr "每层+0.05护甲,+0.1钝击伤害,并获得其他微小奖励。最大10层。" #: lang/json/martial_art_from_json.py msgid "C.R.I.T Guard" -msgstr "" +msgstr "C.R.I.T之守护" #. ~ Description of buff 'C.R.I.T Guard' for martial art 'C.R.I.T Enforcement' #: lang/json/martial_art_from_json.py msgid "+1 armor. STR provides accuracy and minor bash damage and arpen." -msgstr "" +msgstr "+1护甲。力量提供命中和少量钝击伤害,以及护甲穿透。" #: lang/json/martial_art_from_json.py msgid "C.R.I.T CQB" -msgstr "" +msgstr "C.R.I.T格斗术" #. ~ Description for martial art 'C.R.I.T CQB' #: lang/json/martial_art_from_json.py @@ -84567,22 +84583,22 @@ msgid "" "A defensive style centered around rapid paralyzing strikes and piercing " "jabs. Each attack landed increases your speed by 0.5 along with a slew of " "combat bonuses. 25 percent bash damage." -msgstr "" +msgstr "以快速冲刺和瘫痪敌人为核心的防御性战技,每次攻击使你的速度提高0.5并获得一系列战斗奖励,25%重击伤害。" #: lang/json/martial_art_from_json.py msgid "C.R.I.T Tenacity" -msgstr "" +msgstr "C.R.I.T之坚韧" #. ~ Description of buff 'C.R.I.T Tenacity' for martial art 'C.R.I.T CQB' #: lang/json/martial_art_from_json.py msgid "" "+0.5 Atk Speed and other small bonuses based on DEX per stack. Max of 100 " "stacks" -msgstr "" +msgstr "基于敏捷,每层获得0.5攻击速度和其他微小奖励。最大100层。" #: lang/json/martial_art_from_json.py msgid "C.R.I.T Initiative" -msgstr "" +msgstr "C.R.I.T之主动" #. ~ Description of buff 'C.R.I.T Initiative' for martial art 'C.R.I.T CQB' #: lang/json/martial_art_from_json.py @@ -84590,11 +84606,11 @@ msgid "" "DEX provides dodge ability, accuracy and minor cut /stab damage with slight " "piercing capability. 25 Percent Bash Damage that slightly increases per hit " "stack." -msgstr "" +msgstr "敏捷提供闪避、命中和少量砍/刺伤害,以及轻微的护甲穿透。每次命中层叠25%钝伤。" #: lang/json/martial_art_from_json.py msgid "Panzer Kunst" -msgstr "装甲艺术" +msgstr "机甲术" #. ~ Description for martial art 'Panzer Kunst' #: lang/json/martial_art_from_json.py @@ -84605,20 +84621,20 @@ msgstr "一种为改造人在零重力环境中战斗而设计的未来主义武 #: lang/json/martial_art_from_json.py msgid "Verschlag" -msgstr "" +msgstr "囚状冲击" #. ~ Description of buff 'Verschlag' for martial art 'Panzer Kunst' #: lang/json/martial_art_from_json.py msgid "You have imparted a powerful shockwave to your enemy" -msgstr "" +msgstr "你将强大的冲击波封入敌人体内。" #: lang/json/martial_art_from_json.py msgid "Schatten Folgen" -msgstr "" +msgstr "暗影追踪" #: lang/json/martial_art_from_json.py msgid "Einsatzrhythmen" -msgstr "" +msgstr "插入节奏" #. ~ Description of buff 'Einsatzrhythmen' for martial art 'Panzer Kunst' #: lang/json/martial_art_from_json.py @@ -86407,7 +86423,7 @@ msgstr "前往难民中心" #: lang/json/mission_def_from_json.py msgid "Bring Dino Dave a roll of duct tape." -msgstr "给迪诺·戴夫一卷胶带。" +msgstr "带一卷胶带给迪诺·戴夫。" #: lang/json/mission_def_from_json.py msgid "" @@ -86445,20 +86461,20 @@ msgstr "哦,那太糟了。我猜他们全都吃了。" #: lang/json/mission_def_from_json.py msgid "Bring Dino Dave small cardboard boxes." -msgstr "把迪诺·戴夫的小纸箱带来。" +msgstr "带小纸盒给迪诺·戴夫。" #: lang/json/mission_def_from_json.py msgid "" "Gotta start small right? Little ones for keeping little things safe. I " "could use 'em." -msgstr "得从小开始,对吧?为了保护小东西的安全。我可以用它们。" +msgstr "从最小的开始,小纸盒,对吧?我可以用它们保护小物件的安全。" #: lang/json/mission_def_from_json.py msgid "" "Gotta start small right? Little ones for keeping little things safe. I " "could use 'em. I need a bunch of 'em. Little ones, you know? Can you " "bring me like... like... forty?" -msgstr "得从小开始,对吧?为了保护小东西的安全。我可以用它们。我需要一堆。小点的,你知道吗?你能给我拿来...拿来...40个吗?" +msgstr "从最小的开始,对吧?我可以用它们保护小物件的安全。我需要一堆,小纸盒,明白吗?你能给我拿来...拿来...40个吗?" #: lang/json/mission_def_from_json.py msgid "Got the little ones yet?" @@ -86468,26 +86484,26 @@ msgstr "小东西们拿到了吗?" 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 "这些是好的,好的。他们需要一些东西把他们绑在一起。包围他们,光明的一面,黑暗的一面。把原力给我!" +msgstr "这些是好的,好东西。现在需要一些东西把它们绑在一起。缠绕它们,一面光明,一面黑暗。赐予我力量吧!" #: 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 "我已被它们环绕……你确定它们是原生态的吗?" #: lang/json/mission_def_from_json.py msgid "Bring Dino Dave medium-sized cardboard boxes" -msgstr "带迪诺·戴夫中型纸板箱" +msgstr "带纸板盒给迪诺·戴夫" #: lang/json/mission_def_from_json.py msgid "" "Ten bigger ones now please. The list doesn't lie. You've done so well." -msgstr "" +msgstr "现在请给我10个稍微大一点的,纸板盒。清单没有说谎,你做得太好了。" #: 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 "" +msgstr "现在请给我10个稍微大一点的,纸板盒。清单没有说谎,你做得太好了。清单上还有一些未完成的项目,但我们已经完成了一多半。" #: lang/json/mission_def_from_json.py msgid "Any luck? Bigger ones?" @@ -86499,7 +86515,7 @@ msgstr "我现在太高兴了!" #: lang/json/mission_def_from_json.py msgid "Bring Dino Dave some large plastic sheets" -msgstr "给迪诺·戴夫一些大塑料薄膜" +msgstr "带一些大塑料薄膜给迪诺·戴夫" #: lang/json/mission_def_from_json.py msgid "" @@ -86507,6 +86523,7 @@ msgid "" "I guess I need some plastic just in case. I don't like it, the sandman can " "smell through plastic, but I think the cardboard is stronger." msgstr "" +"如果我能把它放在这里,我就不需要它了,但它们可能会把我赶出去,所以我想我需要一些塑料以防万一。我不喜欢它,睡魔可以通过塑料闻到气味,所以我认为硬纸板更结实。" #: lang/json/mission_def_from_json.py msgid "" @@ -86515,10 +86532,11 @@ msgid "" "smell through plastic, but I think the cardboard is stronger. Please bring " "me some plastic sheets." msgstr "" +"如果我能把它放在这里,我就不需要它了,但它们可能会把我赶出去,所以我想我需要一些塑料以防万一。我不喜欢,睡魔可以通过塑料闻到气味,但我认为纸板更结实。请给我拿些塑料布。" #: lang/json/mission_def_from_json.py msgid "We're almost there, now." -msgstr "我们快到了。" +msgstr "我们快完成了。" #: lang/json/mission_def_from_json.py msgid "They keep a lot of this stuff in hardware stores and lumber yards." @@ -86540,14 +86558,14 @@ msgstr "哦,那太糟了。" #: lang/json/mission_def_from_json.py msgid "Bring Dino Dave large cardboard boxes" -msgstr "带迪诺·戴夫大纸箱" +msgstr "带纸板箱给迪诺·戴夫" #: lang/json/mission_def_from_json.py msgid "" "This is the last thing I need from you. I've been collecting the other " "parts myself, it's been easier with more cardboard around. Can you bring me" " five more really big cardboard boxes?" -msgstr "这是我最不需要的。我自己一直在收集其他零件,周围有更多的硬纸板会更容易。你能再给我五个大纸箱吗?" +msgstr "这是我需要你做的最后一件事。我自己一直在收集其他部分,周围有更多的硬纸板会更容易。你能再给我五个纸板箱吗?" #: lang/json/mission_def_from_json.py msgid "" @@ -86556,7 +86574,7 @@ 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 "" -"这是我最不需要你做的事。我自己一直在收集其他零件,如果周围有更多的纸板,就更容易了。你能再给我五个大纸箱吗?再来五个纸箱,有多大就有多大。我已经储存了一些,这应该是我所需要的。" +"这是我需要你做的最后一件事。我自己一直在收集其他部分,如果周围有更多的纸板,就更好办了。你能再给我五个更大的纸箱吗?再来五个纸板箱,有多大要多大。我已经收藏了一些,五个应该就够了。" #: lang/json/mission_def_from_json.py msgid "Yes! The home stretch!" @@ -86624,7 +86642,7 @@ msgid "" "pretty comforting. I did a few extra rounds of chores and saved the " "proceeds for if you managed this, here you go. It's not much but I hope it " "helps." -msgstr "" +msgstr "非常感谢。手边有一份副本确实让人感觉很舒服。多做了几轮杂物,把赚来的钱存起来,如果你做得到了,就来吧。虽然不多,但我希望它能有所帮助。" #: lang/json/mission_def_from_json.py msgid "What good does this do me?" @@ -86764,10 +86782,11 @@ msgid "" "helps... these are merch, the local money, you can trade them for goods from" " the shop." msgstr "" +"非常感谢。听我说,我会将你帮助我们的事情告诉大伙,我们会凑点钱作为酬谢,数量虽然不多,但希望会对你有所帮助。这是我们用的商会币,可以用它们在商店换取物资。" #: lang/json/mission_def_from_json.py msgid "Find 6 bottles of prozac for Uyen" -msgstr "为Uyen找6瓶百忧解" +msgstr "为陈宛找6瓶百忧解" #: lang/json/mission_def_from_json.py msgid "We could still use your help..." @@ -86781,6 +86800,7 @@ msgid "" " people having to starve to pay for them. Three month's worth - about 6 " "bottles - would last us a little while." msgstr "" +"我可能不应该开药,但这里有很多人需要帮助才能入睡。如果你能给我们一些抗抑郁药,我和莱泽尔就能确保这些药能被合理分配而不会让人们饿着肚子付钱。三个月的量——大约6瓶——够我们用一段时间了。" #: lang/json/mission_def_from_json.py msgid "" @@ -86792,11 +86812,11 @@ msgstr "百忧解真的很常见。你可能会在大多数药柜和药房里找 msgid "" "Thanks so much. Listen, I told some of the others what you were up to for " "us and we pooled our cash to thank you. You've done a lot to help us out." -msgstr "" +msgstr "非常感谢。听着,我告诉了其他人你在为我们做什么,我们凑钱来感谢你。你帮了我们很多忙。" #: lang/json/mission_def_from_json.py msgid "Find a haircut kit for Vanessa" -msgstr "" +msgstr "为瓦内萨找个理发剪" #: lang/json/mission_def_from_json.py msgid "If I had some equipment, I could do some hairdresser work here." @@ -86808,13 +86828,13 @@ msgid "" "you could put together a basic hair cutting kit for me, I could do a bit of " "styling for people around here. I'll even give you a free haircut for your " "troubles." -msgstr "" +msgstr "当我被疏散时,我没想到要打包我的美容设备。如果你能为我准备一个基本的理发工具,我可以为周围的人做一些造型。我甚至会给你免费理发。" #: lang/json/mission_def_from_json.py msgid "" "Cool, thanks. It'll be good to have something useful to do, and to not be " "staring at so many shaggy slobs." -msgstr "" +msgstr "酷,谢谢。有一些有用的事情可以做,而不是盯着这么多毛茸茸的懒汉,这是件好事。" #: lang/json/mission_def_from_json.py msgid "Whatever, I'll keep twiddling my thumbs then." @@ -86839,11 +86859,11 @@ msgstr "这个很有用。天哪,这些剪刀很漂亮,我可能会用魔法 msgid "" "Seriously? You failed to find *scissors*? How do you tie your shoes in the" " morning?" -msgstr "" +msgstr "真的?你找不到*剪刀*了?你早上怎么系的鞋带?" #: lang/json/mission_def_from_json.py msgid "Find 50 3L jars" -msgstr "找到50个3L的罐子" +msgstr "找到50个3L玻璃罐" #: lang/json/mission_def_from_json.py msgid "I do have some work for you." @@ -86856,6 +86876,7 @@ msgid "" " use some larger jars though for big stock items. Can you bring me 50 large" " three liter jars? I'll pay you a Certified Note per two." msgstr "" +"你没听错。你拿来的罐头瓶子,让我们开始考虑将粮食储备从脱水食品扩展到罐头食品。存储大型渍物需要用到大号玻璃罐,你能给我们带50个3L玻璃罐吗?每个罐头换两张代币。" #: lang/json/mission_def_from_json.py msgid "" @@ -86863,7 +86884,7 @@ msgid "" "inhabitants, I'll be able to start buying these from you and other " "scavengers in smaller lots. This should be enough to test out our " "equipment." -msgstr "" +msgstr "谢谢您。一旦我们和我们的一些居民建立了小型手工作坊,我就可以开始从你和其他拾荒者那里小批量购买这些东西了。这足以测试我们的设备。" #: lang/json/mission_def_from_json.py msgid "Oh well. I'll see if I can find another supplier, thanks." @@ -86877,7 +86898,7 @@ msgstr "杂货店,民宅厨房,有很多可探索的地方。" msgid "" "Wow, that's a lot more jars than it sounded on paper. Thanks. Here's your " "payment." -msgstr "" +msgstr "哇,这比在纸上听起来要多得多。谢谢。这是你的报酬。" #: lang/json/mission_def_from_json.py msgid "I wonder where all the jars went..." @@ -86897,6 +86918,7 @@ msgid "" "bother us again. We can't pay much, besides some of our own internal money " "which isn't good for that much yet, but it would help us to reclaim the bay." msgstr "" +"如果你真的想帮忙,请帮我们清理后院的丧尸,在灾难发生的最初几天,由于害怕出门,我们把自己人的尸体和打倒的丧尸都封在后院里,我们当时最有前途的领导者也因此遇难……并且已经变成了不一样的“东西”。请把它们清理干净,确保它们不会再威胁到我们。我们无力支付更多报酬,只有一些我们的内部货币,它们不太值钱,但这件事对我们重建基地意义重大。" #: lang/json/mission_def_from_json.py msgid "Please be careful, we don't need any more deaths." @@ -86923,6 +86945,7 @@ msgid "" "workers in exchange for supplies. They're getting some value in the center " "as a trade item, I'm afraid they're all we have to spare at the moment." msgstr "" +"谢谢你,在家门口有这么大的威胁令人神经紧张。这是我们本地的认证票据,我们一直在向工人支付这些票据,用于换取物资。作为一种代币,它的交换价值在本中心被承认,恐怕现在我们只能凑合用这些了。" #: lang/json/mission_def_from_json.py msgid "Missing Caravan" @@ -86939,6 +86962,7 @@ msgid "" "the supplies they were carrying, plus thirty certified notes - that's our " "own internal money, good for trading and such." msgstr "" +"这比上一个请求要麻烦一些,我们最近与前来贸易的一个拾荒者团队失联了,希望你能调查一下。我们强烈怀疑有强盗团伙或尸潮突袭了它们。除了最后的无线通信记录坐标以外,我很难再给你更多线索。不管怎样,解决那个威胁,使拾荒者可以相对安全的同行。我能提供的最好的奖励是他们现在携带的物资,外加30份经过认证的票据——那是我们的内部货币,用于交易。" #: lang/json/mission_def_from_json.py msgid "Our community survives on trade, we appreciate it." @@ -86972,6 +86996,7 @@ msgid "" " with the foreman to get more detailed tasks. We've got 50 Certified Notes " "for you if you can do this for us." msgstr "" +"我们最近派遣了一些有技能的人开设了一个前哨站,以确保我们在一个更安全的地方获得一些食物供应。我们建立的新前哨站需要你的帮助。在我们开始把更多的难民送往农业公社之前,我需要你拿到工头的说明书。与领班协商以获得更详细的任务。如果你能为我们做这件事,我们有50张经过认证的钞票可以给你。" #: lang/json/mission_def_from_json.py msgid "I'm sure the outpost will expand quickly with your assistance." @@ -87004,6 +87029,7 @@ msgid "" "had a few solar panels we could use them to top up our usage. We could pay " "you pretty handsomely to bring us, say, ten solar panels?" msgstr "" +"我们开始在这里建立新的基础设施,并希望建立一些新的电气系统…不幸的是,我们现有的系统依赖于一种放射性同位素热力发电机供应能量。在地下室重新安装巨大的发电机组不可行。我们有一个很大的平屋顶,如果我们有几个太阳能电池板,我们可以用它们来补充我们的能量供应。我们可以付你相当可观的钱,你可以给我们带来十块太阳能电池板吗?" #: lang/json/mission_def_from_json.py msgid "If you can do this for us our survival options would vastly increase." @@ -87021,7 +87047,7 @@ msgstr "太好了,我知道这点不算多,但是有了你的帮助我们有 #: lang/json/mission_def_from_json.py msgid "Find 100 canning jars" -msgstr "" +msgstr "找到100个玻璃罐" #: lang/json/mission_def_from_json.py msgid "" @@ -87034,6 +87060,7 @@ msgid "" "to get us set for the winter. I'll pay you a premium rate if you can bring " "us around a hundred jars to get us started." msgstr "" +"我们已经设法确保了日常的食品供应,但还是十分勉强。如果被困在这里,粮食储备撑不了几天,为此我们需要更多的存粮。多亏前哨站弄来了一些肉和蔬菜,但需要用更好的方法贮存它们。我们的一些成员懂得制作罐头食品,只要有足够多的罐头瓶,我们就能依靠泡菜和肉罐头过冬。开展这项工作需要100个玻璃罐,如果你能为我们找来,我们还会额外发些奖励给你。" #: lang/json/mission_def_from_json.py msgid "" @@ -87056,6 +87083,7 @@ msgid "" "might be easier to just go straight through their office if you want more " "work." msgstr "" +"这就少了一件需要要担心的事。很高兴有你这样的人站在我们这边。这是25商币,经纪人将收购你能找到的所有的玻璃罐——但是是以较低的基础价格,我们拿不出资金给你额外奖励了。事实上,经纪人说还有类似的工作可以提供给你,如果你愿意,可以直接去他的办公室。" #: lang/json/mission_def_from_json.py msgid "" @@ -87356,7 +87384,7 @@ msgstr "" #: lang/json/mission_def_from_json.py msgid "Return Field Data" -msgstr "" +msgstr "回馈现场数据" #: lang/json/mission_def_from_json.py msgid "" @@ -87365,6 +87393,7 @@ msgid "" " are likely to die, but if you complete it we will allow you limited access " "to our resources." msgstr "" +"不,我是说…[*你听到对讲机里传来一段低沉的简短对话*]/很好,看来我们确实需要你。这很危险,你可能会死,但如果你完成了它,我们将允许你有限地使用我们的资源。" #: lang/json/mission_def_from_json.py msgid "" @@ -87373,6 +87402,7 @@ msgid "" "Investigate the test and return with her and the prototype. Failing that, " "return with the data recorder that was attached to our prototype." msgstr "" +"我们的一名科学家最近离开实验室,对一个原型机器人进行了实地测试,但未能返回,从此杳无音信。对测试进行调查,并带回她和原型机。如果做不到这一点,请带回我们与原型连接的数据记录器。" #: lang/json/mission_def_from_json.py msgid "We appreciate your help, good luck." @@ -87388,6 +87418,7 @@ msgid "" "WILL kill you. Dr. Prado left the Hub with a handful of EMP grenades, use " "those to disable the robot." msgstr "" +"着如果机器人还在运行,不要试图与它正面对抗,因为它会杀了你。Prado博士离开中心的时候携带着EMP电磁脉冲手榴弹,用这些手榴弹让机器人失去动力。" #: lang/json/mission_def_from_json.py msgid "Don't you have a job to do?" @@ -87405,7 +87436,7 @@ msgstr "根本没用..." #: lang/json/mission_def_from_json.py msgid "Steal a dead man's mind" -msgstr "" +msgstr "窃取一个死者的意识" #: lang/json/mission_def_from_json.py msgid "" @@ -87417,25 +87448,26 @@ msgid "" "valuable knowledge. We want you to travel to the location, make a copy of " "his Bionic Memory Unit, and return it to us." msgstr "" +"当风暴开始时,政府向关键的XEDRA人员发出了疏散命令,并派出了车队来营救他们,我们的人工智能研究负责人也在被召回的人员之列。我们最近发现,当运送他的车队在最初的混乱中遭遇伏击时,他死了,但他的尸体和生化插件可能完好无损,足以让我们提取有价值的知识。我们要你去那个地方,复制一份他的生化插件,然后还给我们。" #: lang/json/mission_def_from_json.py msgid "" "Remember, do extraction /exactly/ as specified, otherwise the bionic will " "self-destruct." -msgstr "" +msgstr "记住,按照指定的方法提取/精确地提取/否则生化插件将自毁。" #: lang/json/mission_def_from_json.py msgid "" "Yes, we recognize that our request is exceptional. Return if you change " "your mind." -msgstr "" +msgstr "是的,我们承认这些要求十分特殊。如果你改变主意再来吧。" #: lang/json/mission_def_from_json.py msgid "" " You do know what a memory unit looks like, right? Matte gray, pill-sized, " "right in front of the corpus callosum. We suggest a forceps through the eye" " socket, shaking slightly, then slowly and carefully..." -msgstr "" +msgstr "你知道记忆装置是什么样子的,对吧?哑光灰色,药丸大小,就在胼胝体前面。我们建议用镊子穿过眼窝,轻轻摇晃,然后慢慢小心地……" #: lang/json/mission_def_from_json.py msgid "Do you have the scan?" @@ -87505,7 +87537,7 @@ msgstr "弄到酵母了吗?" #: lang/json/mission_def_from_json.py msgid "Find 10 Sugar Beet Seeds" -msgstr "收集 10 个甜菜种子" +msgstr "收集 10 份甜菜种子" #: lang/json/mission_def_from_json.py msgid "" @@ -89450,57 +89482,57 @@ msgstr "吸血鬼" msgid "" "Nearby shadows seem to bend towards you for a moment and then reality warps " "back into place." -msgstr "" +msgstr "附近的阴影仿佛向你弯曲了片刻,之后又返回原位。" #. ~ Mutation class: Vampire iv_message #: lang/json/mutation_category_from_json.py msgid "" "You twitch and pant randomly as your desire to slake your thirst becomes " "overwhelming." -msgstr "" +msgstr "你狂乱地抽搐着,喘息着,因为你已被强烈的渴望压倒。" #. ~ Mutation class: Vampire Male memorial messsage #: lang/json/mutation_category_from_json.py msgctxt "memorial_male" msgid "Dispersed into the shadows." -msgstr "" +msgstr "融入阴影。" #. ~ Mutation class: Vampire Female memorial messsage #: lang/json/mutation_category_from_json.py msgctxt "memorial_female" msgid "Dispersed into the shadows." -msgstr "" +msgstr "融入阴影。" #. ~ Mutation class name #: lang/json/mutation_category_from_json.py msgid "Wendigo" -msgstr "" +msgstr "冰心食人魔" #. ~ Mutation class: Wendigo mutagen_message #: lang/json/mutation_category_from_json.py msgid "" "Nearby plants seem to bend towards you for a moment and then they shift back" " into place." -msgstr "" +msgstr "附近的植物似乎向你弯曲了片刻,之后又返回原位。" #. ~ Mutation class: Wendigo iv_message #: lang/json/mutation_category_from_json.py msgid "" "A serene feeling of terror grips you as become acutely aware of the flora " "and fauna beckoning towards you." -msgstr "" +msgstr "你敏锐地意识到动植物在向你招手,一种宁静的恐怖攫住了你。" #. ~ Mutation class: Wendigo Male memorial messsage #: lang/json/mutation_category_from_json.py msgctxt "memorial_male" msgid "Reclaimed by nature." -msgstr "" +msgstr "自然回收。" #. ~ Mutation class: Wendigo Female memorial messsage #: lang/json/mutation_category_from_json.py msgctxt "memorial_female" msgid "Reclaimed by nature." -msgstr "" +msgstr "自然回收。" #: lang/json/mutation_from_json.py msgid "Venom Mob Protege" @@ -92062,10 +92094,11 @@ msgid "" "nutrition while in sunlight when your head is uncovered. Slightly reduces " "wet effects." msgstr "" +"你的秀发转变成了一蓬绿油油的藤蔓,上面长满了绿叶。除了样子很令人瞩目之外,当你处于阳光照射下时,它还能够通过光合作用给你提供一定的营养。稍微减少湿身心情惩罚。" #: lang/json/mutation_from_json.py msgid "Lush Leaves" -msgstr "" +msgstr "茂密青叶" #. ~ Description for Lush Leaves #: lang/json/mutation_from_json.py @@ -92073,11 +92106,11 @@ msgid "" "Your leaves have grown in size and prominence, with additional leaves " "sprouting along your arms. While your arms and head are uncovered, you will " "photosynthesize additional nutrients while in sunlight. Reduces wet effects." -msgstr "" +msgstr "你的叶子已经长大了,而且非常突出,更多的叶子在你的手臂上发芽。当你的手臂和头部被暴露在光合作用下会产生额外的营养。减少湿身心情惩罚。" #: lang/json/mutation_from_json.py msgid "Verdant Leaves" -msgstr "" +msgstr "青翠之叶" #. ~ Description for Verdant Leaves #: lang/json/mutation_from_json.py @@ -92086,18 +92119,18 @@ msgid "" "nutrition for your body. Whenever your arms and head are uncovered you will " "gain a large amount of nutrition by standing in the sunlight. Reduces wet " "effects." -msgstr "" +msgstr "你的叶子生机勃勃,又大又绿,它已经成为你身体营养的主要来源。无论何时,只要你的手臂和头部暴露在阳光下就会获得大量的营养。减少湿身心情惩罚。" #: lang/json/mutation_from_json.py msgid "Transpiration" -msgstr "" +msgstr "蒸腾作用" #. ~ Description for Transpiration #: lang/json/mutation_from_json.py msgid "" "You body has begun moving nutrients via the evaporation of water. This " "increases your thrist when it's hot, but reduces it when it's cold." -msgstr "" +msgstr "你的身体已经开始通过水分的蒸发转移营养物质。热的时候增加你的活力,冷的时候减少。" #: lang/json/mutation_from_json.py msgid "Flowering" @@ -95440,7 +95473,7 @@ msgstr "幻觉" #: lang/json/mutation_from_json.py msgid "" "NPC trait that makes them be hallucination. It is a bug if you have it." -msgstr "" +msgstr "NPC专用特征:使他们产生幻觉。如果你有的话,那就是个bug。" #: lang/json/mutation_from_json.py msgid "Debug Vision" @@ -95585,7 +95618,7 @@ msgstr "马卡斯之友" #. ~ Description for mycus friend #: lang/json/mutation_from_json.py msgid "NPC trait that makes fungaloid monsters see this NPC as a friend." -msgstr "" +msgstr "NPC专用特征:使真菌怪物把这个NPC视为朋友。" #: lang/json/mutation_from_json.py msgid "mute" @@ -96084,14 +96117,14 @@ msgstr "基因缺陷使你的身体变得异常强壮。力量+7。" #: lang/json/mutation_from_json.py msgid "C.R.I.T Melee Training" -msgstr "" +msgstr "C.R.I.T近战训练" #. ~ Description for C.R.I.T Melee Training #: lang/json/mutation_from_json.py msgid "" "You have received some defensive training. For every hit you land, gain " "various miniscule combat bonuses that scale off of your stats." -msgstr "" +msgstr "你接受过一些防身训练,你每次命中都可以获得各种微小的战斗奖励,取决于你的各种属性。" #: lang/json/mutation_from_json.py msgid "Shadow Meld" @@ -96260,7 +96293,7 @@ msgstr "你的存在被大自然掩盖了,你很难被察觉。" #: lang/json/mutation_from_json.py msgid "Slashers" -msgstr "" +msgstr "锋行者" #. ~ Description for Slashers #: lang/json/mutation_from_json.py @@ -96268,7 +96301,7 @@ msgid "" "Your torso has an extra set of appendages that have burst out of your back, " "they are tipped with massive bone blades at the end, and look like they can " "do some serious damage with the thick acid that they secrete." -msgstr "" +msgstr "你的躯干上伸出一组附肢,它从你的背后迸出,末端长有巨大的骨刃,可以用它们以及其上分泌的酸液造成恐怖的伤害。" #: lang/json/mutation_from_json.py #, no-python-format @@ -96282,14 +96315,14 @@ msgstr "%1$s 用刀刃撕裂了 %2$s" #: lang/json/mutation_from_json.py msgid "Künstler" -msgstr "" +msgstr "机甲武师" #. ~ Description for Künstler #: lang/json/mutation_from_json.py msgid "" "You have lingering memories of training to fight cyborgs and war machines in" " zero gravity using the obscure Panzer Kunst." -msgstr "" +msgstr "你残留了一些武术训练的莫名记忆,改造人与战争机器在零重力环境下对抗,使用一种名为“机甲术”(Panzer Kunst)的战斗技巧。" #: lang/json/mutation_from_json.py msgid "Magus" @@ -96382,7 +96415,7 @@ msgstr "" #: lang/json/mutation_from_json.py msgid "Druid" -msgstr "德鲁伊特" +msgstr "德鲁伊" #. ~ Description for Druid #: lang/json/mutation_from_json.py @@ -96390,7 +96423,7 @@ msgid "" "Druids follow a wild tradition of allegiance and rebirth within the world of" " nature, especially the cycle of death and rebirth that is the plant world." " A powerful druid is as much a part of that world as the human one." -msgstr "德鲁伊特在自然界中遵循一种狂热的忠诚和重生的传统,特别是植物界的死亡和重生周期。强大的德鲁伊特和人类一样是这个世界的一部分。" +msgstr "德鲁伊在自然界中遵循一种狂热的忠诚和重生的传统,特别是植物界的死亡和重生周期。强大的德鲁伊和人类一样是这个世界的一部分。" #: lang/json/mutation_from_json.py msgid "Lesser Mana Efficiency" @@ -96399,7 +96432,7 @@ msgstr "次等魔力容纳" #. ~ Description for Lesser Mana Efficiency #: lang/json/mutation_from_json.py msgid "You are able to store a little more mana in your body than usual." -msgstr "你可以在你的身体里储存比正常略多的法力。" +msgstr "你可以在你的身体里储存比正常略多的魔力。" #: lang/json/mutation_from_json.py msgid "Mana Efficiency" @@ -96408,7 +96441,7 @@ msgstr "中等魔力容纳" #. ~ Description for Mana Efficiency #: lang/json/mutation_from_json.py msgid "You are able to store more mana in your body than usual." -msgstr "你可以在你的身体里储存比正常多的法力。" +msgstr "你可以在你的身体里储存比正常多的魔力。" #: lang/json/mutation_from_json.py msgid "Greater Mana Efficiency" @@ -96417,7 +96450,7 @@ msgstr "高等魔力容纳" #. ~ Description for Greater Mana Efficiency #: lang/json/mutation_from_json.py msgid "You are able to store a lot more mana in your body than usual." -msgstr "你可以在你的身体里储存比正常多很多的法力。" +msgstr "你可以在你的身体里储存比正常多很多的魔力。" #: lang/json/mutation_from_json.py msgid "Lesser Mana Inefficiency" @@ -96426,7 +96459,7 @@ msgstr "较低魔力容纳" #. ~ Description for Lesser Mana Inefficiency #: lang/json/mutation_from_json.py msgid "You are able to store a little less mana in your body than usual." -msgstr "你的身体里储存的法力比正常略少。" +msgstr "你的身体里储存的魔力比正常略少。" #: lang/json/mutation_from_json.py msgid "Mana Inefficiency" @@ -96435,7 +96468,7 @@ msgstr "低效魔力容纳" #. ~ Description for Mana Inefficiency #: lang/json/mutation_from_json.py msgid "You are able to store less mana in your body than usual." -msgstr "你的身体里储存的法力比正常少。" +msgstr "你的身体里储存的魔力比正常少。" #: lang/json/mutation_from_json.py msgid "Greater Mana Inefficiency" @@ -96444,7 +96477,7 @@ msgstr "极低魔力容纳" #. ~ Description for Greater Mana Inefficiency #: lang/json/mutation_from_json.py msgid "You are able to store a lot less mana in your body than usual." -msgstr "你的身体里储存的法力比正常少很多。" +msgstr "你的身体里储存的魔力比正常少很多。" #: lang/json/mutation_from_json.py msgid "Lesser Mana Regeneration" @@ -96453,7 +96486,7 @@ msgstr "次等魔力再生" #. ~ Description for Lesser Mana Regeneration #: lang/json/mutation_from_json.py msgid "Your natural mana regeneration is slightly faster than normal." -msgstr "你的自然法力再生比正常速度稍快。" +msgstr "你的自然魔力再生比正常速度稍快。" #: lang/json/mutation_from_json.py msgid "Mana Regeneration" @@ -96462,7 +96495,7 @@ msgstr "中等魔力再生" #. ~ Description for Mana Regeneration #: lang/json/mutation_from_json.py msgid "Your natural mana regeneration is faster than normal." -msgstr "你的自然法力再生比正常速度快。" +msgstr "你的自然魔力再生比正常速度快。" #: lang/json/mutation_from_json.py msgid "Greater Mana Regeneration" @@ -96471,7 +96504,7 @@ msgstr "高等魔力再生" #. ~ Description for Greater Mana Regeneration #: lang/json/mutation_from_json.py msgid "Your natural mana regeneration is much faster than normal." -msgstr "你的自然法力再生比正常快很多。" +msgstr "你的自然魔力再生比正常快很多。" #: lang/json/mutation_from_json.py msgid "Poor Mana Regeneration" @@ -96480,7 +96513,7 @@ msgstr "缓慢魔力再生" #. ~ Description for Poor Mana Regeneration #: lang/json/mutation_from_json.py msgid "Your natural mana regeneration is slightly slower than normal." -msgstr "你的自然法力再生比正常速度稍慢。" +msgstr "你的自然魔力再生比正常速度稍慢。" #: lang/json/mutation_from_json.py msgid "Very Poor Mana Regeneration" @@ -96489,7 +96522,7 @@ msgstr "慢速魔力再生" #. ~ Description for Very Poor Mana Regeneration #: lang/json/mutation_from_json.py msgid "Your natural mana regeneration is slower than normal." -msgstr "你的自然法力再生比正常速度慢。" +msgstr "你的自然魔力再生比正常速度慢。" #: lang/json/mutation_from_json.py msgid "Abysmal Mana Regeneration" @@ -96498,44 +96531,44 @@ msgstr "极慢魔力再生" #. ~ Description for Abysmal Mana Regeneration #: lang/json/mutation_from_json.py msgid "Your natural mana regeneration is much slower than normal." -msgstr "你的自然法力再生比正常要慢很多。" +msgstr "你的自然魔力再生比正常要慢很多。" #: lang/json/mutation_from_json.py msgid "Lesser Mana Sensitivity" -msgstr "" +msgstr "次等魔力敏感" #. ~ Description for Lesser Mana Sensitivity #: lang/json/mutation_from_json.py msgid "" "You can sense the mana in your body slightly better than normal, allowing " "you to tap into more of your reserves." -msgstr "" +msgstr "你可以感觉到你体内的魔力比正常情况更好一些,现在你可以利用更多的储备。" #: lang/json/mutation_from_json.py msgid "Mana Sensitivity" -msgstr "" +msgstr "魔力敏感" #. ~ Description for Mana Sensitivity #: lang/json/mutation_from_json.py msgid "" "You can sense the mana in your body better than normal, allowing you to tap " "into more of your reserves." -msgstr "" +msgstr "你可以比正常情况下更好地感觉到你体内的魔力,现在你获得更多的储备。" #: lang/json/mutation_from_json.py msgid "Greater Mana Sensitivity" -msgstr "" +msgstr "高等魔力敏感" #. ~ Description for Greater Mana Sensitivity #: lang/json/mutation_from_json.py msgid "" "You can sense the mana in your body much better than normal, allowing you to" " tap into more of your reserves." -msgstr "" +msgstr "你可以感觉到你体内的魔力比正常情况下要好得多,现在你可以获得更多的储备。" #: lang/json/mutation_from_json.py msgid "Poor Mana Sensitivity" -msgstr "" +msgstr "低等魔力敏感" #. ~ Description for Poor Mana Sensitivity #. ~ Description for Very Poor Mana Sensitivity @@ -96544,15 +96577,15 @@ msgstr "" msgid "" "You have a hard time sensing the mana in your body, making less of your " "reserves available for use." -msgstr "" +msgstr "你很难感觉到你体内的法力,减少你的储备上限。" #: lang/json/mutation_from_json.py msgid "Very Poor Mana Sensitivity" -msgstr "" +msgstr "劣等魔力敏感" #: lang/json/mutation_from_json.py msgid "Abysmal Mana Sensitivity" -msgstr "" +msgstr "拙等魔力敏感" #. ~ Description for Melee Weapon Training #: lang/json/mutation_from_json.py @@ -96633,7 +96666,7 @@ msgstr "马洛斯之声" #: lang/json/npc_class_from_json.py msgid "I spread the Hymns so that peace and unity return to our world." -msgstr "我传播圣歌,使和平与统一回归我们的世界。" +msgstr "吾辈传播圣歌,使和平与统一回归吾辈之世界。" #: lang/json/npc_class_from_json.py msgid "Scientist" @@ -96762,11 +96795,11 @@ msgstr "如果你看到这个,那么你遇到一个BUG。" #: lang/json/npc_class_from_json.py msgid "Caravaneer" -msgstr "" +msgstr "商队老板" #: lang/json/npc_class_from_json.py msgid "I'm the owner of a trade caravan." -msgstr "" +msgstr "我是商队的老板。" #: lang/json/npc_class_from_json.py lang/json/npc_from_json.py #: lang/json/npc_from_json.py @@ -97033,11 +97066,11 @@ msgstr "乞丐" #: lang/json/npc_from_json.py msgid "Reena Sandhu" -msgstr "丽娜 桑德" +msgstr "丽娜·桑德" #: lang/json/npc_from_json.py msgid "Dino Dave" -msgstr "迪诺 戴夫" +msgstr "迪诺·戴夫" #: lang/json/npc_from_json.py msgid "Luo Meizhen" @@ -97045,11 +97078,11 @@ msgstr "罗美珍" #: lang/json/npc_from_json.py msgid "Brandon Garder" -msgstr "布兰顿 贾德尔" +msgstr "布兰顿·贾德尔" #: lang/json/npc_from_json.py msgid "Yusuke Taylor" -msgstr "雄介 泰勒" +msgstr "雄介·泰勒" #: lang/json/npc_from_json.py msgid "refugee" @@ -97057,7 +97090,7 @@ msgstr "难民" #: lang/json/npc_from_json.py msgid "Aleesha Seward" -msgstr "阿莱莎 苏厄德" +msgstr "阿莱莎·苏厄德" #: lang/json/npc_from_json.py msgid "Alonso Lautrec" @@ -97065,11 +97098,11 @@ msgstr "阿隆索•劳特雷克" #: lang/json/npc_from_json.py msgid "Boris Borichenko" -msgstr "鲍里斯 波里申科" +msgstr "鲍里斯·波里申科" #: lang/json/npc_from_json.py msgid "Dana Nunez" -msgstr "达娜 努涅斯" +msgstr "达娜·努涅斯" #: lang/json/npc_from_json.py msgid "Draco Dune" @@ -97077,7 +97110,7 @@ msgstr "德拉科•杜恩" #: lang/json/npc_from_json.py msgid "Fatima al Jadir" -msgstr "" +msgstr "法蒂玛·贾迪尔" #: lang/json/npc_from_json.py msgid "Garry Villeneuve" @@ -97089,7 +97122,7 @@ msgstr "甘尼特•辛格" #: lang/json/npc_from_json.py msgid "Jenny Forcette" -msgstr "珍妮 福斯特" +msgstr "珍妮·福斯特" #: lang/json/npc_from_json.py msgid "John Clemens" @@ -97105,23 +97138,23 @@ msgstr "曼高普里特•辛格" #: lang/json/npc_from_json.py msgid "Pablo Nunez" -msgstr "巴勃罗 努涅斯" +msgstr "巴勃罗·努涅斯" #: lang/json/npc_from_json.py msgid "Rhyzaea Johnny" -msgstr "" +msgstr "莱泽尔·约翰尼" #: lang/json/npc_from_json.py msgid "Stan Borichenko" -msgstr "斯坦 波里申科" +msgstr "斯坦·波里申科" #: lang/json/npc_from_json.py msgid "Uyen Tran" -msgstr "" +msgstr "陈宛" #: lang/json/npc_from_json.py msgid "Vanessa Toby" -msgstr "瓦内萨 托比" +msgstr "瓦内萨·托比" #: lang/json/npc_from_json.py msgid "Broker" @@ -97133,7 +97166,7 @@ msgstr "守卫" #: lang/json/npc_from_json.py msgid "Makayla Sanchez" -msgstr "马卡拉桑切斯" +msgstr "马卡拉·桑切斯" #: lang/json/npc_from_json.py msgid "Representative" @@ -97689,7 +97722,7 @@ msgstr "辐照厂" #: lang/json/overmap_terrain_from_json.py msgid "generic_cropland" -msgstr "generic_cropland" +msgstr "通用_农田" #: lang/json/overmap_terrain_from_json.py msgid "generic_pasture" @@ -97709,19 +97742,19 @@ msgstr "普通矿区" #: lang/json/overmap_terrain_from_json.py msgid "generic_open_land" -msgstr "generic_open_land" +msgstr "通用_开放_土地" #: lang/json/overmap_terrain_from_json.py msgid "generic_recreation_participation" -msgstr "generic_recreation_participation" +msgstr "通用_娱乐_参与" #: lang/json/overmap_terrain_from_json.py msgid "generic_recreation_spectator" -msgstr "generic_recreation_spectator" +msgstr "通用_娱乐_观众" #: lang/json/overmap_terrain_from_json.py msgid "generic_recreation_water" -msgstr "generic_recreation_water" +msgstr "通用_娱乐_水" #: lang/json/overmap_terrain_from_json.py msgid "generic_residential_multi" @@ -97930,19 +97963,19 @@ msgstr "筒仓" #: lang/json/overmap_terrain_from_json.py msgid "campus commons building" -msgstr "" +msgstr "校园公共建筑" #: lang/json/overmap_terrain_from_json.py msgid "campus commons roof" -msgstr "" +msgstr "校园公共建筑屋顶" #: lang/json/overmap_terrain_from_json.py msgid "campus lecture hall" -msgstr "" +msgstr "校园大讲堂" #: lang/json/overmap_terrain_from_json.py msgid "campus lecture hall roof" -msgstr "" +msgstr "校园大讲堂屋顶" #: lang/json/overmap_terrain_from_json.py msgid "gas station" @@ -99216,11 +99249,11 @@ msgstr "河岸" #: lang/json/overmap_terrain_from_json.py msgid "hub 01" -msgstr "" +msgstr "hub 01" #: lang/json/overmap_terrain_from_json.py msgid "hub 01 parking space" -msgstr "" +msgstr "hub 01 停车位" #: lang/json/overmap_terrain_from_json.py msgid "highway" @@ -102868,7 +102901,7 @@ msgstr "" #: lang/json/professions_from_json.py msgctxt "profession_male" msgid "Naturalist" -msgstr "自然主义生父" +msgstr "自然主义圣父" #. ~ Profession (male Naturalist) description #: lang/json/professions_from_json.py @@ -102877,7 +102910,7 @@ msgid "" "You have come to an understanding with Mother Nature over long years of " "self-imposed exile in the wilderness. The world as they knew it might have " "ended for your forsaken species, but you can hardly tell the difference." -msgstr "在野外历经长年的自我流放式的生活, 你已经和自然妈妈达成一致。这个原属于被抛弃的人类的世界可能已经完蛋了,但是对你而言却依如昨日。" +msgstr "在野外历经长年的自我流放式的生活, 你已经和自然之母达成一致。这个原属于被抛弃的人类的世界可能已经完蛋了,但是对你而言却依如昨日。" #: lang/json/professions_from_json.py msgctxt "profession_female" @@ -102891,7 +102924,7 @@ msgid "" "You have come to an understanding with Mother Nature over long years of " "self-imposed exile in the wilderness. The world as they knew it might have " "ended for your forsaken species, but you can hardly tell the difference." -msgstr "在野外历经长年的自我流放式的生活, 你已经和自然妈妈达成一致。这个原属于被抛弃的人类的世界可能已经完蛋了,但是对你而言却依如昨日。" +msgstr "在野外历经长年的自我流放式的生活, 你已经和自然之母达成一致。这个原属于被抛弃的人类的世界可能已经完蛋了,但是对你而言却依如昨日。" #: lang/json/professions_from_json.py msgctxt "profession_male" @@ -103725,7 +103758,7 @@ msgid "" "but your knowledge of the inner workings of 87% of the world's servers " "might." msgstr "" -"你在使用Linux的环境下长大,从Gentoo和一堆软件包中破解了你自己的操作系统,还发起了开源运动,把它视为一项基本的人权。这些事情在大灾变中不重要,但是你对87%的服务器内部原理的了解可能会有帮助。" +"你在使用Linux的环境下长大,从Gentoo和一堆软件包中修改出了你自己的操作系统,还参与了开源运动,把它视为一项基本的人权。这些事情在大灾变中不重要,但是你对世界上87%的服务器内部原理的了解可能会有帮助。" #: lang/json/professions_from_json.py msgctxt "profession_female" @@ -103743,7 +103776,7 @@ msgid "" "but your knowledge of the inner workings of 87% of the world's servers " "might." msgstr "" -"你在使用Linux的环境下长大,从Gentoo和一堆软件包中破解了你自己的操作系统,还发起了开源运动,把它视为一项基本的人权。这些事情在大灾变中不重要,但是你对87%的服务器内部原理的了解可能会有帮助。" +"你在使用Linux的环境下长大,从Gentoo和一堆软件包中修改出了你自己的操作系统,还参与了开源运动,把它视为一项基本的人权。这些事情在大灾变中不重要,但是你对世界上87%的服务器内部原理的了解可能会有帮助。" #: lang/json/professions_from_json.py msgctxt "profession_male" @@ -104058,7 +104091,7 @@ msgstr "你在一家富有的公司担任高级职位,赚到了大多数人都 #: lang/json/professions_from_json.py msgctxt "profession_male" msgid "C.R.I.T ROTC Member" -msgstr "" +msgstr "C.R.I.T 预备役军官" #. ~ Profession (male C.R.I.T ROTC Member) description #: lang/json/professions_from_json.py @@ -104071,11 +104104,12 @@ msgid "" "remnants of your friends. Now it's up to your wits and years of training to " "keep you alive in this Cataclysm." msgstr "" +"你是一名C.R.I.T预备役军官,你正在为即将到来的战争做着训练。当你到达征召令现场时发现现场一片混乱,你的战友们倒在了血泊之中。在一片恐慌中,你抓起你能拿起的东西,开始逃离混乱。现在你要靠你的智慧和多年的训练才能让你在这场灾难中存活下来。" #: lang/json/professions_from_json.py msgctxt "profession_female" msgid "C.R.I.T ROTC Member" -msgstr "" +msgstr "C.R.I.T 预备役军官" #. ~ Profession (female C.R.I.T ROTC Member) description #: lang/json/professions_from_json.py @@ -104088,11 +104122,12 @@ msgid "" "remnants of your friends. Now it's up to your wits and years of training to " "keep you alive in this Cataclysm." msgstr "" +"你是一名C.R.I.T预备役军官,你正在为即将到来的战争做着训练。当你到达征召令现场时发现现场一片混乱,你的战友们倒在了血泊之中。在一片恐慌中,你抓起你能拿起的东西,开始逃离混乱。现在你要靠你的智慧和多年的训练才能让你在这场灾难中存活下来。" #: lang/json/professions_from_json.py msgctxt "profession_male" msgid "C.R.I.T Janitor" -msgstr "C.R.I.T清洁工" +msgstr "C.R.I.T 清洁工" #. ~ Profession (male C.R.I.T Janitor) description #: lang/json/professions_from_json.py @@ -104110,7 +104145,7 @@ msgstr "" #: lang/json/professions_from_json.py msgctxt "profession_female" msgid "C.R.I.T Janitor" -msgstr "C.R.I.T清洁工" +msgstr "C.R.I.T 清洁工" #. ~ Profession (female C.R.I.T Janitor) description #: lang/json/professions_from_json.py @@ -104128,7 +104163,7 @@ msgstr "" #: lang/json/professions_from_json.py msgctxt "profession_male" msgid "C.R.I.T NCO" -msgstr "" +msgstr "C.R.I.T 士官" #. ~ Profession (male C.R.I.T NCO) description #: lang/json/professions_from_json.py @@ -104137,12 +104172,12 @@ msgid "" "You were a senior NCO, relaying orders to your squad was an everyday task. " "When the cataclysm struck, your expertise helped save everyone time and time" " again until it all fell to chaos." -msgstr "" +msgstr "你是一名高级士官,曾经向小队下达命令是你的日常任务。当灾难发生时,你的专业知识帮助你一次又一次地拯救每个人,直到一切陷入混乱。" #: lang/json/professions_from_json.py msgctxt "profession_female" msgid "C.R.I.T NCO" -msgstr "" +msgstr "C.R.I.T 士官" #. ~ Profession (female C.R.I.T NCO) description #: lang/json/professions_from_json.py @@ -104151,12 +104186,12 @@ msgid "" "You were a senior NCO, relaying orders to your squad was an everyday task. " "When the cataclysm struck, your expertise helped save everyone time and time" " again until it all fell to chaos." -msgstr "" +msgstr "你是一名高级士官,曾经向小队下达命令是你的日常任务。当灾难发生时,你的专业知识帮助你一次又一次地拯救每个人,直到一切陷入混乱。" #: lang/json/professions_from_json.py msgctxt "profession_male" msgid "C.R.I.T Grunt" -msgstr "" +msgstr "C.R.I.T 步兵" #. ~ Profession (male C.R.I.T Grunt) description #: lang/json/professions_from_json.py @@ -104169,11 +104204,13 @@ msgid "" "abominations arived. Now alone and fleeing, will you have what it takes to " "survive or is this hellish landcape just a macabre metaphor of death's row?" msgstr "" +"你是一名C.R.I.T " +"步兵,你在训练之中奔跑,清理作战基地,然后回来与你的战友们一起休息。但当大灾变发生以后,那些美好的日子就小时了。受感染的人像湿纸一样撕破你的字里行间,而另一个世界的可憎之物正在变异。现在你孤身一人,四处逃难,你还能活下来吗?" #: lang/json/professions_from_json.py msgctxt "profession_female" msgid "C.R.I.T Grunt" -msgstr "" +msgstr "C.R.I.T 步兵" #. ~ Profession (female C.R.I.T Grunt) description #: lang/json/professions_from_json.py @@ -104186,11 +104223,13 @@ msgid "" "abominations arived. Now alone and fleeing, will you have what it takes to " "survive or is this hellish landcape just a macabre metaphor of death's row?" msgstr "" +"你是一名C.R.I.T " +"步兵,你在训练之中奔跑,清理作战基地,然后回来与你的战友们一起休息。但当大灾变发生以后,那些美好的日子就小时了。受感染的人像湿纸一样撕破你的字里行间,而另一个世界的可憎之物正在变异。现在你孤身一人,四处逃难,你还能活下来吗?" #: lang/json/professions_from_json.py msgctxt "profession_male" msgid "C.R.I.T Combat Medic" -msgstr "" +msgstr "C.R.I.T 战地医生" #. ~ Profession (male C.R.I.T Combat Medic) description #: lang/json/professions_from_json.py @@ -104204,11 +104243,12 @@ msgid "" " overtaken. Forced to flee without your comrades in tow, will you have what " "it takes to survive or will your unforgivable sin come back to haunt you?" msgstr "" +"你是一名战地医生,非常擅长对付异常情况。一直以来,你的主要任务就是让你的战友们安然无恙。几个星期以来,你穿过地狱,然后回来确保这次任务圆满完成。在一场不死丧尸和恶意人工智能之间的单边交火中,你被选中并被追上。被迫在没有同伴的情况下逃跑,你会得到生存所需要的东西。" #: lang/json/professions_from_json.py msgctxt "profession_female" msgid "C.R.I.T Combat Medic" -msgstr "" +msgstr "C.R.I.T 战地医生" #. ~ Profession (female C.R.I.T Combat Medic) description #: lang/json/professions_from_json.py @@ -104222,11 +104262,12 @@ msgid "" " overtaken. Forced to flee without your comrades in tow, will you have what " "it takes to survive or will your unforgivable sin come back to haunt you?" msgstr "" +"你是一名战地医生,非常擅长对付异常情况。一直以来,你的主要任务就是让你的战友们安然无恙。几个星期以来,你穿过地狱,然后回来确保这次任务圆满完成。在一场丧尸和恶意人工智能之间的单边交火中,你被选中并被追上。被迫在没有同伴的情况下逃跑,你会得到生存所需要的东西。" #: lang/json/professions_from_json.py msgctxt "profession_male" msgid "C.R.I.T Automatic Rifleman" -msgstr "" +msgstr "C.R.I.T 机枪兵" #. ~ Profession (male C.R.I.T Automatic Rifleman) description #: lang/json/professions_from_json.py @@ -104238,11 +104279,12 @@ msgid "" "alone and fleeing, will you have what it takes to survive or is this hellish" " landcape something you just can't suppress?" msgstr "" +"是你一名火力压制机枪兵,在大灾变发生时,你被指派前往死亡区域进行战斗。的那是你那值得信赖的M240无法阻止真正的不死亡灵大军冲破你小队的封锁线。现在你被迫一人进行逃亡,你会活下去或者还是沉沦在这地狱般的土地上呢?" #: lang/json/professions_from_json.py msgctxt "profession_female" msgid "C.R.I.T Automatic Rifleman" -msgstr "" +msgstr "C.R.I.T 机枪兵" #. ~ Profession (female C.R.I.T Automatic Rifleman) description #: lang/json/professions_from_json.py @@ -104254,11 +104296,12 @@ msgid "" "alone and fleeing, will you have what it takes to survive or is this hellish" " landcape something you just can't suppress?" msgstr "" +"是你一名火力压制机枪兵,在大灾变发生时,你被指派前往死亡区域进行战斗。的那是你那值得信赖的M240无法阻止真正的不死亡灵大军冲破你小队的封锁线。现在你被迫一人进行逃亡,你会活下去或者还是沉沦在这地狱般的土地上呢?" #: lang/json/professions_from_json.py msgctxt "profession_male" msgid "C.R.I.T Commanding Officer" -msgstr "" +msgstr "C.R.I.T 指挥官" #. ~ Profession (male C.R.I.T Commanding Officer) description #: lang/json/professions_from_json.py @@ -104269,11 +104312,12 @@ msgid "" "climb up the ranks and provide support to allies in need. Now that " "everything went down the drain, will it help you again?" msgstr "" +"作为一名顶级的指挥官,除了你喜欢战斗的时候,你并没有看到太多战斗的方式。但你的个人魅力和敏锐的才智帮助你晋升,并为有需要的盟友提供支持。既然一切都白费了,它还会对你有帮助吗?" #: lang/json/professions_from_json.py msgctxt "profession_female" msgid "C.R.I.T Commanding Officer" -msgstr "" +msgstr "C.R.I.T 指挥官" #. ~ Profession (female C.R.I.T Commanding Officer) description #: lang/json/professions_from_json.py @@ -104284,11 +104328,12 @@ msgid "" "climb up the ranks and provide support to allies in need. Now that " "everything went down the drain, will it help you again?" msgstr "" +"作为一名顶级的指挥官,除了你喜欢战斗的时候,你并没有看到太多战斗的方式。但你的个人魅力和敏锐的才智帮助你晋升,并为有需要的盟友提供支持。既然一切都白费了,它还会对你有帮助吗?" #: lang/json/professions_from_json.py msgctxt "profession_male" msgid "C.R.I.T Enforcer" -msgstr "" +msgstr "C.R.I.T 执法者" #. ~ Profession (male C.R.I.T Enforcer) description #: lang/json/professions_from_json.py @@ -104303,11 +104348,12 @@ msgid "" "serving as a \"guard\" forever. Time to do your job, albeit mission " "parameters look like they've expanded quite a bit." msgstr "" +"你是一名被元帅授予了美军权力的警卫。其他人拿你开玩笑,说你只不过是一个戴着花哨徽章的商场警察。你一笑置之,因为他们只是嫉妒你,因为你一直在基地进行卧底。你基地花费了大量时间磨练你的技能,得到了特殊的生化插件,同时更加轻松的扮演者一名警卫的身份。现在是时候做你的本事工作了,尽管任务范围看起来已经扩展了很多。" #: lang/json/professions_from_json.py msgctxt "profession_female" msgid "C.R.I.T Enforcer" -msgstr "" +msgstr "C.R.I.T 执法者" #. ~ Profession (female C.R.I.T Enforcer) description #: lang/json/professions_from_json.py @@ -104322,11 +104368,12 @@ msgid "" "serving as a \"guard\" forever. Time to do your job, albeit mission " "parameters look like they've expanded quite a bit." msgstr "" +"你是一名被元帅授予了美军权力的警卫。其他人拿你开玩笑,说你只不过是一个戴着花哨徽章的商场警察。你一笑置之,因为他们只是嫉妒你,因为你一直在基地进行卧底。你基地花费了大量时间磨练你的技能,得到了特殊的生化插件,同时更加轻松的扮演者一名警卫的身份。现在是时候做你的本事工作了,尽管任务范围看起来已经扩展了很多。" #: lang/json/professions_from_json.py msgctxt "profession_male" msgid "C.R.I.T Lone Wolf" -msgstr "" +msgstr "C.R.I.T 孤狼" #. ~ Profession (male C.R.I.T Lone Wolf) description #: lang/json/professions_from_json.py @@ -104337,11 +104384,12 @@ msgid "" "you stalked into a warzone and laid out entire battalions by yourself, be it" " through cunning strategy or brute force. Time to hang them all." msgstr "" +"你是一个全副武装的恶棍,拥有元帅的全部权力。作为一支能够处理任何事情的单兵部队,你昂首阔步地进入一个战区,独自部署了整个营地,无论是通过狡猾的策略还是蛮力。是时候把他们全部吊死了。" #: lang/json/professions_from_json.py msgctxt "profession_female" msgid "C.R.I.T Lone Wolf" -msgstr "" +msgstr "C.R.I.T 孤狼" #. ~ Profession (female C.R.I.T Lone Wolf) description #: lang/json/professions_from_json.py @@ -104352,11 +104400,12 @@ msgid "" "you stalked into a warzone and laid out entire battalions by yourself, be it" " through cunning strategy or brute force. Time to hang them all." msgstr "" +"你是一个全副武装的恶棍,拥有元帅的全部权力。作为一支能够处理任何事情的单兵部队,你昂首阔步地进入一个战区,独自部署了整个影帝,无论是通过狡猾的策略还是蛮力。是时候把他们全部吊死了。" #: lang/json/professions_from_json.py msgctxt "profession_male" msgid "C.R.I.T Spec Ops" -msgstr "" +msgstr "C.R.I.T 特种部队" #. ~ Profession (male C.R.I.T Spec Ops) description #: lang/json/professions_from_json.py @@ -104369,11 +104418,12 @@ msgid "" "England region, ground zero, to contain the impending outbreak and gain " "information to relay back to command. Good luck soldier." msgstr "" +"你是灾难应对/研究和调查小组的精英成员,一个隐现的幽灵,对世俗的威胁作出反应,这让你们的郭嘉在其他世界强国面前领先数十年。你的小队是第一个被部署到新英格兰地区,在着陆点遏制即将爆发的疫情,获得信息并反馈给指挥官。祝你好运,士兵。" #: lang/json/professions_from_json.py msgctxt "profession_female" msgid "C.R.I.T Spec Ops" -msgstr "" +msgstr "C.R.I.T 特种部队" #. ~ Profession (female C.R.I.T Spec Ops) description #: lang/json/professions_from_json.py @@ -104386,11 +104436,12 @@ msgid "" "England region, ground zero, to contain the impending outbreak and gain " "information to relay back to command. Good luck soldier." msgstr "" +"你是灾难应对/研究和调查小组的精英成员,一个隐现的幽灵,对世俗的威胁作出反应,这让你们的郭嘉在其他世界强国面前领先数十年。你的小队是第一个被部署到新英格兰地区,在着陆点遏制即将爆发的疫情,获得信息并反馈给指挥官。祝你好运,士兵。" #: lang/json/professions_from_json.py msgctxt "profession_male" msgid "C.R.I.T Survivalist" -msgstr "" +msgstr "C.R.I.T 生存专家" #. ~ Profession (male C.R.I.T Survivalist) description #: lang/json/professions_from_json.py @@ -104408,11 +104459,12 @@ msgid "" "so cheers. Staying away from drinks might be a good idea; at least you got " "some real tools this time!" msgstr "" +"你是一名C.R.I.T的精英侦察员,你被誉为顶级的生存专家,在被困在敌后数周,只能靠一些石头、树枝和植物也能生存下去。然而,在当地的酒吧喝了几杯酒后,和你的一个指挥官打了一架(把他们打晕了),你被剥夺了军衔,带着你现在的装备被送到森林里去接受生存考验。正当你在森林里面寻找营地时,你的收音机响了,有人告诉你,世界突然要毁灭了。所以,没有人有时间去接你,可怜的人,下次记得远离饮酒。这次,你真的得靠自己了。" #: lang/json/professions_from_json.py msgctxt "profession_female" msgid "C.R.I.T Survivalist" -msgstr "" +msgstr "C.R.I.T 生存专家" #. ~ Profession (female C.R.I.T Survivalist) description #: lang/json/professions_from_json.py @@ -104430,11 +104482,12 @@ msgid "" "so cheers. Staying away from drinks might be a good idea; at least you got " "some real tools this time!" msgstr "" +"你是一名C.R.I.T的精英侦察员,你被誉为顶级的生存专家,在被困在敌后数周,只能靠一些石头、树枝和植物也能生存下去。然而,在当地的酒吧喝了几杯酒后,和你的一个指挥官打了一架(把他们打晕了),你被剥夺了军衔,带着你现在的装备被送到森林里去接受生存考验。正当你在森林里面寻找营地时,你的收音机响了,有人告诉你,世界突然要毁灭了。所以,没有人有时间去接你,可怜的人,下次记得远离饮酒。这次,你真的得靠自己了。" #: lang/json/professions_from_json.py msgctxt "profession_male" msgid "C.R.I.T Recruit" -msgstr "C.R.I.T新兵" +msgstr "C.R.I.T 新兵" #. ~ Profession (male C.R.I.T Recruit) description #: lang/json/professions_from_json.py @@ -104451,7 +104504,7 @@ msgstr "" #: lang/json/professions_from_json.py msgctxt "profession_female" msgid "C.R.I.T Recruit" -msgstr "C.R.I.T新兵" +msgstr "C.R.I.T 新兵" #. ~ Profession (female C.R.I.T Recruit) description #: lang/json/professions_from_json.py @@ -104468,7 +104521,7 @@ msgstr "" #: lang/json/professions_from_json.py msgctxt "profession_male" msgid "C.R.I.T Employee" -msgstr "C.R.I.T雇佣兵" +msgstr "C.R.I.T 雇佣兵" #. ~ Profession (male C.R.I.T Employee) description #: lang/json/professions_from_json.py @@ -104488,7 +104541,7 @@ msgstr "" #: lang/json/professions_from_json.py msgctxt "profession_female" msgid "C.R.I.T Employee" -msgstr "C.R.I.T雇佣兵" +msgstr "C.R.I.T 雇佣兵" #. ~ Profession (female C.R.I.T Employee) description #: lang/json/professions_from_json.py @@ -104508,7 +104561,7 @@ msgstr "" #: lang/json/professions_from_json.py msgctxt "profession_male" msgid "C.R.I.T Engineer" -msgstr "" +msgstr "C.R.I.T 工程师" #. ~ Profession (male C.R.I.T Engineer) description #: lang/json/professions_from_json.py @@ -104519,11 +104572,12 @@ msgid "" "Cataclysm broke out, it made it so testing was easier to do, but then again " "nothing seems to making that much sense. Time to bug-out!" msgstr "" +"你被派去修复新英格兰的几个实验室设施,并向其他研究人员展示你们正在研制的新武器。大灾变爆发后,测试变得更容易了,但似乎没有什么意义了。是时候离开了!" #: lang/json/professions_from_json.py msgctxt "profession_female" msgid "C.R.I.T Engineer" -msgstr "" +msgstr "C.R.I.T 工程师" #. ~ Profession (female C.R.I.T Engineer) description #: lang/json/professions_from_json.py @@ -104534,11 +104588,12 @@ msgid "" "Cataclysm broke out, it made it so testing was easier to do, but then again " "nothing seems to making that much sense. Time to bug-out!" msgstr "" +"你被派去修复新英格兰的几个实验室设施,并向其他研究人员展示你们正在研制的新武器。大灾变爆发后,测试变得更容易了,但似乎没有什么意义了。是时候离开了!" #: lang/json/professions_from_json.py msgctxt "profession_male" msgid "C.R.I.T Night Walker" -msgstr "" +msgstr "C.R.I.T 夜行者" #. ~ Profession (male C.R.I.T Night Walker) description #: lang/json/professions_from_json.py @@ -104550,11 +104605,12 @@ msgid "" " was less than perfect, your old flimsy body feels empowered. With the new " "flesh that is now your own, bare your fangs and fight until the next dawn." msgstr "" +"你在新英格兰的基地受到了大灾变的邪恶袭击。然而,作为研发部门的一名顶级研究员,你选择了慢慢地让自己变异,变得不只是人类。即使构思不够完美,你那脆弱的身体也会感到充满力量。用你现在拥有的新肉体,露出你的毒牙,战斗到黎明。" #: lang/json/professions_from_json.py msgctxt "profession_female" msgid "C.R.I.T Night Walker" -msgstr "" +msgstr "C.R.I.T 夜行者" #. ~ Profession (female C.R.I.T Night Walker) description #: lang/json/professions_from_json.py @@ -104566,6 +104622,7 @@ msgid "" " was less than perfect, your old flimsy body feels empowered. With the new " "flesh that is now your own, bare your fangs and fight until the next dawn." msgstr "" +"你在新英格兰的基地受到了大灾变的邪恶袭击。然而,作为研发部门的一名顶级研究员,你选择了慢慢地让自己变异,变得不只是人类。即使构思不够完美,你那脆弱的身体也会感到充满力量。用你现在拥有的新肉体,露出你的毒牙,战斗到黎明。" #: lang/json/professions_from_json.py msgctxt "profession_male" @@ -104624,7 +104681,7 @@ msgstr "战斗天使" #: lang/json/professions_from_json.py msgctxt "prof_desc_male" msgid "A combat-ready cyborg once salvaged from an obscure junkyard..." -msgstr "" +msgstr "一个随时准备战斗的半机械人,从一个不起眼的垃圾场被抢救出来…" #: lang/json/professions_from_json.py msgctxt "profession_female" @@ -104635,7 +104692,7 @@ msgstr "战斗天使" #: lang/json/professions_from_json.py msgctxt "prof_desc_female" msgid "A combat-ready cyborg once salvaged from an obscure junkyard..." -msgstr "" +msgstr "一个随时准备战斗的半机械人,从一个不起眼的垃圾场被抢救出来…" #: lang/json/professions_from_json.py msgctxt "profession_male" @@ -104666,7 +104723,7 @@ msgstr "你发现一本炫丽的魔术师手册,当世界坍塌时,你出奇 #: lang/json/professions_from_json.py msgctxt "profession_male" msgid "Pyromaniac Kelvinist" -msgstr "" +msgstr "纵火狂徒" #. ~ Profession (male Pyromaniac Kelvinist) description #: lang/json/professions_from_json.py @@ -104674,12 +104731,12 @@ msgctxt "prof_desc_male" msgid "" "You have loved fire all of your life. You have now discovered your inner " "fire, and want to exercise that upon the world." -msgstr "你一生都爱火。你内心的火焰已经忍不住要燃烧到人世间。" +msgstr "一生所恋,炽焰浓烟,心炎既现,熔炼人间。" #: lang/json/professions_from_json.py msgctxt "profession_female" msgid "Pyromaniac Kelvinist" -msgstr "" +msgstr "纵火狂徒" #. ~ Profession (female Pyromaniac Kelvinist) description #: lang/json/professions_from_json.py @@ -104687,12 +104744,12 @@ msgctxt "prof_desc_female" msgid "" "You have loved fire all of your life. You have now discovered your inner " "fire, and want to exercise that upon the world." -msgstr "你一生都爱火。你内心的火焰已经忍不住要燃烧到人世间。" +msgstr "一生所恋,炽焰浓烟,心炎既现,熔炼人间。" #: lang/json/professions_from_json.py msgctxt "profession_male" msgid "Druid" -msgstr "德鲁伊特" +msgstr "德鲁伊" #. ~ Profession (male Druid) description #: lang/json/professions_from_json.py @@ -104700,12 +104757,12 @@ msgctxt "prof_desc_male" msgid "" "The ancient circle of druids is gone with the cataclysm. Nature must " "thrive." -msgstr "" +msgstr "德鲁伊的古代石圈在大灾变中消失了。自然必将繁荣。" #: lang/json/professions_from_json.py msgctxt "profession_female" msgid "Druid" -msgstr "德鲁伊特" +msgstr "德鲁伊" #. ~ Profession (female Druid) description #: lang/json/professions_from_json.py @@ -104713,7 +104770,7 @@ msgctxt "prof_desc_female" msgid "" "The ancient circle of druids is gone with the cataclysm. Nature must " "thrive." -msgstr "" +msgstr "德鲁伊的古代石圈在大灾变中消失了。自然必将繁荣。" #: lang/json/professions_from_json.py msgctxt "profession_male" @@ -106333,7 +106390,7 @@ msgstr "铁匠铺" #: lang/json/recipe_group_from_json.py msgid " Craft: Tinder" -msgstr "" +msgstr "工艺:火绒" #: lang/json/recipe_group_from_json.py msgid " Cook: Meat, Cooked" @@ -106501,7 +106558,7 @@ msgstr "制造:钢块" #: lang/json/recipe_group_from_json.py msgid " Craft: Crucible" -msgstr "" +msgstr "工艺:坩埚" #: lang/json/recipe_group_from_json.py msgid " Craft: Anvil" @@ -108192,6 +108249,8 @@ msgid "" "fall gracefully, and for other acrobatic feats. The first number shown " "includes modifiers, and the second does not." msgstr "" +"躲避迎面而来威胁的技能,无论是敌人的攻击,一个触发的陷阱或落下来的岩石。 " +"这项技能也将决定你是优雅的落地,或是一屁股砸在地板上,以及其他一些你心血来潮所做的杂技动作。" #: lang/json/skill_from_json.py msgid "marksmanship" @@ -108320,7 +108379,7 @@ msgstr "武器" #: lang/json/skill_from_json.py msgid "spellcraft" -msgstr "" +msgstr "魔法" #. ~ Description for spellcraft #: lang/json/skill_from_json.py @@ -108329,6 +108388,7 @@ msgid "" "higher skill increases how quickly you can learn spells, and decreases their" " spell failure chance. You learn this skill by studying books or spells." msgstr "" +"神秘的奥术。代表了魔法理论和所有需要的东西。更高的技能可以提高你学习法术的速度,降低他们的法术失败几率。你可以通过学习书本或咒语来学提高这项技能。" #: lang/json/snippet_from_json.py msgid "Fires can spread easily, especially with abundance of fuel." @@ -108702,7 +108762,7 @@ msgstr "别太贪心了。如果你死了,那战利品毫不重要。" #: lang/json/snippet_from_json.py msgid "The floor is too hard to sleep on? Try gathering a pile of leaves." -msgstr "" +msgstr "地板太硬,无法入睡?试着垫些一堆树叶干草。" #: lang/json/snippet_from_json.py msgid "" @@ -111618,6 +111678,7 @@ msgid "" " field of androids. Unconfirmed rumors suggest that Uncanny already got a " "pretty big command from the government." msgstr "" +"科技世界新闻:不可思议的会说话娃娃成功的重塑了玩具公司的品牌,不可思议的是,他们计划将自己的专业知识引入机器人领域。未经证实的谣言表明,他们已经从政府得到了相当大的支持。" #: lang/json/snippet_from_json.py msgid "" @@ -112306,6 +112367,7 @@ msgid "" "should continue our teleportation research no matter the cost if we don't " "want to be fired." msgstr "" +"Heisenstein博士今天告诉我们,传送部主任把我们的竞争对手——他不记得他们的名字,可能是“黑洞科学”和与黑山有关的东西——作为一个例子。他说,我们有可靠的信息表明,他们都有可工作的隐形传输设备,而且他们比我们先进得多。如果我们不想被解雇的话,我们应该继续我们的传送研究,无论花费多少。" #: lang/json/snippet_from_json.py msgid "" @@ -112737,6 +112799,10 @@ msgid "" "ENTRY 48:\n" "The concavities are between 10 and 20 feet tall, and run the length of the faultline. Each one is vaguely human in shape, but with the proportions of the limbs, neck and head greatly distended, all twisted and curled in on themselves." msgstr "" +"条目47:\n" +"我们正常的采矿程序挖出了一个空洞。除了发现的完全垂直的奇怪断层线之外,这种情况并不罕见。这条断层线有几个奇怪的洞,这让迷信的成员们感到恐慌;这些奇怪的洞内似乎有些类人形生物。\n" +"条目48:\n" +"这些洞穴有10到20英尺高,和断层线一样长。每个生物的外形都有点像人类,但四肢、脖子和头部的比例却大大扩张,全都扭曲着,蜷缩在一起。" #: lang/json/snippet_from_json.py msgid "" @@ -112745,6 +112811,10 @@ msgid "" "ENTRY 52:\n" "Still waiting on the archaeologists. We've done a little light inspection of the faultline; our sounding equipment is insufficient to measure the depth of the concavities. The equipment is rated at 15 miles depth, but it isn't made for such narrow tunnels, so it's hard to say exactly how far back they go." msgstr "" +"条目49:\n" +"很明显,在考古学家有机会检查该地区之前,我们已经停止了该地区的采矿作业。这将使我们的计划至少推迟一周。这项愚蠢的文物保护法已经实施了50年,尽管这些采矿作业是我们经济的支柱,但它只能被迫暂时停止。\n" +"条目52:\n" +"还在等考古学家。我们对断层线做了一点轻微的检查;我们的测深设备不足以测量凹陷的深度。该设备的额定深度为15英里,但它并不是为如此狭窄的隧道而制造的,所以很难确切地说出它们能走多远。" #: lang/json/snippet_from_json.py msgid "" @@ -112755,6 +112825,12 @@ msgid "" "ENTRY 58:\n" "They're bringing in ANOTHER CREW? Christ, it's just some cave carvings! I know that's sort of a big deal, but come on, these guys can't handle it?" msgstr "" +"条目54:\n" +"我注意到下面房间里有几个人拿着凿子,正在凿断一堵陡峭的墙。朝另一个方向看。专家们不会注意到少了一块。他妈的。\n" +"条目55:\n" +"好吧,考古学家现在在下面,有几个男孩作为向导。但是他们看上去并不是那种经验丰富的探险家;我怀疑他们在20英尺以下。我不想让人为了照顾科学家而放弃工作,但是如果他们受伤了,矿井会被关闭的,我们不知道什么时候才能开工。\n" +"条目58:\n" +"他们要再派一组成员来吗?天哪,这只是一些洞穴雕刻!我知道这是件大事,但是拜托,这些家伙处理不了吗?" #: lang/json/snippet_from_json.py msgid "" @@ -112764,6 +112840,11 @@ msgid "" "QUALITY OF FAULTLINE NOT COMPROMISED.\n" "INITIATING STANDARD TREMOR TEST..." msgstr "" +"暂停采矿作业;根据命令2:07b将控制权移交给AMIGARA 项目。\n" +"断层线探测的深度为30.09 km。\n" +"发现断层线损坏;因违反第87.08条规定而逮捕了Nepower矿山工作人员,并将其转移至实验室89-C作为受试者。\n" +"断层线的质量没有受到影响。\n" +"正在启动标准震颤测试…" #: lang/json/snippet_from_json.py msgid "This is a test of the sign snippet system" @@ -112925,7 +113006,7 @@ msgid "" "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." -msgstr "如果你碰上了一只丧尸浩克,逃跑应该是个好主意。它们快得见鬼,但是非常蠢;比起赶路来它们更喜欢将障碍物破坏的粉碎,这极大的减缓了它们的速度。" +msgstr "如果你碰上了一只丧尸浩克,逃跑应该是个好主意。它们快得见鬼,但是非常蠢;比起赶路来它们更喜欢将障碍物砸烂,这极大的减缓了它们的速度。" #: lang/json/snippet_from_json.py msgid "" @@ -113655,7 +113736,7 @@ msgstr "避免在狭窄的走廊使用火箭发射器,你可能会射歪。" msgid "" "Met a mad chemist once. She made a battery from a potato... or was it " "lemon?" -msgstr "我曾经见过一位疯狂的化学家。她制造电池只用了土豆……也许是柠檬?" +msgstr "我曾经见过一位疯狂化学家。她会制造电池,只需要土豆……也许是柠檬?" #: lang/json/snippet_from_json.py msgid "" @@ -113664,6 +113745,7 @@ msgid "" "arrested who will give you justice? A zombie judge? Will they put you in a" " zombie prison? No thanks, I'll pass." msgstr "" +"警方仍然在肆虐,它们变得更加机械化了,作为人类的警察都死光光了,而警用机器人在四处乱跑。如果你被逮捕了,谁来保证司法公正?丧尸法官吗?它们会把你送进丧尸监狱吗?不不不我还是算了吧。" #: lang/json/snippet_from_json.py msgid "" @@ -113801,7 +113883,7 @@ msgid "" "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." -msgstr "" +msgstr "如果你会使用电子装置,你可以尝试用说话玩偶或者其他带扬声器的东西制造噪音。为什么?当然是用来分散丧尸的注意力。" #: lang/json/snippet_from_json.py msgid "" @@ -113919,7 +114001,7 @@ msgstr "我不感兴趣。" #: lang/json/snippet_from_json.py msgid "How about no?" -msgstr "" +msgstr "不要吧?" #: lang/json/snippet_from_json.py msgid "No thanks, I really don't feel like it." @@ -113939,11 +114021,11 @@ msgstr "我不去了,工作太多了。" #: lang/json/snippet_from_json.py msgid "Who put you in charge of what I do?" -msgstr "" +msgstr "谁告诉你我愿意做这个?" #: lang/json/snippet_from_json.py msgid "Great idea! Call me when you find SOMEONE ELSE to do it." -msgstr "好主意!当你找到别人做这件事的时候给我打电话。" +msgstr "真是个“好”主意!当你找到*别人*做这件事之后再叫我。" #: lang/json/snippet_from_json.py msgid " " @@ -113951,7 +114033,7 @@ msgstr " " #: lang/json/snippet_from_json.py msgid "asshat" -msgstr "傻吊" +msgstr "傻屌" #: lang/json/snippet_from_json.py msgid "asswipe" @@ -114011,7 +114093,7 @@ msgstr "瘟丧" #: lang/json/snippet_from_json.py msgid "freak" -msgstr "朴街" +msgstr "扑街" #: lang/json/snippet_from_json.py msgid "goon" @@ -114039,7 +114121,7 @@ msgstr "傻子" #: lang/json/snippet_from_json.py msgid "nitwit" -msgstr "笨人" +msgstr "笨坯" #: lang/json/snippet_from_json.py msgid "piece of an ass" @@ -115100,15 +115182,15 @@ msgstr "谢谢,!" #: lang/json/snippet_from_json.py msgid "Hey! I saw you take that ! Drop it. Now." -msgstr "" +msgstr "嘿!我看见你这拿了不该拿的东西!!把它放下,马上!" #: lang/json/snippet_from_json.py msgid "You best be dropping what you just picked up right now ." -msgstr "" +msgstr "你最好把你刚才拿走的东西放下,。" #: lang/json/snippet_from_json.py msgid "I've got eyes, you thief!" -msgstr "" +msgstr "我长了眼睛,你这个贼!" #: lang/json/snippet_from_json.py msgid "Hey! That belongs to us! Drop it." @@ -115116,7 +115198,7 @@ msgstr "嘿!那是属于我们的!放下。" #: lang/json/snippet_from_json.py msgid ", I've seen a thief!" -msgstr "" +msgstr ",我看见了一个贼!" #: lang/json/snippet_from_json.py msgid "I saw that! Drop what you just stole!" @@ -115124,16 +115206,16 @@ msgstr "我看到了!放下你刚偷的东西!" #: lang/json/snippet_from_json.py msgid "Thieves will not last long around me , please drop that." -msgstr "" +msgstr "我不会容忍小偷在我身边,。把东西放下。" #: lang/json/snippet_from_json.py msgid "" "Consider this a warning , thieves will not be tolerated, drop it." -msgstr "" +msgstr "这是一个警告,,我们不会容忍小偷,把东西放下。" #: lang/json/snippet_from_json.py msgid "You think I'm blind ? Don't touch our stuff." -msgstr "" +msgstr "你以为老子是瞎的,?别动我们的东西。" #: lang/json/snippet_from_json.py msgid "content" @@ -115401,7 +115483,7 @@ msgstr "嘿,,我们什么时候吃点东西?" #: lang/json/snippet_from_json.py msgid "I need to eat something." -msgstr "我 要吃点东西。" +msgstr "我 想吃东西。" #: lang/json/snippet_from_json.py msgid " if I don't get some food." @@ -115605,7 +115687,7 @@ msgstr "午睡该结束了。" #: lang/json/snippet_from_json.py msgid "Who's there?" -msgstr "谁在哪里?" +msgstr "谁在那里?" #: lang/json/snippet_from_json.py lang/json/speech_from_json.py msgid "Hello?" @@ -116094,7 +116176,7 @@ msgstr "没有燃料我就不能给我的生化插件充电,因为我的内燃 msgid "" "Hey, , can I get some waste paper or withered plants? I need to " "recharge." -msgstr "" +msgstr "嘿,,能给我拿些废纸或者枯萎植物吗?我需要充能。" #: lang/json/snippet_from_json.py msgid "" @@ -116112,33 +116194,33 @@ msgstr "如果没有钚浆,我就不能用我的内置反应堆给我的CBM充 msgid "" "Hey, , pass me some plutonium slurry if you have any, I need to " "refuel my internal reactor." -msgstr "" +msgstr "嘿,,如果你有钚浆,请给我一些,我需要补充反应堆。" #: lang/json/snippet_from_json.py msgid "" "Beta radiation can be blocked by clothing, but is really dangerous if you " "ingest it. So can I have some plutonium slurry to power my reactor and give" " me cancer?" -msgstr "" +msgstr "β射线可以被衣服阻挡,但如果你摄入了它,就会非常危险。可以给我一些钚浆来给我的反应堆供能,让我得癌症吗?" #: lang/json/snippet_from_json.py msgid "" "I need some radioactive slurry to power my reactor. Or a less dangerous " "power source, that would be even better!" -msgstr "" +msgstr "我需要一些放射性钚浆来给我的反应堆供电。或者是一个不那么危险的电源,那就更好了!" #: lang/json/snippet_from_json.py msgid "" "Please, , get me some radioactive slurry to fuel my internal " "reactor. Or get me another way to recharge my CBMs!" -msgstr "" +msgstr ",请给我一些用来补充反应堆的放射性液体,或者随便什么办法,只要能给CBM充能就行!" #: lang/json/snippet_from_json.py msgid "" "I can't use my internal reactor to recharge my CBMs without some plutonium " "slurry. Which wouldn't be a problem if I had anything else that would " "recharge my CBMs!" -msgstr "" +msgstr "没有钚浆,不能用我的内部反应堆给我的cbm充电。如果我还有其他东西可以给我的cbm充电,那就不成问题了!" #: lang/json/snippet_from_json.py msgid "Tell me about how you survived the cataclysm." @@ -116549,7 +116631,7 @@ msgstr "会自行开门,去想去的地方。" msgid "" " will hold the line by not moving into doorways or obstructions " "adjacent to you." -msgstr "" +msgstr "不会进入你旁边的门或障碍物,保持你们之间的界限。" #: lang/json/snippet_from_json.py msgid " will move freely to attack enemies." @@ -117191,7 +117273,7 @@ msgstr "\"木瓜!\"" #: lang/json/speech_from_json.py msgid "\"Who's there?\"" -msgstr "\"谁在哪里?\"" +msgstr "\"谁在那里?\"" #: lang/json/speech_from_json.py msgid "\"Can you help me?\"" @@ -119809,8 +119891,8 @@ msgid "" "I'm my own person, but I'm willing to follow your lead. I can do a lot of things for you: I can fight, I can train you or you can train me, I can carry stuff, I can bandage your wounds, I can build faction camps, I can go places, I can guard things, I can use some bionics, I can even chit-chat with you or give you tips or talk about my background. You can give me instructions in conversation or by radio or shout commands at me.\n" " What do you want to know more about?" msgstr "" -"我属于自己,但我愿意听从你的领导。我可以为你做很多事情:我可以战斗,我可以训练你,或者你可以训练我,我可以携带东西,我可以包扎你的伤口,我可以建立派系营地,我可以去一些地方,我可以守卫东西,我可以使用一些生化插件,我甚至可以和你聊天,或者给你小费,或者谈论我的背景。你可以在谈话中给我指示,也可以通过无线电或对我大喊大叫。\n" -"你想了解什么?" +"我是独立的人,但愿意追随你的领导。我可以为你做很多事情:战斗、训练你、接受你的训练、携带物品、为你包扎、建立派系营地、前往指定地点、做守卫、使用某些生化插件,也可以和你聊天、聊聊我的过去。你可以通过对话、呼喊和无线电的方式对我下达指令。\n" +"你还想知道什么?" #: lang/json/talk_topic_from_json.py msgid "Forget I asked." @@ -119906,7 +119988,7 @@ msgid "" " I'll respect your rules for what types of weapons to use, but I'll choose what to use from my stuff.\n" " You can also tell me to hold the line and fight at chokepoints, but I'm not great at recognizing them so I may go off to fight something elsewhere anyway." msgstr "" -"这是个危险的世界,是吧?让我们一起为生存而奋斗。我会在你身边支持你。但如果情况不妙,实话说,我会逃跑。你可以通过区域管理(按Y)指定安全的撤退区域,我会撤退到最近的一个,撤退区域也可以指定在载具上。\n" +"这是个危险的世界,对吧?让我们一起为生存而奋斗。我会在你身边支持你。但如果情况不妙,实话说,我会逃跑。你可以通过区域管理(按Y)指定撤退安全区,那么我会撤退到最近的一个,撤退区域也可以指定在载具上。\n" "如果你逃了,但我觉得很安全,我会留下战斗,除非你指示我和你一起逃跑,我会尽量忠于你的指示。\n" "你可以指示我何时攻击,我自己决定攻击目标。我将尽可能保护你我,除非你指示我留下。\n" "我能够用枪支和手榴弹——只要我有,除非你指示我不要使用手榴弹、不要使用造成巨大噪音的武器或不使用任何远程武器。还可以指示我瞄准多久、在射击时是否避免误伤你,我不擅长避免误伤,所以尽量远离我的火力线。\n" @@ -119927,7 +120009,7 @@ msgstr "" #: lang/json/talk_topic_from_json.py msgid "Instead of reading to you, can we just talk?" -msgstr "" +msgstr "与其读给你听,不如我们谈谈?" #: lang/json/talk_topic_from_json.py msgid "" @@ -119937,11 +120019,11 @@ msgid "" " Also, since we're friends, I'll give you anything I'm carrying, no questions asked.\n" " Oh, yeah, if I'm hungry or thirsty and I'm carrying food, I'll eat it. Same if I need to recharge my bionics and I have some fuel. So you might want to watch what you give me, y'know?" msgstr "" -"你给我拿东西,我来拿。但我只有这么多的口袋,而且我也只有这么强壮,所以我会丢掉那些太大了不能拿的东西。\n" -"我也会穿东西-我会决定我想穿什么,但你可以从我这里拿走东西。如果我穿了不该穿的衣服,你可以碰我,帮我整理一下我的盔甲,让我脱掉。\n" -"我不喜欢穿很多装备,所以如果你给我很多笨重的东西和不合身的东西,我会把它们拿下来,可能会把它们扔掉。\n" -"另外,既然我们是朋友,我会把我带的东西都给你,不用问任何问题。\n" -"哦,是的,如果我饿了或渴了,我身上带着食物就会吃的。同样,如果我需要给我的生化插件充电会用身上的燃料。所以你想好该给我什么,你知道吗?" +"我可以携带你给我的物品,但我的空间和负重能力有限,我会丢掉那些太大而无法携带的东西。\n" +"我会自行决定穿戴物品,如果我穿了不该穿的东西,你可以接触我、整理我的装束、让我脱掉它。\n" +"我不喜欢穿戴太多,如果你给我的东西太笨重或者不合适,我会把它们扔下。\n" +"当然,我愿意把携带的任何物品交给你,我们是朋友,没问题。\n" +"哦对了,如果饿了、渴了,我会吃掉我携带着的饮食。同理也会消耗燃料为生化插件充能。所以也许你应该检查一下你给我的物品,是吧?" #: lang/json/talk_topic_from_json.py msgid "Tell me how I give you medical supplies." @@ -119961,9 +120043,9 @@ msgid "" " I'm not a potted plant, though, so if I hear something dangerous happening, I'm going to go see what it is instead of getting jumped in the dark. If you want me to stay put, tell me not to investigate noises - but if I get shot by some bandit because I can't see where he is and you don't want me to go looking, I won't be happy.\n" " You can also use the zone manager (keybind 'Y') to set up no-investigate zone, so if there's some monsters behind a door that you know about, I can ignore them. You can also set on an investigate-only zone, and I won't investigate noises coming from outside the zone. The no-investigate zone takes precedence over the investigate-only, if there's a noise coming from some place in both zones. And if you've got an investigate-only zone set anywhere, even if it's far away, I won't investigate noises coming from outside of it, so be careful with those zones. Like I said, I don't want to get sniped by some bandit because you told me not to go looking for him - but I also don't want to go investigate something pounding at door only to find out it's some horrible monster you forgot to warn me about." msgstr "" -"你叫我站岗,我就呆在原地站岗——除非我在车里,否则我会一直跟着车走。\n" -"不过,我不是植物人,所以如果我听到危险的事情发生,我会去看看是什么,而不是在原地等死。如果你想让我呆在原地,告诉我不要调查噪音-但是如果我被某个强盗开枪攻击,因为我看不到他在哪里,而你不想让我去看,我就不会高兴了。\n" -"你也可以使用区域管理器(绑定'y'键)来设置不调查区域,所以如果你知道门后面有一些怪物,我可以忽略它们。你也可以设置一个只进行调查的区域,我不会调查区域外的噪音。只有当两个区域的某个地方发出噪音时,禁止调查区域才优先于调查区域。如果你在任何地方设置了一个只进行调查的区域,即使它离得很远,我也不会调查它外部发出的噪音,所以要小心那些区域。就像我说的,我不想因为你叫我不要去调查而被强盗狙击,但我也不想去调查是什么东西砸门,结果发现那是你忘了警告我的可怕怪物。" +"如果你让我警戒,我就会在原地站岗——如果当时我在车里,我会一直守在车上。\n" +"不过,我不是植物人,如果我察觉到可疑的事物,我会前往打探,而不是在原地等死。如果你想让我守在原地,就告诉我不要调查噪音。但是如果我被某个强盗射击,我看不到他,你又不让我去看,我会很不高兴。\n" +"使用区域管理器(按Y)可以设置噪音无视区域,设置在门后有怪物躁动的地方,我就会忽略那里。或者也可以设置一个噪音警戒区域,我不会调查区域外的噪音。如果上述两个区域有重叠的部分,无视优先。不管在哪里设置了噪音警戒区域,即使离得很远,我也不会再调查区域外的噪音,所以要小心。就像我说的,我不想因为你禁止我打探而被强盗狙击。当然我也不想在打探砸门的噪音时,发现那是一个超级可怕的怪物——而你忘了警告我。" #: lang/json/talk_topic_from_json.py msgid "Just in case - how else can I tell you to stay put?" @@ -119977,6 +120059,11 @@ msgid "" " I'll tell you if I'm low on bionic energy and can't recharge, and what fuel I need.\n" " Sothere are some internal atomic reactor bionics - I can use those, but I can only recharge them with plutonium slurry. That stuff is radioactive, so do us both a favor and don't give me an internal reactor unless you really like glowing in the dark." msgstr "" +"仿生学是增强包,对吧?它们有可安装的小型仿生模块或CBM,我可以使用一些CBM- 如果你检查CBM,它会告诉你我是否可以使用它。\n" +"你可以找一个可编程的外科安装程序或自动控制面板,把我放在床上上,激活它,给我安装一个合适的CBM—或者如果我认为我会做得更好,我会做的。如果我擅长的话,我将接手给你安装CBM。\n" +"我几乎可以使用所有的被动仿生学和一些主动仿生学。如果我有任何可用的仿生学,我会尝试合理地使用它们,但是如果我们有危险,我会激活任何可能给我优势的东西。如果它们比你给我的武器更好,我会优先使用仿生学武器,但是如果你认为我应该为我的防御和治疗保留我的仿生能量,你可以告诉我要保留多少。我会尽量让我的仿生能量保持最充足,但如果我们的供给不足,你可以告诉我不要在我没满的时候再充电。\n" +"如果我的仿生能量不足,无法充电,我将告诉你,我需要什么燃料。\n" +"这里有一些内部原子反应堆仿生学——我可以使用它们,但我只能用钚浆给它们充电。这些东西是放射性,所以帮我们一个忙,不要给我一个反应堆内部,除非你真的喜欢在黑暗中发光。" #: lang/json/talk_topic_from_json.py msgid "Tell me how I give you fuel for your bionics." @@ -119989,6 +120076,10 @@ msgid "" " You can also ask me for advice - I've heard things here and there that may help us survive, but I don't usually give advice relevant to the situation.\n" " I can also train you, and you can read books to me in order to train me." msgstr "" +"如果你愿意,我们可以聊天。人是社会性动物,对吧?轻松的谈话对你的心情会产生意想不到的效果。但是我不想一直喋喋不休,所以如果我们最近聊过,我可能就不想再聊了\n" +"你也可以问我我的背景。不过,我可能不想谈这个。\n" +"你也可以向我征求意见——我听到过一些可以帮助我们生存的事情,但我通常不会给出与情况相关的建议。\n" +"我也可以训练你,或者你给我看书,来训练我。" #: lang/json/talk_topic_from_json.py msgid "" @@ -120048,6 +120139,8 @@ msgid "" "Well, this conversation is pretty new! But there's been some other changes.\n" " I've been able to install CBMs on you, and have passive bionics installed in me, for a while. But now I can use some active bionics, and I can explain some details on how I use bionics." msgstr "" +"好吧,这次谈话很新!但还有其他的一些不同。\n" +"我已经在你身上安装了CBM,我也安装了一些被动生化插件。现在我可以使用一些主动的生化插件,我可以向你解释一些关于我如何使用仿生学的细节。" #: lang/json/talk_topic_from_json.py msgid "" @@ -120321,29 +120414,29 @@ msgstr "疯狂使用生化插件武器。不将能量留给防御型或实用型 #, no-python-format msgid "" "We have plenty of supplies. Recharge until you have 90% of total power." -msgstr "我们有充足的补给。充电直到你有90%的总能量。" +msgstr "我们有充足的补给。充到90%小意思。" #: lang/json/talk_topic_from_json.py #, no-python-format msgid "We have supplies. Recharge until you have 75% of total power." -msgstr "我们有较多的补给。充电直到你有75%的总能量。" +msgstr "我们的补给比较充足。充到75%没问题。" #: lang/json/talk_topic_from_json.py #, no-python-format msgid "We have some supplies. Recharge until you have 50% of total power." -msgstr "我们有一些补给。充电直到你有50%的总能量。" +msgstr "我们还有一些补给。充到50%。" #: lang/json/talk_topic_from_json.py #, no-python-format msgid "" "We're running low on supplies. Recharge until you have 25% of total power." -msgstr "我们的补给快用完了。充电直到你有25%的总能量。" +msgstr "我们的补给快用完了。充到25%就停下吧。" #: lang/json/talk_topic_from_json.py #, no-python-format msgid "" "We're almost out of supplies. Recharge until you have 10% of total power." -msgstr "我们几乎没有补给了。充电直到你有10%的总能量。" +msgstr "我们几乎没有补给了。充到10%凑合用吧。" #: lang/json/talk_topic_from_json.py msgid "Aim when it's convenient." @@ -121153,11 +121246,11 @@ msgstr "那是因为我救了你。听着,我可以利用你的帮助…" msgid "" "Big fucking deal. Do what I say or I'll shove that chip back where it " "belongs." -msgstr "这他妈是笔大买卖,照我说的去做,否则我就把那块筹码扔回原处。" +msgstr "这他妈是笔大买卖,照我说的去做,否则我就把那块芯片塞回去。" #: lang/json/talk_topic_from_json.py msgid "Sorry, I'm nobody. Enjoy your freedom, I guess." -msgstr "对不起,我只是一个无名的人。我想你还是继续享受自由吧。" +msgstr "对不起,不要在意我是谁。我想你还是继续享受自由吧。" #: lang/json/talk_topic_from_json.py msgid "*buzz* Great! So what happens now?" @@ -121181,7 +121274,7 @@ msgstr "…等等。*哔卟*为什么我相信你?*滋滋匝*你可能和他 msgid "" "I wouldn't have pulled your chip out if I didn't want you to think for " "yourself." -msgstr "如果我不想让你为自己着想,我就不会把你的筹码拿出来。" +msgstr "如果我不想让你独立思考,我就不会把你的芯片拿出来。" #: lang/json/talk_topic_from_json.py msgid "" @@ -121373,6 +121466,11 @@ msgid "" "3. Faction camps used to upgrade by completely redrawing the map. Damage to the camp would be replaced when the camp was upgraded. Now upgrades only change the actual area being upgraded, and you will have to repair damage to the camp yourself.\n" "4. There used to be a single path for upgrading the main camp. Now, after you have completed the first tent, you will have many options for your next upgrade, and you can have different companions working on different upgrades of the main camp at the same time." msgstr "" +"\n" +"1. 以前,派系营地需要另一个NPC来作为营地主管监督和管理营区,但现在已经被公告牌和双向无线电所取代。\n" +"2. 过去,如果在同一区域上有一辆车,甚至一辆手推车,就不可能升级这个区域的派系营地。现在,即使区域内有车辆,您也可以升级营地,只要升级不会改变车辆所处的区域。\n" +"3. 派系营地过去通过完全重新绘制地图来升级。营地升级后,营地的损坏将被替换。现在升级只会改变正在升级的实际区域,你必须自己修复营地的损坏。\n" +"4. 以前只有一条途径可以升级主营地。现在,在你完成第一个帐篷之后,你将有很多选择来进行下一次升级,你可以让不同的同伴同时在主营地的不同升级上工作。" #: lang/json/talk_topic_from_json.py msgid "" @@ -121451,7 +121549,7 @@ msgstr "精神、头脑和身体的统一…" #: lang/json/talk_topic_from_json.py msgid "Look for the bonds which define you, and act in accord." -msgstr "" +msgstr "寻找你们之间一致的联系,并采取行动。" #: lang/json/talk_topic_from_json.py msgid "" @@ -121530,7 +121628,7 @@ msgstr "我改变主意了,谢谢。" #: lang/json/talk_topic_from_json.py msgid "I'm joining no stinking cult! Take your berry and shove it!" -msgstr "" +msgstr "我要加入没有恶臭的邪教,拿起你的浆果并把它扔掉。" #: lang/json/talk_topic_from_json.py msgid "Hey, I didn't expect to live long enough to see another living human!" @@ -125196,7 +125294,7 @@ msgid "" "I have a camp of my own, away from here. Maybe you can't scavenge, but we " "can use any warm bodies that can lift a tool. You'd be safer and better fed" " there." -msgstr "" +msgstr "我有自己的营地,离这里很远。或许你不能拾荒,但是可以通过劳动温暖身体,你在那里会更安全,吃得更好。" #: lang/json/talk_topic_from_json.py msgid "" @@ -125218,7 +125316,7 @@ msgid "" "That's a kind offer of you, but I think I'd rather take my chances here than" " risking it out there again. I remember , I'm not in any " "hurry to face that again." -msgstr "" +msgstr "感谢你的好意,但是我宁愿在这里等待机会,也不想冒险离开这里了。我记得,我不想再面对它。" #: lang/json/talk_topic_from_json.py msgid "" @@ -125305,7 +125403,7 @@ msgstr "你需要吃点什么吗?" #: lang/json/talk_topic_from_json.py msgid "Oh nice. Crunchings and munchings. That's a cool, a cool thing." -msgstr "" +msgstr "哦,太好了。嘎吱嘎吱作响。很酷,很酷。" #: lang/json/talk_topic_from_json.py msgid "" @@ -125321,13 +125419,13 @@ msgstr "我能问你点别的事吗?" msgid "" "I can tell when it has stuff in it, it's got a sandy texture. But this " "doesn't. Thanks again." -msgstr "" +msgstr "我能看出来里面有东西的时候,它的质地是沙质的。但这并不是。再次感谢。" #: lang/json/talk_topic_from_json.py msgid "" "I'm building a house out of cardboard. The sandman doesn't want me to, but " "I told him to go fuck himself." -msgstr "我正在用硬纸板盖房子。睡魔告诉我别这么做,但我告诉它赶紧滚。" +msgstr "我正在用硬纸板盖房子。沙人告诉我别这么做,但我告诉它赶紧滚。" #: lang/json/talk_topic_from_json.py msgid "Why cardboard?" @@ -125358,22 +125456,22 @@ msgstr "" msgid "" "Kind of a question's that? Yeah man, you got cardboard, I got a whole... a " "whole shopping list. Got it here." -msgstr "" +msgstr "这是个问题吗?当然,伙计,你能弄到纸板,我有一个完整的……完整的购物清单。就在这里。" #: lang/json/talk_topic_from_json.py msgid "What's next on the list?" -msgstr "名单上下一个是什么?" +msgstr "清单的下一项是什么?" #: lang/json/talk_topic_from_json.py msgid "" "If you don't know who he is, I definitely can't tell you. He talks to " "everyone, if you didn't hear him that means you can't be trusted, except to " "help me out." -msgstr "" +msgstr "如果你不知道他是谁,我也绝不告诉你。他跟每个人都说话,如果你没听到他的声音,那就说明你不可信,帮不了我。" #: lang/json/talk_topic_from_json.py msgid "... What were you saying before?" -msgstr "" +msgstr "你刚才说什么来着?" #: lang/json/talk_topic_from_json.py msgid "" @@ -125383,15 +125481,15 @@ msgstr "那些胆小鬼都怕我。他们不让我进入他们的基地。我要 #: lang/json/talk_topic_from_json.py msgid "You said you were building a house?" -msgstr "" +msgstr "你说你在建房子?" #: lang/json/talk_topic_from_json.py src/handle_action.cpp msgid "No." -msgstr "否" +msgstr "不。" #: lang/json/talk_topic_from_json.py msgid "I... I can see you wearing it. Why are you wearing that?" -msgstr "" +msgstr "我…我看到你穿着它。你为什么穿这个?" #: lang/json/talk_topic_from_json.py msgid "What was that about cardboard?" @@ -125401,26 +125499,26 @@ msgstr "那硬纸板是怎么回事?" msgid "" "You ask me what I can see, but I don't tell you what you see. Sometimes we " "have shields up, to protect ourselves." -msgstr "" +msgstr "你问我能看见什么,但我不告诉你你看见了什么。有时候我们会竖起盾牌来保护自己。" #: lang/json/talk_topic_from_json.py msgid "" "Well... I had it all pretty together, but the others have left, and now the " "masters won't let me build my sanctuary. Can you help me figure them out?" -msgstr "" +msgstr "嗯……从前一切都很美好,但其他人都离开了,现在这儿的主人不让我建造我的避难所。你能帮我解决一下吗?" #: lang/json/talk_topic_from_json.py msgid "" "That's it! I'm just gonna need a little time to get it all set up. Thanks." " You've helped me a lot. I'm feeling much more myself with all this to " "keep me going." -msgstr "" +msgstr "就是这样!我需要一点时间把它们布置好,谢谢你,你帮了我大忙,我有自信去完成这些事情。" #: lang/json/talk_topic_from_json.py msgid "" "Why don't you leave this place? Come with me, I could use some help out " "there." -msgstr "" +msgstr "为什么不离开这里呢?跟我走吧,我有一些地方需要你帮忙。" #: lang/json/talk_topic_from_json.py msgid "Well. No problem, glad to be of service. Talk to you later." @@ -125430,7 +125528,7 @@ msgstr "好。没问题,很乐意为您效劳。以后再跟你谈。" msgid "" "No! I just got everything together. I am not leaving, not now. " "Everything's finally coming together!" -msgstr "不!我把一切都整理好了。我不会离开,不是现在。所有的事情终于都在一起了!" +msgstr "不!我刚刚把所有的东西收集全。现在我不会离开,我终于把它们全部凑齐了!" #: lang/json/talk_topic_from_json.py msgid "Fuck off, dickwaddle." @@ -125526,7 +125624,7 @@ msgid "" "By the time they 'found' it, the place was full up, wouldn't ya know it. " "Now I'm stuck out here and they won't consider letting me in." msgstr "" -"哦,一开始还是那个老故事。我被疏散到当地的集中中心,然后搭上一辆被重新利用的校车,拖到了这里。然后,那个叫我进去的小妞看到了我的名字和中文名字,很方便地“丢失”了我的文件。我被派到这里等待进一步的处理,而我看着一车的人被处理和接收。当他们“找到”文件的时候,这个地方已经满了,你不知道吗?现在我被困在外面,他们不会考虑让我进去的。" +"哦,一开始还是那个老故事。我被疏散到当地的集中中心,然后搭上一辆经过改造的校车,拖到了这里。然后,那个叫我进去的小妞看到了我的中文名字,很随便地“丢失”了我的文件。我被派到这里等待进一步的处理,而我看着一车的人被处理和接收。当他们“找到”文件的时候,这个地方已经满了,天知道。现在我被困在外面,他们不会考虑让我进去的。" #: lang/json/talk_topic_from_json.py msgid "You think you were treated like that because of your race?" @@ -125545,7 +125643,7 @@ msgstr "那为什么还要呆在这儿?" msgid "" "I have a camp of my own, away from here. No paperwork required. Want to " "come?" -msgstr "我有自己的营地,离这里很远。不需要文书工作。想来吗?" +msgstr "我建立了自己的营地,离这里很远。不需要所谓的“文件”。想来吗?" #: lang/json/talk_topic_from_json.py msgid "" @@ -125585,39 +125683,39 @@ msgstr "我不在乎你是不是中国人。如果你愿意,你可以和我一 msgid "" "I mean, racism could definitely be a part of it... but you are visibly in " "poor shape. They need strong survivor material." -msgstr "" +msgstr "我是说,种族主义肯定是其中的一部分...... 但你显然身体不好。他们需要强有力的幸存者材料。" #: lang/json/talk_topic_from_json.py msgid "" "That's awful kind of you, but look at me. I'm not traveling material, I've " "managed to stay fifty pounds overweight on a diet of pine nuts and wilted " "rhubarb, and I scream and shake uncontrollably at the sight of blood." -msgstr "" +msgstr "你真是太好了,但看看我。我不适合旅行,我靠吃松仁和枯萎的大黄维持着50磅的体重,一看到血我就尖叫,不由自主地颤抖。" #: lang/json/talk_topic_from_json.py msgid "" "It'd be temporary. I have a base set up. There are only a few of us " "survivors left, we need to work together" -msgstr "" +msgstr "这将是暂时的。我建立了一个基地。我们只剩少数幸存者了,我们需要共同努力。" #: lang/json/talk_topic_from_json.py msgid "Okay, yeah, that's a bit of a problem. What were you saying before?" -msgstr "" +msgstr "OK,好好好,我有个问题,你刚刚说什么?" #: lang/json/talk_topic_from_json.py msgid "" "It may not be much, but we've got a little community. We can't live like " "this forever, but we're safer than out there, and we look out for each " "other. One way or another we'll shake things out to something better." -msgstr "" +msgstr "可能不多,但我们有一个小社区。我们不能永远这样生活,但我们比在外面更安全,我们互相照顾。不管怎样,我们都会把事情做得更好。" #: lang/json/talk_topic_from_json.py msgid "You sound more optimistic than usual." -msgstr "" +msgstr "你看起来比平时更乐观。" #: lang/json/talk_topic_from_json.py msgid "So, about that doctorate of yours..." -msgstr "" +msgstr "所以,关于你的博士学位…" #: lang/json/talk_topic_from_json.py msgid "" @@ -125626,6 +125724,7 @@ msgid "" "landed out here with me? I like them. We might be miserable, but we're " "miserable together." msgstr "" +"别误会我的意思,我讨厌这个地方和这种情况,尤其是那些把我带到这里来的自私的种族主义者……但是和我一起降落在这里的其他失败者呢?我喜欢他们。我们也许很痛苦,但我们在一起。" #: lang/json/talk_topic_from_json.py msgid "" @@ -125635,38 +125734,39 @@ msgid "" "lifting needed now... no, you know what? Screw it. You're not worth my " "time." msgstr "" +"哇。哦。你不只是去了那里。让我们离开这个死胖子,嘿?你知道世界末日之后找到甲状腺药物有多难吗,混蛋?此外,现在还有许多技能需要提升……不,你知道吗?真恶心。你不值得我浪费时间。" #: lang/json/talk_topic_from_json.py msgid "Thanks for saying it. So, what brings you around?" -msgstr "" +msgstr "谢谢你这么说。那么,是什么让你回心转意?" #: lang/json/talk_topic_from_json.py msgid "Just wanted to get square. I'd better get going." -msgstr "" +msgstr "只是想达成一致,我该走了。" #: lang/json/talk_topic_from_json.py msgid "" "Tempting offer, but I don't know how much I trust a random stranger offering" " me a place to live. Call me crazy." -msgstr "" +msgstr "你的邀请很诱人,但我不知道我是不是应该相信陌生人会给我提供住的地方。就当我疯了吧。" #: lang/json/talk_topic_from_json.py msgid "" "Oh, come on. I'm not a random stranger anymore, I brought you that crazy " "mushroom didn't I?" -msgstr "" +msgstr "哦,来吧。我不再是一个陌生人了,我给你带来了那个疯狂的蘑菇,不是吗?" #: lang/json/talk_topic_from_json.py msgid "" "What better choice do you have? It's not like it would be just you and me, " "the others out here can come too." -msgstr "" +msgstr "你还有更好的选择吗?不仅仅你我,也会有其他人来。" #: lang/json/talk_topic_from_json.py msgid "" "Like I said, sorry, it's just not happening. It's not that I don't trust " "you, it's just that I don't really trust you." -msgstr "" +msgstr "就像我说的,对不起,你说的事情还没有发生。不是我不信任你,而是我……真的不能信任你。" #: lang/json/talk_topic_from_json.py msgid "" @@ -125678,27 +125778,28 @@ msgid "" "anticipated that. Talk them into going and I'm in. It should be easy, " "they're a bunch of sweet hearted saps." msgstr "" +"该死,我还担心你会这么说呢。好吧,听着:我们已经谈妥了。我会去你的基地,但你得尽快给我安装上显微镜。这可能是一件很酷的事情的开始。哦,不用说,除非你能在你的基地给我的朋友们找个地方,否则我是不会来的。我相信你已经预料到了。说服他们去,我就参加。这应该很简单,他们是一群心地善良的笨蛋。" #: lang/json/talk_topic_from_json.py msgid "" "Well, before ended I was working at a university bookstore." " I know a little bit about a lot of things, I guess you could say. I kinda" " loved the job, to be honest." -msgstr "" +msgstr "好吧,之前,我在一家大学书店工作。我知道很多事情,我想你可以说。老实说,我有点喜欢这份工作。" #: lang/json/talk_topic_from_json.py msgid "" "What had you working at the university bookstore in the first place? Are " "you an academic yourself?" -msgstr "" +msgstr "你在大学书店工作过吗?你自己也是个学者吗?" #: lang/json/talk_topic_from_json.py msgid "What's this I hear about you having a doctorate?" -msgstr "" +msgstr "我听说你有博士学位是怎么回事?" #: lang/json/talk_topic_from_json.py msgid "What was it you were saying before?" -msgstr "" +msgstr "你刚才说什么?" #: lang/json/talk_topic_from_json.py msgid "" @@ -125710,10 +125811,12 @@ msgid "" "got crazy. Now, people are just breaking down my door to get my sweet sweet" " knowledge of mold to help them fight the incoming zombie threat." msgstr "" +"是的,这一切都非常迷人。当然,我在大学里学习,获得真菌学博士学位。我的论文是关于菌丝形成中的信号通路,博士后研究植物-" +"真菌在生物中的传播。后来我在书店找到了这份工作,因为一个真菌学博士的工作不多,尽管在事情真正疯狂之前我尝试咬过真菌。现在,人们疯狂的寻找我,想获得我丰富的真菌知识,以帮助他们对抗即将到来的丧尸威胁。" #: lang/json/talk_topic_from_json.py msgid "Do you know about the fungal zombies though?" -msgstr "" +msgstr "你知道真菌丧尸吗?" #: lang/json/talk_topic_from_json.py msgid "" @@ -125726,28 +125829,30 @@ msgid "" "breaking down my door to get my sweet sweet knowledge of mold to help them " "fight the incoming zombie threat." msgstr "" +"是啊,我的时间都花在这上面了。正如你所看到的,这真的帮助了我的就业前景。我的论文是关于菌丝形成中的信号通路,博士后研究植物-" +"真菌在生物中的传播。后来我在书店找到了这份工作,因为一个真菌学博士的工作不多,尽管在事情真正疯狂之前我尝试咬过真菌。现在,人们疯狂的寻找我,想获得我丰富的真菌知识,以帮助他们对抗即将到来的丧尸威胁。" #: lang/json/talk_topic_from_json.py msgid "" "No, no I don't, and I'd appreciate you not leaving me hanging on that. " "There are fungal zombies?" -msgstr "" +msgstr "不,不,我不知道,我很感激你不让我继续坚持下去。有真菌丧尸吗?" #: lang/json/talk_topic_from_json.py msgid "" "Encroaching alien mushrooms, fungal towers, tough mycelium invading ground " "and trees, zombies taken over by aggressive mold... Yeah. It's ugly stuff." -msgstr "" +msgstr "入侵的外来蘑菇,真菌塔,坚硬的菌丝入侵地面和树木,僵尸被侵略性的霉菌接管…是的。这是丑陋的东西。" #: lang/json/talk_topic_from_json.py msgid "" "Okay, you've got my attention. Listen, do you think you could bring me some" " kind of sample of these things?" -msgstr "" +msgstr "好吧,你引起了我的注意。听着,你能给我带些样品吗?" #: lang/json/talk_topic_from_json.py msgid "It'd be dangerous, what's in it for me?" -msgstr "" +msgstr "这很危险,对我有什么好处?" #: lang/json/talk_topic_from_json.py msgid "Sure, easy enough. What do you need?" @@ -125760,20 +125865,21 @@ msgid "" "Almost anything could work, but if this stuff is as dangerous as you make it" " sound, maybe make sure it's not a sporulating body." msgstr "" +"如果你给我一个样本,我会加入你疯狂的营地探险队。见鬼,如果你给我拿个样本,也许我会帮你建立一个实验室来研究这些东西。几乎任何东西都能起作用,但如果这东西像你说的那样危险,也许要确保它不是一个孢子体。" #: lang/json/talk_topic_from_json.py msgid "" "I dunno, scientific interest? If you don't bring me anything, no worries. " "I'm positively swimming in entertainment here, as you can see." -msgstr "" +msgstr "我不知道,科学兴趣?如果你不给我带任何东西,不用担心。正如你所看到的,我在这里完全沉浸在娱乐之中。" #: lang/json/talk_topic_from_json.py msgid "It just so happens I have a chunk of fungal matter on me right now." -msgstr "" +msgstr "碰巧我现在身上有一大块真菌。" #: lang/json/talk_topic_from_json.py msgid "Sure, I'd better get going. I'll see if I can find you something." -msgstr "" +msgstr "当然,我现在出发。我看看能不能给你找点东西。" #: lang/json/talk_topic_from_json.py msgid "" @@ -125781,10 +125887,13 @@ msgid "" "\n" "Okay, listen: you've got yourself a deal. I'll come to your base, but you've gotta get me hooked up with a microscope as soon as you can. This could be the beginning of something really cool. Oh, and it should go without saying that I'm not coming unless you can find a place for my friends here in your base. I'm sure you anticipated that. Talk them into going and I'm in. It should be easy, they're a bunch of sweet hearted saps." msgstr "" +"这真的很有趣。你看,你可以在这里看到网状结构,它看起来有点像一个扩大的孢子菌柄…但是看看这个,这些纤维明显不同于我以前看到的任何东西。我想知道它们是否可以活动?\n" +"\n" +"好吧,听着:我们已经谈妥了。我会去你的基地,但你得尽快给我安装上显微镜。这可能是一件很酷的事情的开始。哦,不用说,除非你能在你的基地给我的朋友们找个地方,否则我是不会来的。我相信你已经预料到了。说服他们去,我就参加。这应该很简单,他们是一群心地善良的笨蛋。" #: lang/json/talk_topic_from_json.py msgid "Great! I'll go see what I can do about that." -msgstr "" +msgstr "太好了!我去看看能做些什么。" #: lang/json/talk_topic_from_json.py msgid "" @@ -125792,26 +125901,29 @@ msgid "" "\n" "Sorry. I could stare at this all day. I owe you one, a big one. Thanks for this. Let me know if you ever need a favor from a chubby beggar woman." msgstr "" +"这真的很有趣。你看,你可以在这里看到网状结构,它看起来有点像一个扩大的孢子菌柄…但是看看这个,这些纤维明显不同于我以前看到的任何东西。我想知道它们是否可以活动?\n" +"\n" +"对不起。我可以整天盯着它看。我欠你一个人情,一个很大的人情。感谢。如果你需要一个胖嘟嘟的女乞丐的帮助,请告诉我。" #: lang/json/talk_topic_from_json.py msgid "" "Glad you like it. If I think of something you can do in return, I'll let " "you know." -msgstr "" +msgstr "很高兴你喜欢。如果我想到你能做些什么作为回报,我会让你知道的。" #: lang/json/talk_topic_from_json.py msgid "" "Well good. Let's get going, I want to see some more of these crazy " "mushrooms." -msgstr "" +msgstr "很好。我们走吧,我想再看看这些疯狂的蘑菇。" #: lang/json/talk_topic_from_json.py msgid "I'll see what I can do." -msgstr "" +msgstr "我看看能做些什么。" #: lang/json/talk_topic_from_json.py msgid "Thanks again for the grub, my friend." -msgstr "" +msgstr "再次感谢你的帮助,我的朋友。" #: lang/json/talk_topic_from_json.py msgid "Hey, are you a big fan of survival of the fittest?" @@ -125827,17 +125939,17 @@ msgstr "抱歉,没兴趣。" #: lang/json/talk_topic_from_json.py msgid "Nice to see you too, what's up?" -msgstr "" +msgstr "很高兴见到你,怎么了?" #: lang/json/talk_topic_from_json.py msgid "Nice to see you. I gotta be going though." -msgstr "" +msgstr "很高兴见到你。我得走了…" #: lang/json/talk_topic_from_json.py msgid "" "Oh you know, the usual: sittin' out here until I starve to death, playin' " "cards with Dave, that kinda thing." -msgstr "" +msgstr "哦,你知道,通常是这样的:坐在这里直到我饿死,和戴夫玩牌,诸如此类。" #: lang/json/talk_topic_from_json.py msgid "" @@ -125847,7 +125959,7 @@ msgstr "因为我肯定不适合,所以我现在正坐在这里等着被饿死 #: lang/json/talk_topic_from_json.py msgid "I could maybe help you out... want something to eat?" -msgstr "" +msgstr "我也许能帮你…想吃点什么吗?" #: lang/json/talk_topic_from_json.py msgid "What's wrong with you?" @@ -125867,22 +125979,22 @@ msgstr "既然他们不让你进去,你为什么还要在这里扎营?" #: lang/json/talk_topic_from_json.py msgid "That's awful kind of you, you really are a wonderful person." -msgstr "" +msgstr "太好了,你真是个好人。" #: lang/json/talk_topic_from_json.py msgid "" "Oh, wow! You're a real gem, you know that? Thanks for even thinking of it." -msgstr "" +msgstr "噢!哇哦!你真是个好人,你明白吗,感谢你,即使你只是有这个想法。" #: lang/json/talk_topic_from_json.py msgid "" "It's good to know there are still people like you in the world, it really " "is." -msgstr "" +msgstr "知道世界上还有像你这样的人真好,真的。" #: lang/json/talk_topic_from_json.py msgid "What are you up to?" -msgstr "" +msgstr "你在忙什么呢?" #: lang/json/talk_topic_from_json.py msgid "" @@ -125895,7 +126007,7 @@ msgstr "" #: lang/json/talk_topic_from_json.py msgid "You seem awfully happy considering the situation." -msgstr "" +msgstr "考虑到你的现状,你似乎过于乐观。" #: lang/json/talk_topic_from_json.py msgid "" @@ -125932,6 +126044,7 @@ msgid "" " There's more goin' on under the surface there, mark my words. We may be " "unfit, but we aren't worthless." msgstr "" +"人生没有选择的余地,摸到什么牌就打什么牌。我已经为这个世界上最爱的两个人做了悼词,第三个留给我自己。我渡过了世界末日,并且活着走了出来。自从我的爱人去世,你懂的,我一直很孤单。而在这里,我又有了朋友,可能会很饿,但是这让我们更加亲密。丽娜一直在教我数学和科学知识。罗丽珍是我见过的最聪明的人之一,她有一个——你明白吧——博士学位。雄介是唯一一个打牌赢过我的人。戴夫,看,他就是戴夫,在外表下隐藏着更多的东西。记住我的话,我们可能不合时宜,但绝对不是一文不值。" #: lang/json/talk_topic_from_json.py msgid "" @@ -125943,23 +126056,24 @@ msgid "" "jobs I can handle. Couple days before I got the notice that" " the bank was going to foreclose on my crappy little trailer." msgstr "" +"我以前是盖屋顶的,但我在06年摔了一跤,背部受伤了。我试着做其他种类的木工活,但我就是没有这个本事。我妻子通过打零工增加额外的收入来养活我们。但她在2016年中风了。在过去的几年里,我只能靠自己做一些我能处理的垃圾工作。这也慢慢地耗尽了我的积蓄。前几天,我接到银行通知说要取消我那辆破烂的小拖车的赎回权。" #: lang/json/talk_topic_from_json.py msgid "You have any kids?" -msgstr "" +msgstr "你有孩子吗?" #: lang/json/talk_topic_from_json.py msgid "" "Would you like to travel with me? Someone good with a trade could be " "helpful, and it's got to be better than wasting away here." -msgstr "" +msgstr "你愿意和我一起去旅行吗?一个擅长交易的人可能会有帮助,这肯定比在这里浪费要好。" #: lang/json/talk_topic_from_json.py msgid "" "I have a camp. It's a damn sight better than those place, and there are " "regular meals. Someone with your trades experience would be welcome, even " "if you can't do the big jobs anymore." -msgstr "" +msgstr "我有一个营地,风景比这鬼地方好,而且有充足的食物供应,有工作经验的人在那里很受欢迎,即使你不能再搞个大工程了。" #: lang/json/talk_topic_from_json.py msgid "" @@ -125970,25 +126084,26 @@ msgid "" " he's still out there with my grandkids, hiding away somewhere safe. These " "days, no news is good news." msgstr "" +"是的,有两个。我的女儿死于药物摄入过量,那是她第一次使用芬太尼,这对我的儿子打击很大——他们是双胞胎,你明白吧——他断绝了和我妻子的关系,甚至没参加她的葬礼。我不能责怪他,这件事情把我们都弄得得很狼狈。据我所知,他和我的孙子们在一起躲在了安全的地方。对我来说,这段时间没有消息就是好消息。" #: lang/json/talk_topic_from_json.py msgid "" "It's sweet of you to say that, but I'm just not up to the wandering life, " "not with these knees." -msgstr "" +msgstr "你这么说真是太好了,但我不能忍受流浪的生活,也不能忍受跪着的生活。" #: lang/json/talk_topic_from_json.py msgid "" "That's awful nice of you. Tell you what: if you can help Dave get himself " "sorted out, so I don't feel like I've gotta stay here keeping an eye on the " "poor fella, then I'll come along." -msgstr "" +msgstr "你真是个好人,告诉你吧,如果你能帮助戴夫,把他安顿好,让我不必在这里关心这个可怜的家伙,我就会跟你走。" #: lang/json/talk_topic_from_json.py msgid "" "I think I've sorted Dave out pretty well, don't you? Would you consider " "coming with me now?" -msgstr "" +msgstr "我想我已经把戴夫安顿好了,不是吗?现在可以考虑和我一起走了吗?" #: lang/json/talk_topic_from_json.py msgid "" @@ -125998,15 +126113,16 @@ msgid "" "with you, but if you can convince the others to go, then I guess I'll come " "along." msgstr "" +"嗯……说实话,其实我一直以为戴夫已经完了,你说的“帮他”只是虚张声势而已,但是你竟然真的的照顾了这个可怜的灵魂。听着,我不是……真心想和你一起去,但如果你说服了其他人,我相信我会跟着他们。" #: lang/json/talk_topic_from_json.py msgid "" "Golly. I didn't expect that, but I'm as good as my word. Let's get going." -msgstr "" +msgstr "天啊。我没料到会这样,但我说话算话。我们走吧。" #: lang/json/talk_topic_from_json.py msgid "Let's get going." -msgstr "" +msgstr "我们走吧。" #: lang/json/talk_topic_from_json.py msgid "Hey there, friend." @@ -126022,7 +126138,7 @@ msgstr "我不得不说一句,你浑身上下都长毛了。" #: lang/json/talk_topic_from_json.py msgid "Would you like something to eat?" -msgstr "" +msgstr "你想吃点什么吗?" #: lang/json/talk_topic_from_json.py msgid "" @@ -126048,6 +126164,7 @@ msgid "" "been able to bring back enough to keep these folk in better shape. I " "suspect they'll find an excuse to kick me out eventually." msgstr "" +"这比我自己建房子安全多了。当我需要的时候,我会出去觅食。只要我们保持干净,当僵尸来的时候尽我们的职责,他们让我们蹲在这里进行额外的防御。我认为他们正试图慢慢地把我们饿死,即使我不能让每个人的肚子都吃饱,我也能带回来足够多的东西来保持这些人的健康。我怀疑他们最终会找个借口把我赶出去。" #: lang/json/talk_topic_from_json.py msgid "" @@ -126061,7 +126178,7 @@ msgid "" "I do okay for myself actually. I eat a lot of things close to spoilage " "while I'm foraging. If you've got food to spare, please give it to my " "friends." -msgstr "" +msgstr "事实上,我做得很好。我在觅食的时候吃了很多接近变质的东西。如果你有多余的食物,请给我的朋友。" #: lang/json/talk_topic_from_json.py msgid "" @@ -126070,10 +126187,11 @@ msgid "" "Eagle scout. I learned all kinds of useful stuff about plants and foraging," " and that's come in pretty handy." msgstr "" +"没有太兴奋。我在贸易学院学习计算机技术。这些技能并没有太大帮助,但当我还是个孩子的时候,我是一名鹰级童子军。我学到了关于种植和觅食的各种有用的知识,这些知识非常有用。" #: lang/json/talk_topic_from_json.py msgid "What about your family, stuff like that?" -msgstr "" +msgstr "你的家人呢?" #: lang/json/talk_topic_from_json.py msgid "" @@ -126083,14 +126201,15 @@ msgid "" "met anyone who knows what happened to the people there but I don't have much" " hope." msgstr "" +"我不想去想它。我在罗德岛长大,他们现在还在那里。自从州长精神错乱和脱离联邦之后就没有他们的消息了。所有的通讯线路都被切断了。我还没有遇到任何人知道那里的人发生了什么,但我不抱太大希望。" #: lang/json/talk_topic_from_json.py msgid "Why don't you go back there?" -msgstr "" +msgstr "你为什么不回去?" #: lang/json/talk_topic_from_json.py msgid "Could you tell me more about what happened with Rhode Island?" -msgstr "" +msgstr "你能告诉我更多关于罗德岛的事情吗?" #: lang/json/talk_topic_from_json.py msgid "" @@ -126102,6 +126221,7 @@ msgid "" "there, I don't know what I'd find, and I think maybe that scares me the " "most." msgstr "" +"和我被困在这里的原因一样…首先,这太危险了。将近一百英里,穿过僵尸出没的地域,步行到达海岸线。谢谢。然后,我怎么从海岸到布洛克岛?我的家人在爸爸退休后搬到了那里,我的印象是渡轮可能已经不开了。即使我到了那里,我也不知道会发现什么,我想这可能是我最害怕的。" #: lang/json/talk_topic_from_json.py msgid "" @@ -126113,10 +126233,11 @@ msgid "" "rumors I've heard is that most of them survived the cataclysm and are still " "running the show there, but that seems kind of impossible to me." msgstr "" +"你不知道?州长发疯了,就像很多人在最后做的那样,只是他有更多的权力。有一天,他和一群暴徒效忠者一起出现,发动了一场政变,完全占领了政府,杀死了反对他的人,并把尽可能多的人转移到岛上。我听到的传言是,他们中的大多数人在大灾难中幸存下来,现在仍在那里,但这对我来说似乎是不可能的。" #: lang/json/talk_topic_from_json.py msgid "Do you think you'd go back and look for your family?" -msgstr "" +msgstr "你会回去找你的家人吗?" #: lang/json/talk_topic_from_json.py msgid "" @@ -126131,18 +126252,18 @@ msgstr "" msgid "" "I've spoken to all your friends, and except for Dave, they're good to go. " "Dave wants to stay here. How about you?" -msgstr "" +msgstr "我和你所有的朋友都谈过了,他们都很高兴去,除了戴夫。戴夫想留在这里。你呢?" #: lang/json/talk_topic_from_json.py msgid "" "Huh. Getting those three to sign on to a suicide mission is quite the " "feat... sounds like you're pretty dedicated to this. OK, I'm with you. " "Let's round up the others and hit the road." -msgstr "" +msgstr "嗯。让这三个人签约执行自杀任务是相当了不起的壮举……听起来你对这个很投入。好的,我同意你的观点。我们把其他人集合起来,上路吧。" #: lang/json/talk_topic_from_json.py msgid "Right. Let's go." -msgstr "" +msgstr "好,出发吧。" #: lang/json/talk_topic_from_json.py msgid "Hey there." @@ -126410,15 +126531,15 @@ msgstr "我们何不改天再谈呢?" #: lang/json/talk_topic_from_json.py msgid "How are things here?" -msgstr "" +msgstr "这里怎么样?" #: lang/json/talk_topic_from_json.py msgid "How did you wind up here at the center?" -msgstr "" +msgstr "你是怎么到这里来的?" #: lang/json/talk_topic_from_json.py msgid "Is there anything I can do to help you out?" -msgstr "" +msgstr "我能帮你什么忙吗?" #: lang/json/talk_topic_from_json.py msgid "Hello again." @@ -126426,7 +126547,7 @@ msgstr "你好,又见面了。" #: lang/json/talk_topic_from_json.py msgid "Good to see you're still around." -msgstr "" +msgstr "很高兴看到你还在。" #: lang/json/talk_topic_from_json.py msgid "Oh, hi." @@ -126436,29 +126557,29 @@ msgstr "哦,嗨。" msgid "" "Oh, hey, a new face. Hi, I'm Fatima. Just visiting I hope? It's nice to " "meet new people but there are no beds to share." -msgstr "" +msgstr "嘿,新面孔。我是法蒂玛。我希望你只是来看看的,认识新朋友很好,但是我们没有多余的床位可以分享了。" #: lang/json/talk_topic_from_json.py msgid "Nice to meet you too, Fatima. I'm just passing through." -msgstr "" +msgstr "很高兴见到你,法蒂玛。我只是路过。" #: lang/json/talk_topic_from_json.py msgid "Hi, Fatima. How are things?" -msgstr "" +msgstr "嗨,法蒂玛。情况怎么样?" #: lang/json/talk_topic_from_json.py msgid "I'm afraid I can't talk right now." -msgstr "" +msgstr "抱歉我现在不方便交谈。" #: lang/json/talk_topic_from_json.py msgid "Well, cool. Anything I can help you with?" -msgstr "" +msgstr "好吧,酷。有什么我能帮你的吗?" #: lang/json/talk_topic_from_json.py msgid "" "Oh, you know, the usual. Trapped in a tight space with a bunch of strangers" " getting along tenuously at best. Good times, good times." -msgstr "" +msgstr "像往常一样。被困在一个狭小的空间里,和一群陌生人勉强相处。好时光,好时光。" #: lang/json/talk_topic_from_json.py msgid "" @@ -126466,12 +126587,13 @@ msgid "" "about to start looking for a job. That was fun, being a young Muslim woman " "in a Massachussets trade college, let me tell you." msgstr "" +"之前,我刚从焊接学校毕业,正准备开始找工作。我告诉你,身为一名年轻的穆斯林女子,在马萨诸塞州的一所贸易学院就读,这很有趣。" #: lang/json/talk_topic_from_json.py msgid "" "Welding seems like a pretty non-traditional occupational choice; is there a " "story there?" -msgstr "" +msgstr "焊接似乎是一个非传统的职业选择;有什么原因吗?" #: lang/json/talk_topic_from_json.py msgid "" @@ -126479,6 +126601,9 @@ msgid "" "\n" "I... I do hope my grandparents are okay though. They were old fashioned, and they made choices I didn't like, but they were family and I still have sweet memories of them from when I was little. I've had to do a lot more thinking about God since , and while I'd never agree with the decisions they made, I understand more why they thought they had to make them. They just wanted the whole family to share their relationship with God, in their messed up way." msgstr "" +"你会很惊讶的!多年来,金属艺术一直是穆斯林传统的一部分,尽管这并不是我投身其中的原因。我不是一个很传统的女孩。父母也不是很传统,但我的祖父母很传统,也很严格。我妹妹是同性恋,这让她的生活变的很艰难。妈妈和爸爸认为她应该保守这个秘密,但她不相信。我一直很喜欢机械和手工,所以当他们开始骚扰我的父母,要我和妹妹嫁给一个好男人,这样我们就不会那么不道德,于是我决定选择一份我喜欢的工作,尽可能地让他们感到困扰。这是个不错的选择,不仅让他们脸色铁青,而且我喜欢焊接。我喜欢站在后面看我的作品的感觉,我拿了几块废金属,把它们变成有用的东西。我喜欢把它们完美地结合在一起的感觉。这让我平静下来。\n" +"\n" +"不过我真的希望我的祖父母一切安好。他们都是老古董,他们做出了我不喜欢的选择,但他们是我的家人,从我小的时候起我就对他们有着美好的回忆。之后,我对上帝有了更多的思考,虽然我永远不会同意他们所做的决定,但我更理解为什么他们必须这样做。他们只是想让全家人在混乱中分享他们与上帝的关系。" #: lang/json/talk_topic_from_json.py msgid "" @@ -126486,6 +126611,9 @@ msgid "" "\n" "Anyway, mine was the second bus to arrive, and they were just getting some triage and processing stuff set up. I was put in charge of helping with the wounded, along with Uyen. Things went a little strange later on... one of the women doing triage and processing had a bit of a hang-up about particular, um, colors of people being allowed into the center. She claimed to have lost our 'papers', along with a lot of other peoples'. Thankfully because we'd helped so many we were able to argue that they could't leave us out, but there was no space left downstairs by the time we got that sorted, so here we are." msgstr "" +"我正准备去伯灵顿看望父母,在车站等公车的时候,疏散通知响了。当时我有点迟钝,没意识到事情有多糟糕。然后公共汽车抵达了,它已经成为疏散用车辆,并把我带到这里。我……以前的我不是很虔诚,从出生起就那样,但是发生这种事情之后,我一直在考虑关于神的事情,感谢祂保佑我活下来,一切仍然很艰难,这有助于我决定未来。\n" +"\n" +"接着,第二辆公共汽车到了,他们开始了鉴别审核的处理流程,我和陈宛一起帮助伤员,之后发生了一些……不好的事情。其中一个女负责人,试着阻挠特定肤色的人进入难民中心。她声称我们这些人的“文件”已经丢失。值得庆幸的是,因为我帮助了很多人,最终经过争辩我们避免了被赶走的命运,但当我们被审核好时,楼下已经没有空间了,所以我们现在在这里。" #: lang/json/talk_topic_from_json.py msgid "" @@ -126495,6 +126623,7 @@ msgid "" "some project ideas she had that could get me doing my job again, but I admit" " I'm pretty nervous about going outside." msgstr "" +"这很紧张,我知道如果我能用我的技能做点什么,或者即使我有个安静的地方祈祷,我会感觉好很多。我觉得在公共场所祈祷有点难为情。珍妮在谈论她的一些项目想法,这些想法可以让我重新开始我的工作,但是我承认我对外出感到非常紧张。" #: lang/json/talk_topic_from_json.py msgid "Well, hello." @@ -126762,7 +126891,7 @@ msgid "" "leadership decisions, as if they made those kind of calls. What did you " "want to know?" msgstr "" -"不管好坏,我们现在是一个社区。法蒂玛和我在一起工作了不少次,而且我认为达娜、德拉科和阿莱莎能称得上是我的朋友,我也自然而然地认识了达娜的丈夫佩德罗。波里申科一伙和我们其他人一样,都是乱七八糟拼成的团队。辛格一家彼此相依为命,但不怎么和其他人来往。瓦妮莎和我意见不一,但能有她在我还是很高兴。尤恩和莱泽尔总是为领导层的决定争吵,好像他们决定得了似的。你想知道什么?" +"不管好坏,我们现在是一个社区。法蒂玛和我在一起工作了不少次,而且我认为达娜、德拉科和阿莱莎能称得上是我的朋友,我也自然而然地认识了达娜的丈夫佩德罗。波里申科一伙和我们其他人一样,都是乱七八糟拼成的团队。辛格一家彼此相依为命,但不怎么和其他人来往。瓦妮莎和我意见不一,但能有她在我还是很高兴。陈宛和莱泽尔总是为领导层的决定争吵,好像他们决定得了似的。你想知道什么?" #: lang/json/talk_topic_from_json.py msgid "" @@ -126772,7 +126901,7 @@ msgid "" "Singhs, Vanessa, Uyen, or Rhyzaea quite as well, but we've talked enough. " "What did you want to know?" msgstr "" -"嗯,我们有很多人。我们开始形成一个社区了。法蒂玛和我在一起工作了不少次,我经常和达娜、德拉科和阿莱莎在一起。我不太了解波里申科那伙人、或是辛格一家、或是瓦内萨、尤恩或是莱泽尔,但我们已经谈得够多了。你想知道些什么?" +"嗯,我们有很多人。我们开始形成一个社区了。法蒂玛和我在一起工作了不少次,我经常和达娜、德拉科和阿莱莎在一起。我不太了解波里申科那伙人、或是辛格一家、或是瓦内萨、陈宛或是莱泽尔,但我们已经谈得够多了。你想知道些什么?" #: lang/json/talk_topic_from_json.py msgid "Can you tell me about the Free Merchants?" @@ -126894,7 +127023,7 @@ msgid "" "others are fine with it, and okay, sure, I guess. John is a walking " "stereotype, but he's a great poker buddy. I admit I kinda like him." msgstr "" -"瓦内萨……我尽力了,我真的尽力了,但我们就是没法相处。总有一天,我们中的一个可能会用根拆轮胎棍砸碎另一个人的脑袋,那我可得感谢我花了更多时间在和拆轮胎棍打交道。尤恩和莱泽尔都是优秀的人,我真的很喜欢他们,但我不能忍受他们之间无止境的政治废话。阿隆索只是个……他是个……他是什么样的人可没个好听的说法。但其他人不在乎,我想是的。约翰总是一板一眼的老式做派,但是个不错的扑克牌友。我承认我有点喜欢他。" +"瓦内萨……我尽力了,我真的尽力了,但我们就是没法相处。总有一天,我们中的一个可能会用根拆轮胎棍砸碎另一个人的脑袋,那我可得感谢我花了更多时间在和拆轮胎棍打交道。陈宛和莱泽尔都是优秀的人,我真的很喜欢他们,但我不能忍受他们之间无止境的政治废话。阿隆索只是个……他是个……他是什么样的人可没个好听的说法。但其他人不在乎,我想是的。约翰总是一板一眼的老式做派,但是个不错的扑克牌友。我承认我有点喜欢他。" #: lang/json/talk_topic_from_json.py msgid "" @@ -126907,7 +127036,7 @@ msgid "" "is a walking stereotype, I imagine there must be more depth to him, but I " "haven't seen it yet." msgstr "" -"瓦内萨……嗯,她是个好人,大概吧。不过我得说,她有点让我发疯,但我们现在被绑在一起,所以我尽量不要太挑剔。尤恩和莱泽尔似乎都想在这里当老大,但我尽量避开那些政治活动,只专注于制作东西。我看他们不会有什么好结果。阿隆索很好,他显然对我很感兴趣,他对这里的每个单身女人都有兴趣。在这个小社会里,不关我事。约翰总是一板一眼的老式做派,我想他应该有些更深的背景,但我还没有看到。" +"瓦内萨……嗯,她是个好人,大概吧。不过我得说,她有点让我发疯,但我们现在被绑在一起,所以我尽量不要太挑剔。陈宛和莱泽尔似乎都想在这里当老大,但我尽量避开那些政治活动,只专注于制作东西。我看他们不会有什么好结果。阿隆索很好,他显然对我很感兴趣,他对这里的每个单身女人都有兴趣。在这个小社会里,不关我事。约翰总是一板一眼的老式做派,我想他应该有些更深的背景,但我还没有看到。" #: lang/json/talk_topic_from_json.py msgid "Howdy, pardner." @@ -127045,36 +127174,36 @@ msgstr "嗨,巴勃罗,见到你我也很高兴。不过我得走了。" #: lang/json/talk_topic_from_json.py msgid "What brings you around here? We don't see a lot of new faces." -msgstr "" +msgstr "是什么风把你吹来的?我们没有看到很多新面孔。" #: lang/json/talk_topic_from_json.py msgid "Need to talk?" -msgstr "" +msgstr "需要谈谈吗?" #: lang/json/talk_topic_from_json.py msgid "" "Hi there. I don't think we've met before. I'm Rhyzaea, people call me Rhy." -msgstr "" +msgstr "你好。我想我们以前没见过面。我是莱泽尔,人们叫我“莱”。" #: lang/json/talk_topic_from_json.py msgid "Nice to meet you, Rhy." -msgstr "" +msgstr "很高兴见到你,莱。" #: lang/json/talk_topic_from_json.py msgid "Hi, Rhy. How's it going?" -msgstr "" +msgstr "嗨,莱。近况如何?" #: lang/json/talk_topic_from_json.py msgid "So, what's your story? We don't see a lot of new people back here." -msgstr "" +msgstr "那么,你的故事是什么?我们很少看见新人到这儿来。" #: lang/json/talk_topic_from_json.py msgid "Just a curious traveller. What's up with you?" -msgstr "" +msgstr "只是一个好奇的旅行者。你怎么了?" #: lang/json/talk_topic_from_json.py msgid "I'm doing as well as can be expected, I suppose. Nice of you to ask." -msgstr "" +msgstr "我想我已经做得和预期的一样好了。谢谢你的邀请。" #: lang/json/talk_topic_from_json.py msgid "" @@ -127086,18 +127215,19 @@ msgid "" "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 msgid "Tell me about yourself." -msgstr "" +msgstr "跟我说说你的情况吧。" #: lang/json/talk_topic_from_json.py msgid "Tell me about your family." -msgstr "" +msgstr "和我说说你的家庭情况。" #: lang/json/talk_topic_from_json.py msgid "Tell me about your band." -msgstr "" +msgstr "和我说说你的乐队。" #: lang/json/talk_topic_from_json.py msgid "" @@ -127106,10 +127236,11 @@ msgid "" "tough stuff. Maybe not zombies eating your child level tough, but " "surprisingly not far off. My people have gone through some real messy crap." msgstr "" +"实际上我是个顾问,我为我的乐队Gitxsan工作。为经历过一些非常困难的事情的人做了很多心理健康上的辅导。也许僵尸吃孩子不会像你想象的那么难,但令人惊讶的是,这并不难。" #: lang/json/talk_topic_from_json.py msgid "Well, it's been nice talking to you, but I need to head out." -msgstr "" +msgstr "嗯,和你谈话很愉快,但我需要出去走走。" #: lang/json/talk_topic_from_json.py msgid "" @@ -127121,6 +127252,7 @@ msgid "" "forest tourist? I don't know if I'll ever see my own forest again, and the " "thought breaks my heart." msgstr "" +"我的乐队是Gitxsan,我们来自不列颠哥伦比亚省西北部,在斯基纳河附近。我自己来自哈泽顿。这是个美丽的地方。高山,温带雨林…我来到这里的部分原因是我喜欢那些潮湿的沿海森林,我喜欢在其他国家探索它们。我去过韩国和斯洛伐克也是出于同样的原因。我想我是个森林旅游者?我不知道我是否会再看到我自己国家的森林,这个想法让我心碎。" #: lang/json/talk_topic_from_json.py msgid "" @@ -127130,6 +127262,7 @@ msgid "" "sixteen and didn't want to come with me on this trip. God help me, I can't " "bear to think of her, she must think I'm dead." msgstr "" +"我的父母回到了哈泽顿,他们和我的奶奶和哥哥住在一起;他小时候做了些傻事,让自己的头受到了重重的打击,现在他真的不能照顾自己了。我有个女儿,安吉尔,她十六岁,不想和我一起去旅行。上帝保佑我,我不忍想起她,她一定以为我死了。" #: lang/json/talk_topic_from_json.py msgid "" @@ -127138,6 +127271,7 @@ msgid "" "with a huge dose of nightmare on top of it all. We're putting on a brave " "face, but without help, things are going to break, really soon." msgstr "" +"这里的人几乎没有什么事可做。我以前见过很多创伤,但这几乎是最糟糕的一次。每个人都失去了一切,除此之外还有大量的噩梦。我们正在摆出一副勇敢的面孔,但是没有帮助,事情很快就会破裂。" #: lang/json/talk_topic_from_json.py msgid "" @@ -127181,23 +127315,23 @@ msgstr "听到这消息我很难过。" #: lang/json/talk_topic_from_json.py msgid "Hi there. You look new, nice to meet you. My name's Uyen." -msgstr "" +msgstr "你好。你看着像新面孔,很高兴见到你。我叫陈宛。" #: lang/json/talk_topic_from_json.py msgid "Nice to meet you too, Uyen." -msgstr "" +msgstr "很高兴见到你,陈宛。" #: lang/json/talk_topic_from_json.py msgid "Hi, Uyen. Got a minute?" -msgstr "" +msgstr "嗨,陈宛。有空吗?" #: lang/json/talk_topic_from_json.py msgid "Just a traveller. Can I ask you a few things?" -msgstr "" +msgstr "只是一个旅行者。我能问你几件事吗?" #: lang/json/talk_topic_from_json.py msgid "I'm always good for a talk. It gets pretty boring down here." -msgstr "" +msgstr "我总是喜欢谈话。这里很无聊。" #: lang/json/talk_topic_from_json.py msgid "" @@ -127210,25 +127344,26 @@ msgid "" "hadn't made a stink about it, I'd probably be out in the lobby with those " "poor souls that couldn't get in at all." msgstr "" +"我是个护工。我经历了一些绝对可以称得上最糟糕的事情,直到今天我都说不清楚我是怎么活下来的。事情一件接着一件,最后我被推上了一辆公交车,帮忙照顾几个需要帮助的旅客,断手断脚那种。我很早就到这里了,算是最先到达的一批。然后,某个负责审核的女人“弄丢”我的文件时,我还忙着照顾一个头上有严重伤口的家伙。如果我没当场狠狠地喷了那个臭傻逼一顿,我可能就必须和外面那些可怜人一样,睡在大厅里了。" #: lang/json/talk_topic_from_json.py msgid "" "We've got it okay, I guess, as long as this doesn't last too long. The " "situation is pretty tight, though. If we're stuck here for too long people " "are going to start getting a bit stir crazy." -msgstr "" +msgstr "我想,只要这种情况不会持续太久,我们可以接受。不过现在形势非常紧张。如果我们在这里呆得太久,人们会开始变得有点疯狂。" #: lang/json/talk_topic_from_json.py msgid "I'd like to hire out those scissors of yours." -msgstr "" +msgstr "我想把你的剪刀租出去。" #: lang/json/talk_topic_from_json.py msgid "Hmm, can we change this haircut a little please?" -msgstr "" +msgstr "嗯……我能稍稍改变一下发型吗?" #: lang/json/talk_topic_from_json.py msgid "Hmm, can we change this shave a little please?" -msgstr "" +msgstr "嗯……我能稍稍改变一下须型吗?" #: lang/json/talk_topic_from_json.py msgid "Oh, you're back." @@ -127263,18 +127398,18 @@ msgid "" "Not much is up. Not enough, in fact. Here we are stuck in this slum pit " "with a bunch of strangers, and all we can do is sit around staring at our " "hands." -msgstr "" +msgstr "有很多问题。事实上,这还不够。我们和一群陌生人困在这个贫民窟里,我们所能做的就是坐在那里盯着自己的手。" #: lang/json/talk_topic_from_json.py msgid "" "I don't really want to talk about my life before this shit-show, if that's " "what you mean. I don't need a shoulder to cry on. I'm a hairdresser, is " "that enough personal information for you?" -msgstr "" +msgstr "在这个糟糕的生活中,我真的不想谈我以前的生活。我不需要一个肩膀来哭泣。我是理发师,这对你来说就足够了吗?" #: lang/json/talk_topic_from_json.py msgid "Could you give me a haircut?" -msgstr "" +msgstr "你能给我理发吗?" #: lang/json/talk_topic_from_json.py msgid "" @@ -127283,6 +127418,7 @@ msgid "" "do some work to keep me busy though, and the extra merch does go a long way " "to keeping my belly full. People like getting a good haircut." msgstr "" +"哦,我被困在一个又潮又烂的砖砌建筑物里,和两打陌生人待在一起,整个世界都死了,而且食物不足以支撑我在四处走动。至少,工作充实了我的脑子,换来的商会币则充实了我的肚子——人们喜欢理发。" #: lang/json/talk_topic_from_json.py msgid "" @@ -127290,24 +127426,24 @@ msgid "" "in a dank shitty brick building with two dozen strangers, the world's dead, " "and there's not enough food to go around. Why don't you fuckin' figure it " "out?" -msgstr "" +msgstr "想听风凉话?还是真实风凉话?我被困在一堆又潮又烂的砖里面,和两打陌生人待在一起,整个世界都死了,而且食物不够吃,走不动。你他妈的搞搞清楚!" #: lang/json/talk_topic_from_json.py msgid "" "I can see you need one, but last time I used these shears it was to stab a " "zombie in the face. I don't think you'd want them in your hair. Maybe you " "could help me get set up properly?" -msgstr "" +msgstr "我明白你需要理发,但上次我用这些剪子捅死了骑我脸的僵尸,我不认为你想让那些玩意儿粘在你的头发上。也许你可以帮我处理一下?" #: lang/json/talk_topic_from_json.py msgid "What can I do to help you out?" -msgstr "" +msgstr "我能帮你什么忙吗?" #: lang/json/talk_topic_from_json.py msgid "" "Sure, I can give you a haircut. It'll be six merch for a haircut, or three " "for a shave, okay?" -msgstr "" +msgstr "当然,我帮你理发。剃头6商币,剃须3商币,OK?" #: lang/json/talk_topic_from_json.py msgid "Please give me a haircut." @@ -127319,19 +127455,19 @@ msgstr "请给我刮胡子。" #: lang/json/talk_topic_from_json.py msgid "Actually, you owe me a free haircut, remember?" -msgstr "实际上,你欠我一个免费的发型,记得吗?" +msgstr "实际上,你欠我一次免费的理发,记得吗?" #: lang/json/talk_topic_from_json.py msgid "That's a bit rich for my blood. What were you saying before?" -msgstr "" +msgstr "这对我的血液来说太油腻了。你刚才说什么来着?" #: lang/json/talk_topic_from_json.py msgid "That's a bit rich for my blood. I better head out." -msgstr "" +msgstr "这对我的血液来说太油腻了。我最好出去。" #: lang/json/talk_topic_from_json.py msgid "I'm here to deliver some food supplies." -msgstr "" +msgstr "我来这里是为了运送一些食物。" #: lang/json/talk_topic_from_json.py msgid "Are you able to buy some canning supplies?" @@ -127343,7 +127479,7 @@ msgstr "我听说你为我工作?" #: lang/json/talk_topic_from_json.py msgid "What's the deal with this written-on paper money you guys use?" -msgstr "" +msgstr "你们用的这种纸币是怎么回事?" #: lang/json/talk_topic_from_json.py msgid "The refugees stuck up here seem a bit disgruntled." @@ -127355,13 +127491,13 @@ msgstr "你知道大厅里那些乞丐吗?" #: lang/json/talk_topic_from_json.py msgid "What's the deal with the closed-off areas of the building?" -msgstr "" +msgstr "大楼的封闭区域怎么办?" #: lang/json/talk_topic_from_json.py msgid "" "What are you going to do with that back bay area now that I've cleaned it " "out for you?" -msgstr "" +msgstr "你打算怎么处理那个后部地区?现在我帮你清理干净了。" #: lang/json/talk_topic_from_json.py msgid "Tell me more about that ranch of yours." @@ -127473,6 +127609,7 @@ msgid "" "goods, but we've been using them with suppliers we regularly trade with as " "well, those that have faith in us." msgstr "" +"我们称它们为“自由商业认证票据”。我们一到这里就开始签约制作票据,用它来进行实际商品和服务的交易。几天之内我们就组织好了这个系统,现在它已经演变成一种现金形式。在内部,它们被用来交换劳动力和服务,以换取口粮和其他贸易商品,但我们也一直在用它们与我们经常交易的供应商进行交易,这些供应商对我们有信心。" #: lang/json/talk_topic_from_json.py msgid "" @@ -127482,12 +127619,13 @@ msgid "" "still all these people upstairs waiting for a place to live, and no space. " "We've set up a little space for them, but it's not ideal." msgstr "" +"是啊,情况很棘手。当我们开始在这里的时候,没有人真正主管全局,我们让更多的人进来,超出了我们真正能够养活和支持的能力。当尘埃落定,我们建立了一个小小的秩序,仍然有这些人在楼上等待一个地方居住,可我们没有空间。我们为他们设立了一个小小的空间,但并不理想。" #: lang/json/talk_topic_from_json.py msgid "" "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." -msgstr "" +msgstr "我不知道你做了什么来说服他们搬出去,但是我们的供应链和我都非常感谢你们。希望不会太不得体。" #: lang/json/talk_topic_from_json.py msgid "" @@ -127495,6 +127633,7 @@ msgid "" "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 "" @@ -127503,10 +127642,11 @@ msgid "" "staging area at first. Things went... wrong. I hear the shopkeeper is " "offering a reward to clear it out, if you're feeling suicidal." msgstr "" +"好吧,那是楼下的区域,我们无法容纳更多的人,所以这是禁区。然后是第二个区域,我们一开始用它作为集结地。事情发生了……错了。我听说如果你有自杀的念头愿意去冒险,店主会给你一笔赏金,让你把它清理掉。" #: lang/json/talk_topic_from_json.py msgid "What went wrong with your staging area?" -msgstr "" +msgstr "你的集结地出了什么问题?" #: lang/json/talk_topic_from_json.py msgid "" @@ -127520,6 +127660,7 @@ msgid "" " evacuated he stayed behind to make sure everyone who could get out got out." " It was a hell of a loss." msgstr "" +"我们刚到达这里时还没有组织起来,最早到的那批人组织了一个审核、甄别、分组的体系,病人和身体孱弱的人被搁置在一旁,这太残酷了,虽然大家都知道空间有限,我们不明白是什么导致了人类变成丧尸,只能试着隔离感染源。一对夫妇死在那里,然后“晋升”了。当时的领头人之一,雅各布,他负责处理整件事情。当我们这一组不得不撤离时,他留在最后确保每个人都能离开,这真是一个巨大的损失。" #: lang/json/talk_topic_from_json.py msgid "Thanks, can I ask you something else?" @@ -127914,6 +128055,7 @@ msgid "" "willing to trade what we can for it. Pay top dollar for jerky if you have " "any; just talk to the broker in the back." msgstr "" +"话说在前头,我们不收难民了——没有空间,食物也不够。我们愿意用任何能拿出的东西交换急需的补给,比如用很多美元换肉干,如果你愿意,和后面的经纪人谈谈。" #: lang/json/talk_topic_from_json.py msgid "" @@ -127927,6 +128069,7 @@ msgid "" "business model. Don't care who your goods come from or how you got them, " "just don't bring trouble." msgstr "" +"说实话,我们一开始乘坐的六辆公交车上都是上班族和家庭主妇……尽我们所能,从群众中挑拣,先把最有机会生存的人带走。听起来很残酷,但这是唯一的选择。我们现在唯一想做的就是在这里进行足够的贸易来维持我们的生存…我们的地址在疏散避难所的电脑里,人们不断地来这里,我们不得不把他们拒之门外,但我们发现我们可以用他们的救助物品换取我们所拥有的东西的。我们计划将其转变为一种商业模式。不要在意你的货物来自谁,也不要在意你是怎么得到它们的,只要不要带来麻烦。" #: lang/json/talk_topic_from_json.py msgid "It's just as bad out there, if not worse." @@ -127955,6 +128098,7 @@ msgid "" "things were handled poorly in the chaos, and we lost a few, and their loss " "triggered a few more. It wasn't a good time." msgstr "" +"楼下有几十个。还有17个人住在这上面,直到我们想办法给他们腾出地方。我们曾经有过不少人,但在混乱中处理得很糟糕,我们损失了一些人,他们的损失引发了更多的人被杀死。那不是一段好时光。" #: lang/json/talk_topic_from_json.py msgid "" @@ -127963,6 +128107,7 @@ msgid "" "why they've got me up here doing this... and that's all I'm going to say " "about myself. I'm on the clock, after all." msgstr "" +"和很多人一样,我宁愿在一切都没发生过。一切都过去了,死了,复活了,又死了。我以前开过一家小店,所以他们才让我来做这个……这就是我要说的关于我自己的一切。毕竟我在赶时间。" #: lang/json/talk_topic_from_json.py msgid "" @@ -128071,6 +128216,7 @@ msgid "" "safety going around. Until then we're letting them crash here so long as " "they don't mess the place up." msgstr "" +"这是想要接受我们保护的人,但我们这里已经彻底满员了,没有空间,也没有给养。大多数人已经去其他地方想办法,但是这些人没有。我们一直想找到足够安全的地方安置他们,但是附近没有。我让他们临时睡在这儿,只要他们不把这里搞乱就行。" #: lang/json/talk_topic_from_json.py msgid "" @@ -128083,7 +128229,7 @@ msgid "" "We don't have much to share, but I'm sure we could pay you in our own " "currency if you could clean up our burgeoning health hazard without anyone " "getting hurt, yeah." -msgstr "" +msgstr "我们能支付的东西不多,但我保证,如果你能在他们爆发瘟疫之前把他们弄走——前提是不要让他们受伤——我会给你一些我们的内部货币。" #: lang/json/talk_topic_from_json.py msgid "" @@ -128093,10 +128239,11 @@ msgid "" "sure they're out frolicking in a nice field somewhere. It's a shame that " "cardboard fellow didn't go too, but he's relatively easy to handle alone." msgstr "" +"你做得很好,把那些可怜的灵魂带到安全的地方。我猜你就是这么做的。如果你有其他的计划,还是很感谢您能把大厅打扫干净,但请让我活在我快乐的想象中。我敢肯定他们在外面某个美好的地方嬉戏。很遗憾,硬纸板人没有去,但他相对容易独自处理。" #: lang/json/talk_topic_from_json.py msgid "I do believe we discussed a reward?" -msgstr "" +msgstr "我相信我们讨论过奖励了?" #: lang/json/talk_topic_from_json.py msgid "Just glad to help." @@ -128106,7 +128253,7 @@ msgstr "很乐意帮忙。" msgid "" "And so we did. You didn't do the full job, but we're fair people here. " "Here's five merch a head for the folks you found a new home for." -msgstr "" +msgstr "我们做到了。虽然没完成全部任务,但我们是公平的。这是你为他们找到新家的五个商会币。" #: lang/json/talk_topic_from_json.py msgid "" @@ -128117,11 +128264,12 @@ msgid "" "subsidiary of our dealings here. It worked out pretty well for everyone, " "most of the people with skills for that kind of work are already out there." msgstr "" +"其中一个被疏散到这里的人实际上是准备乘坐包车返回他的农场。但那辆车被征用成为了疏散车并把他也带到了这里。我们达成了一项协议,把他送回家,给他提供劳动力,作为回报,把农场变成我们在这里交易的一个子公司。这对每个人来说都很好,大多数有这种工作技能的人已经在那里了。" #: lang/json/talk_topic_from_json.py msgid "" "Didn't that free up some space for the beggars and people stuck upstairs?" -msgstr "" +msgstr "难道这没有给乞丐和被困在楼上的人腾出一些空间吗?" #: lang/json/talk_topic_from_json.py msgid "Thanks for the story." @@ -128136,6 +128284,7 @@ msgid "" "sun, fresh air, and hard work... but people are a bit afraid of getting " "attacked by zombie hordes, as you might guess." msgstr "" +"不幸的是,没有。大多数离开的人已经被困在楼上,他们承担的风险比那些已经有一张安全的床的人要小。我们只有几个人走出地下室,当我们出发的时候地下室已经太拥挤了。我们希望有更多的人到农场去晒晒太阳,呼吸新鲜空气,干点苦活……但是你可能猜到了,人们有点害怕被僵尸群袭击。" #: lang/json/talk_topic_from_json.py msgid "Marshal..." @@ -128309,7 +128458,7 @@ msgstr "" #: lang/json/talk_topic_from_json.py msgid "I'll buy." -msgstr "[交易]我要了。" +msgstr "[交易]我要买东西。" #: lang/json/talk_topic_from_json.py msgid "Who needs rebar?" @@ -128599,7 +128748,7 @@ msgstr "我们没有改变主意。走开。" msgid "" "Hold there. I don't care how you got access to this location, but you are " "coming no further. Go away." -msgstr "" +msgstr "待在那里。我不管你是怎么进入这个地方的,但你不能再往前走了。走开。" #: lang/json/talk_topic_from_json.py msgid "So how's it down there?" @@ -128611,11 +128760,11 @@ msgstr "让我们交易吧。" #: lang/json/talk_topic_from_json.py msgid "I came looking for valuables, maybe I can trade with you instead?" -msgstr "" +msgstr "我是来找贵重物品的,或许我可以和你交易?" #: lang/json/talk_topic_from_json.py msgid "It's the apocalypse out here! Please let me in!" -msgstr "" +msgstr "这是世界末日!让我进去!" #: lang/json/talk_topic_from_json.py msgid "Any jobs you need done?" @@ -128639,6 +128788,7 @@ msgid "" "interact with the outside world for us, but you know how well it went... " "Shame about what happened, with the evisceration and all..." msgstr "" +"这是一个改进型生物底盘,带有一个定制的人工智能。我们希望它能为我们与外界互动,一切进展的非常顺利,我们对发生的事感到羞愧,因为切除内脏...." #: lang/json/talk_topic_from_json.py msgid "Just leave." @@ -128656,19 +128806,19 @@ msgstr "好吧,我走" msgid "" "Still plenty of outlaws in the roads, perhaps you should tend to your job, " "marshal..." -msgstr "" +msgstr "路上仍然有很多不法分子,也许你应该专注于你的工作,執法官......" #: lang/json/talk_topic_from_json.py msgid "You see anything you want, marshal?" -msgstr "" +msgstr "你看到任何你想要的东西,執法官?" #: lang/json/talk_topic_from_json.py msgid "Oh, a U.S. marshal, how quaint." -msgstr "" +msgstr "哦,聯邦執法官,多么离奇。" #: lang/json/talk_topic_from_json.py msgid "Here to trade, I hope?" -msgstr "" +msgstr "我想要在这交易,可以吗?" #: lang/json/talk_topic_from_json.py msgid "Safe travels, scavenger." @@ -128682,14 +128832,14 @@ msgstr "让我们交易吧。" msgid "" "I keep to my own business, and you keep to yours, marshal. Seems like a " "fair deal?" -msgstr "" +msgstr "我继续我的生意,你继续你的,执法官。 看来挺公平吧?" #: lang/json/talk_topic_from_json.py msgid "" "We have been supplying this lab here with food from a few hunting and " "farming communities nearby. The roads are though and dangerous, but it " "makes good money, and beats scavenging the cities for scraps." -msgstr "" +msgstr "我们为这里的实验室补给食物——来自附近一些狩猎或农耕聚落。道路艰难险阻,但获利颇丰。也拆解回收城市的废料。" #: lang/json/talk_topic_from_json.py msgid "Keep safe, then." @@ -128699,7 +128849,7 @@ msgstr "那么,请注意安全。" msgid "" "Can I interest you in a trim? It'll cost you 6 merch for a haircut or 3 for" " a beard trim. I can do color and styling too." -msgstr "我能帮你修剪一下吗?剪发要花6英镑,否则剪胡子要花3英镑。我也可以做颜色和造型。" +msgstr "我能帮你修剪一下吗?剃头6商币,刮脸3商币。我也会染色和造型。" #: lang/json/talk_topic_from_json.py msgid "What is your job here?" @@ -130505,12 +130655,12 @@ msgstr "蛇形移动" #: lang/json/technique_from_json.py #, python-format msgid "The %s tries to grab you, but you slither free!" -msgstr "" +msgstr "%s试图抓住你,但你滑开了。" #: lang/json/technique_from_json.py #, python-format msgid "The %s tries to grab , but they slither free!" -msgstr "" +msgstr "%s 试着抓住 ,但被滑开了!" #: lang/json/technique_from_json.py msgid "Snake Strike" @@ -130687,7 +130837,7 @@ msgstr "无情地穿刺了%s" #: lang/json/technique_from_json.py msgid "Pressure Crunch" -msgstr "气压骤降" +msgstr "重压碾碎" #. ~ Description for Pressure Crunch #: lang/json/technique_from_json.py @@ -130872,7 +131022,7 @@ msgstr "扫荡" msgid "" "15% moves, 35% damage, wide arc, STR (SS+) dramatically reduces action cost," " and adds a (A) damage bonus, min 4 melee" -msgstr "15%移动,35%伤害,大幅攻击,力量(SS+)显着降低行动消耗,并增加一个(A)伤害加值,需要4近战技能" +msgstr "15%移动,35%伤害,大幅攻击,力量(SS+)显著降低行动消耗,并增加一个(A)伤害加值,需要4近战技能" #: lang/json/technique_from_json.py #, python-format @@ -130930,7 +131080,7 @@ msgstr "顺势" msgid "" "75% moves, 60% damage, wide arc, STR (S) dramatically reduces action cost, " "and adds a (C) damage bonus, min 4 melee" -msgstr "75%移动,60%伤害,大幅攻击,力量(S)显着降低行动消耗,并增加一个(C)伤害加成,需要4近战技能" +msgstr "75%移动,60%伤害,大幅攻击,力量(S)显著降低行动消耗,并增加一个(C)伤害加成,需要4近战技能" #: lang/json/technique_from_json.py msgid "CHOP" @@ -130980,7 +131130,7 @@ msgstr "阴招" msgid "" "Crit only, 120% moves, 125% damage, Stun for 1.5 turns, STR (A) dramatically" " reduces action cost, min melee 1" -msgstr "仅暴击,120%移动,125%伤害,眩晕1.5回合,力量(A)显着降低行动消耗,需要1近战技能" +msgstr "仅暴击,120%移动,125%伤害,眩晕1.5回合,力量(A)显著降低行动消耗,需要1近战技能" #: lang/json/technique_from_json.py #, python-format @@ -130990,7 +131140,7 @@ msgstr "你全力前冲,阴险地撩击%s的*弱点*。" #: lang/json/technique_from_json.py #, python-format msgid " swings upwards with all their weight %s" -msgstr "" +msgstr "全力撩击%s。" #: lang/json/technique_from_json.py msgid "SHOVE" @@ -131133,87 +131283,87 @@ msgstr "试探攻击%s。" #: lang/json/technique_from_json.py msgid "Ausstoß" -msgstr "" +msgstr "导力反转" #: lang/json/technique_from_json.py #, python-format msgid "You redirect %s's attack against them" -msgstr "" +msgstr "你引导%s将攻击的力道反作用于其自身。" #: lang/json/technique_from_json.py #, python-format msgid " redirects %s's attack against them" -msgstr "" +msgstr "反转了%s的攻击。" #: lang/json/technique_from_json.py msgid "Ellbogen Blatt" -msgstr "" +msgstr "肘后刀" #: lang/json/technique_from_json.py #, python-format msgid "You expertly cut %s" -msgstr "" +msgstr "你巧妙地砍中%s。" #: lang/json/technique_from_json.py #, python-format msgid " expertly cuts %s" -msgstr "" +msgstr "巧妙地砍中%s。" #: lang/json/technique_from_json.py msgid "Herzschlag" -msgstr "" +msgstr "震颤碎心" #: lang/json/technique_from_json.py #, python-format msgid "You hit %s with a powerful vibro-punch" -msgstr "" +msgstr "你发起强力震荡,打击%s。" #: lang/json/technique_from_json.py #, python-format msgid " hits %s with a powerful vibro-punch" -msgstr "" +msgstr "用强力震荡攻击%s。" #: lang/json/technique_from_json.py msgid "Geschoss Schlag" -msgstr "" +msgstr "导弹打击" #: lang/json/technique_from_json.py #, python-format msgid "You launch a supersonic punch at %s" -msgstr "" +msgstr "你如导弹一般对%s发动超音速冲击。" #: lang/json/technique_from_json.py #, python-format msgid " launches a supersonic punch at %s" -msgstr "" +msgstr "如导弹一般,突破音速撞向%s。" #: lang/json/technique_from_json.py msgid "Herz Nadel" -msgstr "" +msgstr "震荡激发" #: lang/json/technique_from_json.py #, python-format msgid "You detonate the shockwave within %s" -msgstr "" +msgstr "你激发了%s体内潜伏的冲击波。" #: lang/json/technique_from_json.py #, python-format msgid " detonates the shockwave within %s" -msgstr "" +msgstr "激发了%s体内潜伏的冲击波。" #: lang/json/technique_from_json.py msgid "Mehr Umdrehungen" -msgstr "" +msgstr "开脚旋回" #: lang/json/technique_from_json.py #, python-format msgid "The %s tries to grab you, but you kick free and spin around!" -msgstr "" +msgstr "%s试图抓住你,但是你耍了个蹬腿+回旋,躲开了。" #: lang/json/technique_from_json.py #, python-format msgid "The %s tries to grab , but they kick free and spin around!" -msgstr "" +msgstr "%s试图抓住,但他耍了个蹬腿+回旋,躲开了。" #: lang/json/technique_from_json.py msgid "displace and counter" @@ -131393,7 +131543,7 @@ msgid "" "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." -msgstr "" +msgstr "光秃冰冷的水泥地板,涂着些黄色油漆线条。有屋顶隔绝户外,但若支撑墙被破坏,屋顶可能会坍塌。" #: lang/json/terrain_from_json.py msgid "concrete floor, overhead light" @@ -131469,7 +131619,7 @@ msgstr "泥土地,看来土壤适合耕种。也可以开发建设项目。" #: lang/json/terrain_from_json.py msgid "thump" -msgstr "重击" +msgstr "噗通" #. ~ Description for sand #: lang/json/terrain_from_json.py @@ -131764,7 +131914,7 @@ msgstr "木地板" msgid "" "Wooden floor created from boards, packed tightly together and nailed down. " "Common in patios." -msgstr "" +msgstr "木质楼板,由扎紧的木板钉牢而成。常见于露台。" #: lang/json/terrain_from_json.py msgid "primitive floor" @@ -131958,7 +132108,7 @@ msgid "" "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." -msgstr "" +msgstr "一种较原始的墙,将木条格栅用一些泥巴、黏土、沙子、动物粪便和稻草之类混和物糊起来制成。" #: lang/json/terrain_from_json.py msgid "broken wattle-and-daub wall" @@ -131969,7 +132119,7 @@ msgstr "木骨泥墙(破损)" msgid "" "This wattle-and-daub wall section has been destroyed, leaving mostly just " "frame, and is barely held together." -msgstr "" +msgstr "这个篱笆糊成的墙壁一部分已被摧毁,大多只余框架,几乎无法固定在一起。" #: lang/json/terrain_from_json.py msgid "half-built wattle-and-daub wall" @@ -131981,7 +132131,7 @@ msgid "" "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." -msgstr "" +msgstr "这堵泥巴墙已经有一些木条格栅,还需要加上其他部分的格栅并涂上湿泥糊。" #: lang/json/terrain_from_json.py msgid "wooden wall" @@ -133184,6 +133334,7 @@ msgid "" "you examined the foliage more closely, you could probably find some viable " "clusters. You could also cut it down with the right tools." msgstr "" +"生长在新英格兰的“刺柏属”物种之一,杜松子从开花算起需生长两到三年。第二年为绿色浆果,最后,才生出广为人知的蓝色种类。如果你仔细检查树叶,你可能会找到一些可用的果簇。你可以用合适的工具砍倒它。" #. ~ Description for juniper tree #: lang/json/terrain_from_json.py @@ -133194,6 +133345,7 @@ msgid "" "blue varieties. Looks like all the ripe bunches of berries have been " "picked. You could also cut it down with the right tools." msgstr "" +"生长在新英格兰的“刺柏属”物种之一,杜松子从开花算起需生长两到三年。第二年为绿色浆果,最后,才生出广为人知的蓝色种类。看起来所有成熟的浆果串已经采完了。你可以用合适的工具砍倒它。" #: lang/json/terrain_from_json.py msgid "peach tree" @@ -133368,7 +133520,7 @@ msgid "" "A tall, wide deciduous tree of the 'Salix' genus, with long thin leafy " "branches that hang down like curtains. You could tear off some bark. You " "could cut it down with the right tools." -msgstr "" +msgstr "又高又壮的柳属落叶树,叶子长而薄,如窗帘一般垂下。可以撕下一些树皮。也可以用合适的工具砍倒它。" #. ~ Description for willow tree #: lang/json/terrain_from_json.py @@ -133377,7 +133529,7 @@ msgid "" "branches that hang down like curtains. Looks like all usable bark has been " "torn off, and new rhytidomes have not formed yet. You could cut it down " "with the right tools." -msgstr "" +msgstr "又高又壮的柳属落叶树,叶子长而薄,如窗帘一般垂下。所有可用的树皮都被撕掉了,还没有形成新的落皮层。可以用合适的工具砍倒它。" #: lang/json/terrain_from_json.py msgid "maple tree" @@ -133389,7 +133541,7 @@ msgid "" "A large deciduous tree of the 'Acer' genus. The leaves are distinctively " "shaped with five prongs. It could be tapped in order to extract maple " "syrup. You could cut it down with the right tools." -msgstr "" +msgstr "槭属的大型落叶树。长着手掌形状的奇异叶子。轻轻敲击即可收获枫树糖浆。可以用合适的工具砍倒它。" #. ~ Description for maple tree #: lang/json/terrain_from_json.py @@ -133397,7 +133549,7 @@ msgid "" "A large deciduous tree of the 'Acer' genus. The leaves are distinctively " "shaped with five prongs. A spigot is wedged into the trunk, and sweet maple" " syrup can be extracted. You could cut it down with the right tools." -msgstr "" +msgstr "槭属的大型落叶树。长着手掌形状的奇异叶子。将树木插管楔入树干,就能收获枫树糖浆。可以用合适的工具砍倒它。" #: lang/json/terrain_from_json.py msgid "hickory tree" @@ -133409,14 +133561,14 @@ msgid "" "A tall deciduous tree of the 'Carya' genus. You could look for hickory nuts" " if you examined the tree more closely. You could cut it down with the " "right tools." -msgstr "" +msgstr "山核桃属的高大落叶树。仔细搜索可以获得山核桃。可以用合适的工具砍倒它。" #. ~ Description for hickory tree #: lang/json/terrain_from_json.py msgid "" "A tall deciduous tree of the 'Carya' genus. It looks like the tree has been" " picked clean of hickory nuts. You could cut it down with the right tools." -msgstr "" +msgstr "山核桃属的高大落叶树。看起来树上没留下任何山核桃。可以用合适的工具砍倒它。" #: lang/json/terrain_from_json.py msgid "pistachio tree" @@ -133428,7 +133580,7 @@ msgid "" "A deciduous tree of the 'Pistacia' genus. This is a cultivated tree, and is" " not native to this region. You could look for pistachio nuts if you " "examined the tree more closely. You could cut it down with the right tools." -msgstr "" +msgstr "黄连木属的落叶树。它不是本地原生,而是人工栽培的。仔细搜索可以收获开心果。可以用合适的工具砍倒它。" #. ~ Description for pistachio tree #: lang/json/terrain_from_json.py @@ -133436,7 +133588,7 @@ msgid "" "A deciduous tree of the 'Pistacia' genus. This is a cultivated tree, and is" " not native to this region. Unfortunately, it looks like it has been picked" " clean of pistachio nuts. You could cut it down with the right tools." -msgstr "" +msgstr "黄连木属的落叶树。它不是本地原生,而是人工栽培的。不幸的是树上没剩下任何可采收的开心果。可以用合适的工具砍倒它。" #: lang/json/terrain_from_json.py msgid "almond tree" @@ -133448,7 +133600,7 @@ msgid "" "A deciduous tree of the 'Prunus' genus. This is a cultivated tree, and is " "not native to this region. You could look for fresh almonds if you examined" " the tree more closely. You could cut it down with the right tools." -msgstr "“李”属的落叶树。这是一棵种植树,并非本地原生。如果你仔细检查树,可以找到新鲜的杏仁。你可以用合适的工具砍倒它。" +msgstr "李属的落叶树。它不是本地原生,而是人工栽培的。仔细搜索可以收获新鲜杏仁。可以用合适的工具砍倒它。" #. ~ Description for almond tree #: lang/json/terrain_from_json.py @@ -133456,7 +133608,7 @@ msgid "" "A deciduous tree of the 'Prunus' genus. This is a cultivated tree, and is " "not native to this region. There are no almonds left to pick on the tree. " "You could cut it down with the right tools." -msgstr "“李”属的落叶树。这是一棵种植树,并非本地原生。树上没留下可采收的杏仁。你可以用合适的工具砍倒它。" +msgstr "李属的落叶树。它不是本地原生,而是人工栽培的。树上没留下可采收的杏仁。可以用合适的工具砍倒它。" #: lang/json/terrain_from_json.py msgid "pecan tree" @@ -133468,7 +133620,7 @@ msgid "" "A tall deciduous tree of the 'Carya' genus. You could look for pecan nuts " "if you examined the tree more closely. You could cut it down with the right" " tools." -msgstr "“山核桃”属的高大落叶树。如果你仔细检查树,可以找到山核桃。你可以用合适的工具砍倒它。" +msgstr "山核桃属的高大落叶树。仔细搜索可以获得美洲山核桃。可以用合适的工具砍倒它。" #. ~ Description for pecan tree #: lang/json/terrain_from_json.py @@ -133476,7 +133628,7 @@ msgid "" "A tall deciduous tree of the 'Carya' genus. It doesn't look like there are " "any pecan nuts left on the tree. You could cut it down with the right " "tools." -msgstr "“山核桃”属的高大落叶树。看起来树上没留下任何山核桃坚果。你可以用合适的工具砍倒它。" +msgstr "山核桃属的高大落叶树。看起来树上没留下任何美洲山核桃。可以用合适的工具砍倒它。" #: lang/json/terrain_from_json.py msgid "dead hickory tree" @@ -133488,7 +133640,7 @@ msgid "" "The dead remnants of a tall deciduous tree of the 'Carya' genus. Nothing " "useful can be foraged from this poor, dead tree. You could cut it down with" " the right tools." -msgstr "“山核桃”属高大落叶树的死亡残余物。这颗贫瘠的死树上采集不到任何堪用之物。你可以用合适的工具砍倒它。" +msgstr "山核桃属高大落叶树的残体。这颗贫瘠的死树上采集不到任何堪用之物。可以用合适的工具砍倒它。" #. ~ Description for underbrush #: lang/json/terrain_from_json.py @@ -134118,7 +134270,7 @@ msgstr "岩浆" msgid "" "An extremely hot, glowing liquid, composed of molten rock and/or metal. In " "some places, lava-grilled steak is a delicacy." -msgstr "一种极热、发光的液体,由熔化的岩石和/或金属组成。在某些地方,熔岩烤牛排是一道美味佳肴。" +msgstr "一种极热、发光的液体,由熔化的岩石和/或金属组成。在某些地方,熔岩烤牛排是一道美味佳肴。" #: lang/json/terrain_from_json.py msgid "sandbox" @@ -134129,7 +134281,7 @@ msgstr "沙盒" msgid "" "Children used to play in this sandbox. The population of lice probably " "diminished considerably now that they no longer do." -msgstr "" +msgstr "孩子们曾在这个沙箱里玩耍。但现在他们不这样做了,也许虱子的数量将因此减少。" #: lang/json/terrain_from_json.py msgid "slide" @@ -134151,7 +134303,7 @@ msgstr "攀爬架" msgid "" "A set of monkey bars, to be used by children to train their arms by hanging " "from the bars, and have fun." -msgstr "" +msgstr "一套单杠,让孩子们用它锻炼手臂,这会玩得开心。" #: lang/json/terrain_from_json.py msgid "backboard" @@ -134160,7 +134312,7 @@ msgstr "背板" #. ~ Description for backboard #: lang/json/terrain_from_json.py msgid "A basketball backboard." -msgstr "" +msgstr "一块篮板。" #: lang/json/terrain_from_json.py msgid "gasoline pump" @@ -134174,6 +134326,7 @@ msgid "" "warrior. If this gas dispenser doesn't give up the goods for free, you may " "have to pay at a nearby terminal." msgstr "" +"宝贵的汽油。文明世界向他们的石油之神顶礼膜拜,而石油之神却把他们引向毁灭。还有足够的燃料来给你的车辆加油。如果这个加油站不免费提供汽油,你可能要到附近的终端先付钱。" #: lang/json/terrain_from_json.py msgid "tank with gasoline" @@ -134202,7 +134355,7 @@ msgstr "汽油泵(损坏)" msgid "" "The horror! This gasoline pump has been destroyed, denying you access to " "the liquid gold." -msgstr "" +msgstr "恐怖!这个汽油泵被毁了,你无法获得这些液体黄金。" #. ~ Description for diesel pump #: lang/json/terrain_from_json.py @@ -134212,7 +134365,7 @@ msgid "" "APOCOLYPTIC SUPERTRUCK from point A to points beyond. If it doesn't " "dispense fuel immediately, try banging on it or grunt your way over the " "nearby payment terminal." -msgstr "" +msgstr "这是一个柴油泵。在路边提供柴油,你可以把你的超级卡车加满柴油后开往任何你想去的地方。如果它没立即加油,试着敲打它或在附近的支付终端付款。" #: lang/json/terrain_from_json.py msgid "smashed diesel pump" @@ -134223,7 +134376,7 @@ msgstr "柴油泵(损坏)" msgid "" "You're not getting any diesel out of this pump any time soon. Some " "barbarian decided to take their frustration out on it." -msgstr "" +msgstr "你没办法很快从这个柴油泵里面获得任何柴油,一些野蛮人决定发泄他们的不满。" #: lang/json/terrain_from_json.py msgid "ATM" @@ -134238,6 +134391,7 @@ msgid "" "earnings to a single card. These things have seen better days. There's been" " a run on the bank, and this machine has the dents and cracks to prove it." msgstr "" +"为方便您办理银行业务,这台自动柜员机完全可以在网络完全瘫痪的情况下自动运行。你可以从现金卡中存入资金,并将所有经过调整后的资金转移到一张卡上。在灾难发生时。银行发生了挤兑,而这台机器上的凹痕和裂纹证明了这一点。" #: lang/json/terrain_from_json.py msgid "Critical failure imminent, self destruct activated. Have a nice day!" @@ -134251,7 +134405,7 @@ msgstr "发电机(损坏)" #: lang/json/terrain_from_json.py msgid "" "This generator is broken and will not help you produce usable electricity." -msgstr "" +msgstr "这个发电机坏了,不能帮你发电。" #: lang/json/terrain_from_json.py msgid "missile" @@ -134262,7 +134416,7 @@ msgstr "导弹" msgid "" "This is a section of an ICBM, an Intercontinental Ballistic Missile. This " "isn't the kind of rocket that goes to the moon." -msgstr "" +msgstr "这是洲际弹道导弹的一部分。不是那种登上月球的火箭。" #: lang/json/terrain_from_json.py msgid "blown-out missile" @@ -134273,12 +134427,12 @@ msgstr "导弹(炸裂)" msgid "" "This is a section of an ICBM, an Intercontiental Ballistic Missile. This " "isn't the kind of rocket that's going anywhere." -msgstr "" +msgstr "这是洲际弹道导弹的一部分。不是那种到处都能飞的火箭。" #. ~ Description for radio tower #: lang/json/terrain_from_json.py msgid "This is the structure of a radio transmission tower." -msgstr "" +msgstr "这是无线电发射塔的一部分结构。" #: lang/json/terrain_from_json.py msgid "radio controls" @@ -134289,7 +134443,7 @@ msgstr "无线电控制台" msgid "" "This console appears to control a nearby radio transmission tower. It " "doesn't seem to be fully operational." -msgstr "" +msgstr "这个控制台似乎控制着附近的无线电发射塔。它似乎没有完全运行。" #: lang/json/terrain_from_json.py msgid "broken console" @@ -134300,7 +134454,7 @@ msgstr "电脑(损坏)" msgid "" "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." -msgstr "" +msgstr "这是一个独立的计算机终端。破碎的屏幕和电路板告诉你它似乎已经无法工作了。" #: lang/json/terrain_from_json.py msgid "computer console" @@ -134312,7 +134466,7 @@ msgid "" "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." -msgstr "" +msgstr "这是一个独立的计算机终端。它可以用来查看内容并执行任何允许的功能。考虑到技能,它可能被黑客攻击。" #: lang/json/terrain_from_json.py msgid "mechanical winch" @@ -134323,7 +134477,7 @@ msgstr "机械绞盘" msgid "" "This is a gate control winch. If it's functioning, it can be used to open " "or close a nearby gate or door." -msgstr "" +msgstr "这是一个机械绞盘。如果它起作用,它可以用来打开或关闭附近的门。" #. ~ Description for mechanical winch #. ~ Description for control lever @@ -134331,7 +134485,7 @@ msgstr "" msgid "" "This is a gate control winch. If it's functioning, it can be used to open " "or close a nearby gate." -msgstr "" +msgstr "这是一个机械绞盘。如果它起作用,它可以用来打开或关闭附近的门。" #: lang/json/terrain_from_json.py msgid "control lever" @@ -134354,22 +134508,22 @@ msgstr "一整套绳索和滑轮系统,可以拉起沉重的门或大门。" #: lang/json/terrain_from_json.py msgid "high gauge pipe" -msgstr "" +msgstr "高压管" #. ~ Description for high gauge pipe #: lang/json/terrain_from_json.py msgid "This is a section of high gauge pipe." -msgstr "" +msgstr "一段高压管道" #: lang/json/terrain_from_json.py msgid "high gauge pump" -msgstr "" +msgstr "高压泵" #. ~ Description for high gauge pump #: lang/json/terrain_from_json.py msgid "" "This unpowered pump previously would have moved fluids around in a hurry." -msgstr "" +msgstr "这个失去动力的泵曾经可以快速输送液体。" #: lang/json/terrain_from_json.py msgid "centrifuge" @@ -134381,7 +134535,7 @@ msgid "" "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." -msgstr "" +msgstr "带有自动分析仪单元的离心机。 可将试管放入其中,用于分析其中的医用流体样本,例如血液。" #: lang/json/terrain_from_json.py msgid "CVD machine" @@ -134392,7 +134546,7 @@ msgstr "化学气相沉积镀膜机" msgid "" "The bulk of a highly technical-looking apparatus controlled by a nearby " "console." -msgstr "" +msgstr "气相沉积机,一种高科技设备,由附近的控制台控制。" #: lang/json/terrain_from_json.py msgid "CVD control panel" @@ -134407,6 +134561,7 @@ msgid "" " the process is extremely complicated, a previous user has helpfully " "sketched: Hydrogen + charcoal = smiley face." msgstr "" +"这是一个看起来非常昂贵的仪器,被贴上了“化学气相沉积机”的标签。有了某些极为罕见的化学物质和元素的输入,人们可以很容易地在武器上涂上钻石。虽然这个过程非常复杂,但之前的一位用户已经很有帮助地绘制了草图:氢+炭=笑脸。" #: lang/json/terrain_from_json.py msgid "nanofabricator" @@ -134461,7 +134616,7 @@ msgstr "克隆舱" msgid "" "A vat full of solution, probably intended to hold growing clones of people " "or other life forms." -msgstr "" +msgstr "装满溶液的大桶,可能是用来装人或其他生命形式的克隆体。" #: lang/json/terrain_from_json.py msgid "plunk." @@ -134491,7 +134646,7 @@ msgid "" "This is a manhole. The heavy iron cover lies over an entrance to the " "underworld of hidden tunnels beneath the streets where sewage and rain water" " frolic freely." -msgstr "" +msgstr "这是一个检修孔。沉重的铁皮覆盖着一个通往地下世界的入口,在街道下面隐藏着隧道,污水和雨水在那里自由嬉戏。" #: lang/json/terrain_from_json.py msgid "ladder" @@ -134544,7 +134699,7 @@ msgstr "只是一个井盖。" msgid "" "An intercom panel. For when you want to scare the crap out of someone, or " "just talk to them over the intercom system, if you're boring like that." -msgstr "" +msgstr "一个对讲机面板。因为当你想把吓唬某人,或者只是通过对讲机跟他们说话,那你可以使用它。" #: lang/json/terrain_from_json.py msgid "card reader" @@ -134558,6 +134713,7 @@ msgid "" "reminds you of a robot gone haywire from an old sci-fi flick. You could " "swipe a scientific ID badge near it if you do not fear the machine." msgstr "" +"这是智能读卡器。面板上展示着一个玻璃烧瓶图案,这是众所周知的科学符号。不祥的红色LED让你想起一部老科幻电影里失控的机器人。如果你不害怕这台机器,你可以让这个读卡器识别科学ID卡。" #. ~ Description for card reader #: lang/json/terrain_from_json.py @@ -134567,6 +134723,7 @@ msgid "" "blinks askance at your geek cred. You could swipe a scientific ID badge " "near it to unlock the gates to discovery." msgstr "" +"这是智能读卡器。面板上展示着一个玻璃烧瓶图案,这是众所周知的科学符号。不祥的红色LED一直在不停的闪烁。你可以在它这刷一个科学ID卡来打开门。" #. ~ Description for card reader #: lang/json/terrain_from_json.py @@ -134576,6 +134733,7 @@ msgid "" "small, red LED remains constant, as if watching you, waiting. You could " "swipe a military ID card in front of the reader if you dared." msgstr "" +"这是智能读卡器。面板上展示着一个美国国旗和一只雄鹰驾驶着坦克,咬着一枚手榴弹的图案。一个小小的红色LED灯始终如一,仿佛在注视着你,等待着。如果你敢的话,可以在读卡器上刷军事ID卡。" #. ~ Description for card reader #: lang/json/terrain_from_json.py @@ -134585,6 +134743,7 @@ msgid "" "industrial company title. A red LED blinks on the card reader. Perhaps an " "industrial ID card could still open it." msgstr "" +"这是智能读卡器。面板上的图案展示着一个黑色的齿轮以及难以辨认的重工业公司名称。一个小小的红色LED灯始终如一,仿佛在注视着你,等待着。也许一个工业ID卡可以刷卡开门。" #: lang/json/terrain_from_json.py msgid "broken card reader" @@ -134595,7 +134754,7 @@ msgstr "读卡器(损坏)" msgid "" "This is a smartcard reader, but it doesn't seem to be functioning. Probably" " because there's no more blinking red LED." -msgstr "" +msgstr "是一个智能读卡器,但似乎不能用。可能是因为再也没有闪烁的红色LED了。" #: lang/json/terrain_from_json.py msgid "slot machine" @@ -134607,7 +134766,7 @@ msgid "" "A machine with a bright screen flashing hypnotic promises of wealth. If " "gambling with your life on a daily basis isn't enough for you, you can also " "gamble with this." -msgstr "" +msgstr "一台屏幕明亮的机器,闪烁着诱人的财富承诺。如果你不满足于每天用生命去赌博,你也可以用这个来赌博。" #: lang/json/terrain_from_json.py msgid "elevator controls" @@ -134618,7 +134777,7 @@ msgstr "电梯控制器" msgid "" "This is the control face for an elevator. You could press the appropriate " "button to take you to your choice of floor." -msgstr "" +msgstr "这是电梯的控制面。可以按下相应的按钮带你到你选择的楼层。" #: lang/json/terrain_from_json.py msgid "powerless controls" @@ -134627,7 +134786,7 @@ msgstr "电梯控制器(无动力)" #. ~ Description for powerless controls #: lang/json/terrain_from_json.py msgid "This is the control face for an elevator. It's currently unpowered." -msgstr "" +msgstr "这是电梯的控制面。它目前没有动力。" #: lang/json/terrain_from_json.py msgid "elevator" @@ -134636,7 +134795,7 @@ msgstr "电梯" #. ~ Description for elevator #: lang/json/terrain_from_json.py msgid "The interior section of an elevator." -msgstr "" +msgstr "电梯的内部部分。" #: lang/json/terrain_from_json.py msgid "dark pedestal" @@ -134647,7 +134806,7 @@ msgstr "黑色基座" msgid "" "A dark stone pedestal covered in ancient, unintelligible symbols. Looks " "ominous." -msgstr "" +msgstr "一个黑色的石头基座,上面覆盖着古老而难以理解的符号。看起来不祥。" #: lang/json/terrain_from_json.py msgid "light pedestal" @@ -134656,7 +134815,7 @@ msgstr "白色基座" #. ~ Description for light pedestal #: lang/json/terrain_from_json.py msgid "A light stone pedestal covered in ancient, unintelligible symbols." -msgstr "" +msgstr "白色基座,上面覆盖着古老、难以理解的符号。" #: lang/json/terrain_from_json.py msgid "red stone" @@ -134692,7 +134851,7 @@ msgstr "红色底板" #. ~ Description for red floor #: lang/json/terrain_from_json.py msgid "A red section of flooring." -msgstr "" +msgstr "一块红色地面。" #: lang/json/terrain_from_json.py msgid "green floor" @@ -134701,7 +134860,7 @@ msgstr "绿色地板" #. ~ Description for green floor #: lang/json/terrain_from_json.py msgid "A green section of flooring." -msgstr "" +msgstr "一块绿色地面。" #: lang/json/terrain_from_json.py msgid "blue floor" @@ -134710,7 +134869,7 @@ msgstr "蓝色地板" #. ~ Description for blue floor #: lang/json/terrain_from_json.py msgid "A blue section of flooring." -msgstr "" +msgstr "一块蓝色地面。" #: lang/json/terrain_from_json.py msgid "yellow switch" @@ -134719,7 +134878,7 @@ msgstr "黄色开关" #. ~ Description for yellow switch #: lang/json/terrain_from_json.py msgid "A yellow switch. Should you activate it?" -msgstr "" +msgstr "黄色开关。你要激活它吗?" #: lang/json/terrain_from_json.py msgid "cyan switch" @@ -134728,7 +134887,7 @@ msgstr "青色开关" #. ~ Description for cyan switch #: lang/json/terrain_from_json.py msgid "A cyan switch. Should you activate it?" -msgstr "" +msgstr "青色开关。你要激活它吗?" #: lang/json/terrain_from_json.py msgid "purple switch" @@ -134737,7 +134896,7 @@ msgstr "紫色开关" #. ~ Description for purple switch #: lang/json/terrain_from_json.py msgid "A purple switch. Should you activate it?" -msgstr "" +msgstr "紫色开关。你要激活它吗?" #: lang/json/terrain_from_json.py msgid "checkered switch" @@ -134746,7 +134905,7 @@ msgstr "方格开关" #. ~ Description for checkered switch #: lang/json/terrain_from_json.py msgid "A checkered switch. Should you activate it?" -msgstr "" +msgstr "方格开关。你要激活它吗?" #. ~ Description for red carpet #: lang/json/terrain_from_json.py @@ -134777,12 +134936,12 @@ msgstr "油毡地砖" msgid "" "A section of flooring made out of a tough, rubbery material. Coloured a " "simple white." -msgstr "" +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 "" +msgstr "用坚硬的、灰色的橡胶材料制成的地板。" #: lang/json/terrain_from_json.py msgid "red wall" @@ -134856,7 +135015,7 @@ msgstr "石墙(半成品)" msgid "" "Half of a sturdy stone wall. Some work still needs to be done before this " "stone wall is complete." -msgstr "" +msgstr "半截坚固的石墙。在这堵石墙完成之前,还需要做一些工作。" #: lang/json/terrain_from_json.py msgid "covered well" @@ -134893,7 +135052,7 @@ msgstr "简易遮蔽处" msgid "" "Improvised shelter providing little bit of protection, that can be used to " "take refuge from the elements or to protect a campfire from the rain." -msgstr "" +msgstr "临时搭建的庇护所,提供一点点防护,可用来躲避大自然的影响或保护篝火不受雨水的侵袭。" #: lang/json/terrain_from_json.py msgid "flat roof" @@ -134902,7 +135061,7 @@ msgstr "平坦的屋顶" #. ~ Description for flat roof #: lang/json/terrain_from_json.py msgid "A flat, gray section of rooftop." -msgstr "" +msgstr "屋顶上平坦的灰色部分。" #: lang/json/terrain_from_json.py msgid "tar paper flat roof" @@ -134911,7 +135070,7 @@ msgstr "沥青纸屋顶" #. ~ Description for tar paper flat roof #: lang/json/terrain_from_json.py msgid "A flat, gray section of rooftop covered with tar paper." -msgstr "" +msgstr "屋顶上覆盖着焦油纸的平坦的灰色部分。" #: lang/json/terrain_from_json.py msgid "shingle flat roof" @@ -134920,7 +135079,7 @@ msgstr "木瓦屋顶" #. ~ Description for shingle flat roof #: lang/json/terrain_from_json.py msgid "A flat section of rooftop covered in shingles." -msgstr "" +msgstr "屋顶上覆盖着瓦的平坦部分。" #: lang/json/terrain_from_json.py msgid "thatched roof" @@ -134929,7 +135088,7 @@ msgstr "茅草屋顶" #. ~ Description for thatched roof #: lang/json/terrain_from_json.py msgid "A section of roof made out of straw." -msgstr "" +msgstr "一片用稻草制成的屋顶。" #: lang/json/terrain_from_json.py msgid "metal flat roof" @@ -134938,7 +135097,7 @@ msgstr "金属屋顶" #. ~ Description for metal flat roof #: lang/json/terrain_from_json.py msgid "A secton of flat, sheet metal rooftop." -msgstr "" +msgstr "一片平坦的金属屋顶。" #: lang/json/terrain_from_json.py msgid "tile flat roof" @@ -134947,7 +135106,7 @@ msgstr "瓦片屋顶" #. ~ Description for tile flat roof #: lang/json/terrain_from_json.py msgid "A section of tiled, flat rooftop." -msgstr "" +msgstr "一段平坦的屋顶。" #: lang/json/terrain_from_json.py msgid "skylight" @@ -134970,7 +135129,7 @@ msgid "" "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." -msgstr "" +msgstr "这个强大的设备利用原子的能量。精炼核燃料被“燃烧”以提供几乎无限的电力。但它在这里做得并不好。也许它还能被用于其他用途。" #: lang/json/terrain_from_json.py msgid "telecom cabinet" @@ -134981,7 +135140,7 @@ msgstr "电信机柜" msgid "" "A cabinet full of telecoms equipment. With the lines down, you might be " "able to take it apart for its useful electronics." -msgstr "" +msgstr "装满电信设备的机柜。线路已经断开,拆开也许还能回收些有用的电子材料。" #: lang/json/terrain_from_json.py msgid "damaged telecom cabinet" @@ -134992,7 +135151,7 @@ msgstr "电信机柜(损坏)" msgid "" "A damaged telecoms cabinet. Might still be able to salvage some useful " "electronics scrap from it." -msgstr "" +msgstr "损坏的电信机柜,也许可以从里面回收一些电子材料。" #: lang/json/terrain_from_json.py msgid "large metal support" @@ -135001,7 +135160,7 @@ msgstr "大型金属支架" #. ~ Description for large metal support #: lang/json/terrain_from_json.py msgid "A heavy-duty metal support beam." -msgstr "" +msgstr "大型金属支撑梁。" #: lang/json/terrain_from_json.py msgid "small metal support" @@ -135019,7 +135178,7 @@ msgstr "高压滑油断路器" #. ~ Description for HV oil circuit breaker #: lang/json/terrain_from_json.py msgid "A circuit breaker that uses oil in its arc supression chamber." -msgstr "" +msgstr "一种在电弧压缩室中使用大型高压石油断路器。" #: lang/json/terrain_from_json.py msgid "pow!" @@ -135032,7 +135191,7 @@ msgstr "小型高压滑油断路器" #. ~ Description for small HV oil circuit breaker #: lang/json/terrain_from_json.py msgid "A small circuit breaker that uses oil in its arc supression chamber." -msgstr "" +msgstr "一种在电弧压缩室中使用小型高压石油断路器。" #: lang/json/terrain_from_json.py msgid "large switchgear" @@ -135042,7 +135201,7 @@ msgstr "大型开关柜" #: lang/json/terrain_from_json.py msgid "" "A switchgear panel. It's covered in breaker switches, fuses, and gauges." -msgstr "" +msgstr "一个大型开关柜,它被断路器开关、保险丝和仪表所覆盖。" #: lang/json/terrain_from_json.py msgid "small switchgear" @@ -135053,7 +135212,7 @@ msgstr "小型开关柜" msgid "" "A small switchgear panel. It's covered in breaker switches, fuses, and " "gauges." -msgstr "" +msgstr "一个小型开关柜。它被断路器开关、保险丝和仪表所覆盖。" #: lang/json/terrain_from_json.py msgid "lightning arrester" @@ -135064,7 +135223,7 @@ msgstr "避雷器" msgid "" "A component designed to protect insulation and conductors in an electrical " "system by directing lightning through itself and into the ground." -msgstr "" +msgstr "避雷器一种用来保护电气系统中的绝缘和导体的部件,它把闪电引到自身和地面上。" #: lang/json/terrain_from_json.py msgid "disconnect switch" @@ -135075,7 +135234,7 @@ msgstr "隔离开关" msgid "" "A switch used to make sure an electrical system doesn't have any current " "flowing through it, for maintenance periods." -msgstr "" +msgstr "一种开关,用于确保电气系统在维护期间没有任何电流流过。" #: lang/json/terrain_from_json.py msgid "current transformer" @@ -135084,7 +135243,7 @@ msgstr "变流器" #. ~ Description for current transformer #: lang/json/terrain_from_json.py msgid "An electronic component used to transform the voltage of a current." -msgstr "" +msgstr "用于转换电流电压的电子元件。" #: lang/json/terrain_from_json.py msgid "potential transformer" @@ -135161,7 +135320,7 @@ msgstr "防护栏" msgid "" "A section of metal railing, put in place to prevent people from falling or " "taking the easy way out." -msgstr "" +msgstr "一段金属栏杆,放置在适当的位置,以防止人员坠落或轻易离开。" #: lang/json/terrain_from_json.py msgid "blackjack oak" @@ -135174,7 +135333,7 @@ msgid "" "black plates split by narrow orange fissures. You could peel off the bark " "sections if you examined the tree more closely. You could cut it down with " "the right tools." -msgstr "" +msgstr "一种栎属落叶乔木,树皮裂成长方形的黑色板,中间有狭窄的橙色裂缝。如果你仔细观察这棵树,你可以把树皮剥下来。你可以用合适的工具把它砍倒。" #. ~ Description for blackjack oak #: lang/json/terrain_from_json.py @@ -135182,7 +135341,7 @@ msgid "" "A deciduous tree of the genus 'Quercus', with bark cracked into rectangular " "black plates split by narrow orange fissures. All usable bark has been " "stripped off. You could cut it down with the right tools." -msgstr "" +msgstr "一种栎属落叶乔木,树皮裂成长方形的黑色板,中间有狭窄的橙色裂缝。所有可用的树皮都被剥掉了。你可以用合适的工具把它砍下来。" #: lang/json/terrain_from_json.py msgid "mound of clay" @@ -135302,7 +135461,7 @@ msgstr "铁轨轨道" msgid "" "Trains used to chug along on these. These rail tracks stand unused in the " "face of the Cataclysm." -msgstr "" +msgstr "火车可以在上面呼啸而过,但站台不对大灾变开放。" #: lang/json/terrain_from_json.py msgid "railroad tie" @@ -135311,14 +135470,14 @@ msgstr "铁轨枕木" #. ~ Description for railroad tie #: lang/json/terrain_from_json.py msgid "This crosstie is used to support the rails." -msgstr "" +msgstr "这根枕木是用来支撑铁轨的。" #. ~ Description for railroad track #: lang/json/terrain_from_json.py msgid "" "Trains used to chug along on these. These rail tracks stand unused in the " "face of the Cataclysm. A crosstie sits underneath, supporting the rails." -msgstr "" +msgstr "火车过去常常在这些轨道上隆隆前进。在大灾变面前,铁轨闲置着。下面有一个枕木,支撑着铁轨。" #: lang/json/terrain_from_json.py msgid "painted waxed floor" @@ -135327,7 +135486,7 @@ msgstr "染色打蜡地板" #. ~ Description for painted waxed floor #: lang/json/terrain_from_json.py msgid "This section of wax flooring has been painted." -msgstr "" +msgstr "这块打蜡地板已经上过漆了。" #. ~ Description for backboard #: lang/json/terrain_from_json.py @@ -135343,7 +135502,7 @@ msgstr "止冲挡" msgid "" "A tiny blockade on the train tracks, meant to signify the end of a track, or" " mark a 'no-go' zone for trains." -msgstr "" +msgstr "火车轨道上的封锁线,意指铁轨的尽头,或标志火车的“禁行区”。" #: lang/json/terrain_from_json.py msgid "railroad crossing signal" @@ -135355,7 +135514,7 @@ msgid "" "Traffic lights meant to light and make noise when a train approaches, to " "prevent people from turning into meaty mush while they cross the tracks. " "Won't stop people from turning into meaty mush by other means, though." -msgstr "" +msgstr "交通信号灯的作用是当火车驶近时发出灯光和噪音,以防止人们在过铁轨时被火车碾压变成肉泥。但这并不能阻止人们通过其他方式变成肉泥。" #: lang/json/terrain_from_json.py msgid "crossbuck" @@ -135366,7 +135525,7 @@ msgstr "叉标" msgid "" "A traffic sign intended to indicate a level railway crossing. If the trains" " were still running." -msgstr "" +msgstr "用于指示水平铁路交叉口的交通标志。如果火车还在运行。" #: lang/json/terrain_from_json.py msgid "root cellar" @@ -135444,7 +135603,7 @@ 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 "" +msgstr "一座新坟,用石头盖着既防止他人挖开又防止里面的东西挖出来。有两块木板标识着某人永恒安息之地。" #: lang/json/terrain_from_json.py msgid "rammed earth wall" @@ -135463,22 +135622,22 @@ msgstr "沉重的隆隆声!" #: lang/json/terrain_from_json.py msgid "split rail fence" -msgstr "铁路分隔铁丝网" +msgstr "分离式围栏" #. ~ Description for split rail fence #: lang/json/terrain_from_json.py msgid "" "A rather stout fence made of 2x4s and fence posts, suitable for containing " "livestock like horses, cows and pigs." -msgstr "" +msgstr "一种相当坚固的栅栏,由2x4和栅栏柱组成,适合饲养马、牛和猪等牲畜。" #: lang/json/terrain_from_json.py msgid "closed wooden split rail gate" -msgstr "木制铁路分隔门(关)" +msgstr "木制分离式围栏门(关)" #: lang/json/terrain_from_json.py msgid "open wooden split rail gate" -msgstr "木制铁路分隔门(开)" +msgstr "木制分离式围栏门(开)" #: lang/json/terrain_from_json.py msgid "wooden privacy fence" @@ -135489,7 +135648,7 @@ msgstr "木制隐私围栏" msgid "" "A rather stout fence made of 2x4s and fence posts, it is tall and prevents " "people from seeing into your yard." -msgstr "" +msgstr "一种相当坚固的栅栏,由2x4和栅栏柱组成,它很高,可以防止人们看到你的院子。" #: lang/json/terrain_from_json.py msgid "shallow pool water" @@ -136521,11 +136680,11 @@ msgstr "客车" #: lang/json/vehicle_from_json.py msgid "Two-Seated Motorized Draisine" -msgstr "" +msgstr "双座机动轨道车" #: lang/json/vehicle_from_json.py msgid "Six-Seated Motorized Draisine" -msgstr "" +msgstr "六座机动轨道车" #: lang/json/vehicle_from_json.py msgid "Rail Motorcycle" @@ -137394,7 +137553,7 @@ msgid "" "A device for recharging batteries. When turned on, it charges any " "rechargeable batteries (battery cells, lead-acid batteries, etc) placed " "directly in the attached storage space." -msgstr "" +msgstr "充电装置,开启电源后,会为其附属的存储空间内任何可充电设备(电池、蓄电池等)充电。" #: lang/json/vehicle_part_from_json.py msgid "wing mirror" @@ -139345,7 +139504,7 @@ msgstr "一只活的处于极寒状态的变形怪变成的载具部件。会大 #: lang/json/vehicle_part_from_json.py msgid "ice pack" -msgstr "变形怪冰冻储存箱" +msgstr "变形怪冷藏箱" #. ~ Description for ice pack #: lang/json/vehicle_part_from_json.py @@ -141083,6 +141242,8 @@ msgid "" "Choose part\n" "to draw blood from." msgstr "" +"选择部分\n" +"从中抽血。" #: src/activity_handlers.cpp msgid "Stop casting spell? Time spent will be lost." @@ -141101,7 +141262,7 @@ msgstr "你释放%s!" #: src/activity_handlers.cpp msgid "" "Something about how this spell works just clicked! You gained a level!" -msgstr "关于这个咒语是怎么运作的!你提高了水平!" +msgstr "你洞悉了这个咒语的施放原理,咒语等级提升!" #: src/activity_handlers.cpp #, c-format @@ -144123,16 +144284,16 @@ msgstr "%s的身体被严重损伤!" #: src/bionics.cpp #, c-format msgid "The %s flub the operation." -msgstr "" +msgstr "%s操作失败。" #: src/bionics.cpp #, c-format msgid "The %s messes up the operation." -msgstr "" +msgstr "%s把手术搞砸了。" #: src/bionics.cpp msgid "The operation fails." -msgstr "" +msgstr "操作失败。" #: src/bionics.cpp msgid "The operation is a failure." @@ -144141,7 +144302,7 @@ msgstr "手术失败了。" #: src/bionics.cpp #, c-format msgid "The %s screws up the operation." -msgstr "" +msgstr "%s把操作搞砸了。" #: src/bionics.cpp msgid "You prep to begin surgery." @@ -144242,12 +144403,12 @@ msgstr "你感觉自己的右臂有种微微的刺痛感,随后便丧失了所 msgid "" "The %1$s gently inserts a syringe into %2$s's arm and starts injecting " "something while holding them down." -msgstr "" +msgstr "%1$s轻轻地把一个注射器插入%2$s的手臂,在按住的同时开始注射东西。" #: src/bionics.cpp #, c-format msgid "%s's parts are jiggled back into their familiar places." -msgstr "" +msgstr "%s把四肢内脏轻轻摇晃地缓缓放回原本的位置。" #. ~ : more slot(s) needed. #: src/bionics.cpp @@ -145040,7 +145201,7 @@ msgstr "你的%s 挣脱了出来!" #: src/character.cpp #, c-format msgid "You are pulled from your %s!" -msgstr "" +msgstr "你被从%s里拽出来了。" #: src/character.cpp msgid "You find yourself no longer grabbed." @@ -145069,7 +145230,7 @@ msgstr " 挣脱了!" #: src/character.cpp #, c-format msgid "Your %s bionic comes back online." -msgstr "" +msgstr "你的%s生化插件恢复正常。" #: src/character.cpp #, c-format @@ -145174,7 +145335,7 @@ msgstr "疲倦" #: src/character.cpp #, c-format msgid "Your %s bionic shorts out!" -msgstr "" +msgstr "你的%s生化插件短路了!" #: src/character.cpp msgid "Left Arm" @@ -145321,23 +145482,23 @@ msgstr "穿着:" #: src/character.cpp msgid "NO_EXERCISE" -msgstr "" +msgstr "没有运动" #: src/character.cpp msgid "LIGHT_EXERCISE" -msgstr "" +msgstr "轻度运动" #: src/character.cpp msgid "MODERATE_EXERCISE" -msgstr "" +msgstr "中度运动" #: src/character.cpp msgid "ACTIVE_EXERCISE" -msgstr "" +msgstr "积极运动" #: src/character.cpp msgid "EXTRA_EXERCISE" -msgstr "" +msgstr "海量运动" #: src/character.cpp msgid "a piercing howl!" @@ -145415,7 +145576,7 @@ msgstr "友好的NPC不会拾取该区域内的物品。" #: src/clzones.cpp msgid "NPC Retreat" -msgstr "NPC撤离" +msgstr "NPC:撤离区" #: src/clzones.cpp msgid "" @@ -145425,7 +145586,7 @@ msgstr "当撤离时,如果友好的NPC离该区域60格范围之内,他们 #: src/clzones.cpp msgid "NPC Ignore Sounds" -msgstr "NPC无视声音" +msgstr "NPC:噪音无视区域" #: src/clzones.cpp msgid "Friendly NPCs won't investigate unseen sounds coming from this zone." @@ -145433,7 +145594,7 @@ msgstr "友好的NPC不会调查从这个区域传来,且在视野外的声音 #: src/clzones.cpp msgid "NPC Investigation Area" -msgstr "NPC调查区域" +msgstr "NPC:噪音警戒区域" #: src/clzones.cpp msgid "" @@ -146994,7 +147155,7 @@ msgstr "在为%s进行最后的仪式之后,你会感到悲伤,但也会感 msgid "" "You bury remains of %s, who joined uncounted masses perished in the " "Cataclysm." -msgstr "" +msgstr "你埋葬了%s,他成为了在大灾变之中丧生的无数人之中的一员。" #: src/construction.cpp msgid "Inscribe something on the grave?" @@ -147702,22 +147863,22 @@ msgstr "%s协助了你制作……" #: src/crafting.cpp #, c-format msgid "You mess up and destroy the %s." -msgstr "" +msgstr "你搞砸了,毁了%s。" #: src/crafting.cpp #, c-format msgid " messes up and destroys the %s" -msgstr "" +msgstr "弄乱并破坏了%s" #: src/crafting.cpp #, c-format msgid "You mess up and lose %d%% progress." -msgstr "" +msgstr "你搞砸了,损失了%d%%的进度。" #: src/crafting.cpp #, c-format msgid " messes up and loses %d%% progress." -msgstr "" +msgstr "搞砸了,损失了%d%%的进度。" #: src/crafting.cpp #, c-format @@ -150194,7 +150355,7 @@ msgstr "……但是从不在黄昏时抽。" #: src/effect.cpp msgid "Dave's not here, man." -msgstr "戴维不在这儿,哥们儿。" +msgstr "戴夫不在这儿,哥们儿。" #: src/effect.cpp msgid "Man, a cheeseburger sounds SO awesome right now." @@ -153368,7 +153529,7 @@ msgstr "派系营地" #: src/game.cpp #, c-format msgid "The %s is dangerously close!" -msgstr "" +msgstr "%s危险地靠近了。" #: src/game.cpp msgid "Confirm:" @@ -154056,7 +154217,7 @@ msgstr "不能在骑乘时与载具互动。" #: src/game.cpp msgid "You cannot use a console while mounted." -msgstr "挂载时不能使用控制台。" +msgstr "骑乘时不能使用控制台。" #: src/game.cpp #, c-format @@ -154588,7 +154749,7 @@ msgstr "将%s从%s取出?" #: src/game.cpp #, c-format msgid "There's an angry red dot on your body, %s to brush it off." -msgstr "" +msgstr "你身上有一个鲜红的光点。按\"%s\"忽略警告。" #: src/game.cpp #, c-format @@ -154727,7 +154888,7 @@ msgstr "你在%s上弄伤了你的右脚!" #: src/game.cpp #, c-format msgid "Your %s gets cut!" -msgstr "" +msgstr "你的%s被割伤了!" #. ~ 1$s - bodypart name in accusative, 2$s is terrain name. #: src/game.cpp @@ -154803,7 +154964,7 @@ msgstr "%s开始驾驶。" #: src/game.cpp msgid "" "There are vehicle controls here but you cannot reach them whilst mounted." -msgstr "" +msgstr "这里有载具控制器,但骑乘时你够不到它。" #: src/game.cpp msgid "" @@ -155609,7 +155770,7 @@ msgstr "%s 到 %d(%d)" #: src/game_inventory.cpp msgid "TRAINS (CURRENT)" -msgstr "" +msgstr "列车(当前)" #: src/game_inventory.cpp msgid "RECIPES" @@ -155741,7 +155902,7 @@ msgstr "输入新字母。按\"空格\"键清除已分配按键,按\"ESC\"键 msgid "" "Note: The Auto Inventory Letters setting might still reassign a letter to this item.\n" "If this is undesired, you may wish to change the setting in Options." -msgstr "" +msgstr "注意:“自动分配字母”功能仍然会为此物品重新分配字母,如果你不希望这样,在选项中修改。" #: src/game_inventory.cpp msgid "" @@ -155815,7 +155976,7 @@ msgstr "%s,%s" #: src/game_inventory.cpp #, c-format msgid "%i%%" -msgstr "" +msgstr "%i%%" #: src/gamemode.cpp msgid "Tutorial" @@ -155884,7 +156045,7 @@ msgstr "无车辆连在挂钩上。" #: src/grab.cpp #, c-format msgid "You cannot move this vehicle whilst your %s is harnessed!" -msgstr "" +msgstr "你不能移动这个载具,%s正挽在上面。" #: src/grab.cpp #, c-format @@ -159202,7 +159363,7 @@ msgstr "* 这份食物被冷冻过一次,解冻后口感变得 粘糊而 #: src/item.cpp msgid "* It seems that deep freezing killed all parasites." -msgstr "* 这份食物经过冷冻,杀死寄生虫。" +msgstr "* 这份食物经过冷冻,没有寄生虫。" #: src/item.cpp msgid "" @@ -166305,7 +166466,7 @@ msgstr "健康" #: src/magic.cpp msgid "mana" -msgstr "玛哪" +msgstr "魔力" #: src/magic.cpp msgid "stamina" @@ -166329,8 +166490,8 @@ msgid "" "Learning this spell will make you a %s and lock you out of other unique spells.\n" "Continue?" msgstr "" -"学习此法术将使你获得%s并将使你无法学习其他独特的法术。\n" -"继续?" +"学习此法术将使你成为%s并将使你无法学习其他职业的法术。\n" +"是否继续?" #: src/magic.cpp #, c-format @@ -169414,7 +169575,7 @@ msgstr "一个柔和的机器声音说道:“放开那个病人!再妨碍我 msgid "" "a soft robotic voice say, \"Greetings kinbot. Please take good care of this" " patient.\"" -msgstr "一个柔和的机器人声音说,“问候金博特。请好好照顾这个病人。”" +msgstr "一个柔和的机器人声音说,“欢迎,姐妹。请好好照顾这个病人。”" #: src/monattack.cpp #, c-format @@ -170306,7 +170467,7 @@ msgstr "带上背包" #: src/monexamine.cpp #, c-format msgid "Remove vehicle harness from %s" -msgstr "移除马具从%s" +msgstr "从%s上移除马具" #: src/monexamine.cpp #, c-format @@ -170363,17 +170524,17 @@ 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" @@ -170382,11 +170543,11 @@ msgstr "你根本不懂如何骑马" #: src/monexamine.cpp #, c-format msgid "You are too heavy to mount %s" -msgstr "你太重了,不能上马%s" +msgstr "你太重了,不能骑乘%s" #: src/monexamine.cpp msgid "You are not skilled enough to ride without a saddle" -msgstr "你没有马鞍驾驭马匹还不够熟练" +msgstr "你还不够熟练,不能无鞍骑乘" #: src/monexamine.cpp #, c-format @@ -172615,7 +172776,7 @@ msgstr "每个人" #: src/npctalk.cpp #, c-format msgid "%s currently has these temporary orders:" -msgstr "%s突然接到紧急命令:" +msgstr "%s接受的紧急命令如下:" #: src/npctalk.cpp msgid "None." @@ -172791,7 +172952,7 @@ msgstr "就像你一样。" #: src/npctalk.cpp #, c-format msgid "You yell %s" -msgstr "你大喊:%s" +msgstr "你大喊%s" #: src/npctalk.cpp #, c-format @@ -176201,7 +176362,7 @@ msgstr "位置" #: src/panels.cpp msgid "Mana" -msgstr "玛哪" +msgstr "魔力" #: src/panels.cpp msgid "Weather" @@ -176600,7 +176761,7 @@ msgstr "你力竭了,无法奔跑。" #: src/player.cpp msgid "You slow your steed to a walk." -msgstr "你令自己的马缓慢下来" +msgstr "你令自己的马缓慢下来。" #: src/player.cpp msgid "You start crouching." @@ -176608,7 +176769,7 @@ msgstr "你开始蹲伏。" #: src/player.cpp msgid "You nudge your steed to a steady trot." -msgstr "你轻轻触碰你的马,使它平稳地小跑" +msgstr "你轻轻触碰你的马,使它平稳地小跑。" #: src/player.cpp msgid "You start walking." @@ -178507,7 +178668,7 @@ msgstr "你的身体由于负重过高而感到疼痛!" #: src/player.cpp msgid "You fall off your mount!" -msgstr "你从山上摔下来了!" +msgstr "你从坐骑背上摔了下来!" #: src/player.cpp src/trapfunc.cpp msgid "You hurt yourself!" @@ -178516,12 +178677,12 @@ msgstr "你伤到了你自己!" #: src/player.cpp msgctxt "memorial_male" msgid "Fell off a mount." -msgstr "从山上摔下来" +msgstr "从坐骑背上坠落。" #: src/player.cpp msgctxt "memorial_female" msgid "Fell off a mount." -msgstr "从山上摔下来" +msgstr "从坐骑背上坠落。" #: src/player.cpp msgid "Dismount where?" diff --git a/lang/po/zh_TW.po b/lang/po/zh_TW.po index c393715765dd2..34a37c691276e 100644 --- a/lang/po/zh_TW.po +++ b/lang/po/zh_TW.po @@ -21,8 +21,8 @@ # Laughing Man, 2019 # Hsinyu Chan, 2019 # Brett Dong , 2019 -# xap, 2019 # kiddragon Chung , 2019 +# xap, 2019 # msgid "" msgstr "" @@ -30,7 +30,7 @@ msgstr "" "Report-Msgid-Bugs-To: \n" "POT-Creation-Date: 2019-06-07 17:32+0800\n" "PO-Revision-Date: 2018-04-26 14:47+0000\n" -"Last-Translator: kiddragon Chung , 2019\n" +"Last-Translator: xap, 2019\n" "Language-Team: Chinese (Taiwan) (https://www.transifex.com/cataclysm-dda-translators/teams/2217/zh_TW/)\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" @@ -149938,15 +149938,15 @@ msgstr "" #: src/faction_camp.cpp msgid "You must build your camp in an empty field." -msgstr "" +msgstr "你必須在空地才能建造營區。" #: src/faction_camp.cpp msgid "You need more room for camp expansions!" -msgstr "" +msgstr "你需要更多房間來擴充營區!" #: src/faction_camp.cpp msgid "You are too close to another camp!" -msgstr "" +msgstr "你太靠近另一個營區!" #: src/faction_camp.cpp msgid "" @@ -171437,25 +171437,25 @@ msgstr "%1$s 給了你 %2$s" #: src/npctalk.cpp #, c-format msgid "%1$s gives you %2$d %3$s" -msgstr "" +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 "" +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 "" +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 "You give %1$s %2$d %3$s" -msgstr "" +msgstr "你給予 %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 @@ -175530,7 +175530,7 @@ msgstr "你溺水了!" #: src/player.cpp msgid "You shed a tooth!" -msgstr "" +msgstr "你掉了一顆牙!" #. ~Sound of buzzing Insect Wings #: src/player.cpp @@ -175584,7 +175584,7 @@ msgstr "你突然感到炎熱。" #: src/player.cpp #, c-format msgid "%1$s gets angry!" -msgstr "" +msgstr "%1$s 生氣了!" #: src/player.cpp #, c-format @@ -175598,75 +175598,75 @@ msgstr "" #: src/player.cpp msgid "Hey, can you hear me?" -msgstr "" +msgstr "嘿,你能聽見我嗎?" #: src/player.cpp msgid "Don't touch me." -msgstr "" +msgstr "別碰我。" #: src/player.cpp msgid "What's your name?" -msgstr "" +msgstr "你的名字是什麼?" #: src/player.cpp msgid "I thought you were my friend." -msgstr "" +msgstr "我以為你是我的朋友。" #: src/player.cpp msgid "How are you today?" -msgstr "" +msgstr "你今天過的好嗎?" #: src/player.cpp msgid "Shut up! Don't lie to me." -msgstr "" +msgstr "閉嘴!別騙我。" #: src/player.cpp msgid "Please, don't go." -msgstr "" +msgstr "拜託,別走。" #: src/player.cpp msgid "Don't leave me alone!" -msgstr "" +msgstr "不要放我一個人!" #: src/player.cpp msgid "Yeah, sure." -msgstr "" +msgstr "耶,當然。" #: src/player.cpp msgid "No way, man." -msgstr "" +msgstr "不行啊大哥!" #: src/player.cpp msgid "Do you really think so?" -msgstr "" +msgstr "你真的這麼想?" #: src/player.cpp msgid "Is it really time for that?" -msgstr "" +msgstr "這時候真的要這樣做?" #: src/player.cpp msgid "Sorry, I can't hear you." -msgstr "" +msgstr "抱歉,我聽不到你。" #: src/player.cpp msgid "You've told me already." -msgstr "" +msgstr "你已經告訴過我了。" #: src/player.cpp msgid "I know!" -msgstr "" +msgstr "我知道了!" #: src/player.cpp msgid "Why are you following me?" -msgstr "" +msgstr "你為什麼跟著我?" #: src/player.cpp msgid "This place is dangerous, you shouldn't be here." -msgstr "" +msgstr "這個地方很危險,你不應該待在這。" #: src/player.cpp msgid "That's not true, is it?" -msgstr "" +msgstr "這不是真的吧?" #: src/player.cpp msgid "Are you hurt?" @@ -175674,12 +175674,12 @@ msgstr "你受傷了嗎?" #: src/player.cpp msgid "Your " -msgstr "" +msgstr "你的" #: src/player.cpp #, c-format msgid "Hey, let's go kill that %1$s!" -msgstr "" +msgstr "嘿,我們去殺了那個 %1$s !" #: src/player.cpp #, c-format @@ -175689,12 +175689,12 @@ msgstr "你有看到那個 %1$s !?" #: src/player.cpp #, c-format msgid "I want to kill that %1$s!" -msgstr "" +msgstr "我要殺了那個 %1$s !" #: src/player.cpp #, c-format msgid "Let me kill that %1$s!" -msgstr "" +msgstr "讓我殺了那個 %1$s !" #: src/player.cpp #, c-format @@ -175732,7 +175732,7 @@ msgstr "你流血了!" #: src/player.cpp msgid "Your wound looks pretty bad." -msgstr "" +msgstr "你的傷口看起來不妙。" #: src/player.cpp msgid "Shouldn't you put a bandage on that?" @@ -175748,7 +175748,7 @@ msgstr "你看你來受傷了,是因為我嗎?" #: src/player.cpp msgid "Are you supposed to be bleeding?" -msgstr "" +msgstr "你不是應該會流血嗎?" #: src/player.cpp msgid "You're not going to die, are you?" @@ -175756,11 +175756,11 @@ msgstr "你不會死的,對吧?" #: src/player.cpp msgid "Kill a few more before you bleed out!" -msgstr "" +msgstr "在流血至死前多殺一些!" #: src/player.cpp msgid "Hey fix me up." -msgstr "" +msgstr "嘿 把我修好。" #: src/player.cpp msgid "I need healing!" @@ -175768,15 +175768,15 @@ msgstr "我需要醫療!" #: src/player.cpp msgid "I hurt all over..." -msgstr "" +msgstr "我傷的很重..." #: src/player.cpp msgid "You can put me back together, right?" -msgstr "" +msgstr "你可以把我修好,對吧?" #: src/player.cpp msgid "I... I can't move my legs!" -msgstr "" +msgstr "我...我的腿不能動了!" #: src/player.cpp msgid "Medic!" @@ -175792,7 +175792,7 @@ msgstr "他們抓到我了!" #: src/player.cpp msgid "Go on without me..." -msgstr "" +msgstr "快走不用等我..." #: src/player.cpp msgid "Am I gonna die?" @@ -176230,7 +176230,7 @@ msgstr "重新填裝 %s" #: src/player.cpp #, c-format msgid "Select ammo for %s" -msgstr "" +msgstr "選擇 %s 的彈藥" #. ~ magazine with ammo count #: src/player.cpp @@ -177947,7 +177947,7 @@ msgstr "投擲 %s" #: src/ranged.cpp #, c-format msgid "Blind throwing %s" -msgstr "" +msgstr "盲擲 %s" #: src/ranged.cpp msgid "Set target" @@ -179297,7 +179297,7 @@ msgstr "所需技能:\n" #: src/veh_interact.cpp #, c-format msgid "> %1$s%2$s %3$i\n" -msgstr "" +msgstr "> %1$s%2$s %3$i\n" #: src/veh_interact.cpp #, c-format @@ -179321,14 +179321,14 @@ msgstr "額外需求:\n" #: src/veh_interact.cpp #, c-format msgid "> %1$s%2$s %3$i for extra engines." -msgstr "" +msgstr "> %1$s>%2$s %3$i 以安裝更多引擎。" #. ~ %1$s represents the internal color name which shouldn't be translated, #. %2$s is skill name, and %3$i is skill level #: src/veh_interact.cpp #, c-format msgid "> %1$s%2$s %3$i for extra steering axles." -msgstr "" +msgstr "> %1$s>%2$s %3$i 以安裝更多轉向軸。" #: src/veh_interact.cpp #, c-format @@ -179343,12 +179343,12 @@ msgstr "力量 %d" #: src/veh_interact.cpp #, c-format msgid "1 tool with %1$s %2$d" -msgstr "" +msgstr "1 個有 %1$s %2$d 的工具" #: src/veh_interact.cpp #, c-format msgid "> %1$s OR %2$s" -msgstr "" +msgstr "> %1$s 或 %2$s" #: src/veh_interact.cpp msgid "Your morale is too low to construct..." @@ -179604,6 +179604,7 @@ msgid "" "> %1$s1 tool with %2$s %3$i OR %4$sstrength " "%5$i" msgstr "" +"> %1$s 1 工具 %2$s %3$i 或 %4$s 力量%5$i" #. ~ %1$s represents the internal color name which shouldn't be translated, #. %2$s is pre-translated reason @@ -179670,6 +179671,8 @@ msgid "" "To change a wheel you need a %1$swrench, a %2$swheel, and " "either %3$slifting equipment or %4$s%5$d strength." msgstr "" +"你需要一個 %1$s 扳手、一個 %2$s 輪胎、以及一個 %3$s 起重裝置或 %4$s " +"%5$d 點力量才能替換輪胎。" #: src/veh_interact.cpp msgid "Who is driving while you work?" @@ -179968,7 +179971,7 @@ msgstr "輪胎寬度" #: src/veh_interact.cpp msgid "Electric Power" -msgstr "" +msgstr "電能" #: src/veh_interact.cpp msgid "Epwr" @@ -179982,7 +179985,7 @@ msgstr "電量: %s" #: src/veh_interact.cpp #, c-format msgid "Drain: %+8d" -msgstr "" +msgstr "消耗: %+8d" #: src/veh_interact.cpp msgid "boardable" @@ -180909,17 +180912,17 @@ msgstr "" #: src/vehicle_use.cpp #, c-format msgid "the %s making a long beep" -msgstr "" +msgstr "%s 發出很長的嗶嗶響聲。" #: src/vehicle_use.cpp #, c-format msgid "the %s clicking once" -msgstr "" +msgstr "%s 發出咔嚓聲。" #: src/vehicle_use.cpp #, c-format msgid "the %s rapidly clicking" -msgstr "" +msgstr "%s 發出急促的咔嚓聲。" #: src/vehicle_use.cpp #, c-format @@ -180957,7 +180960,7 @@ msgstr "你按了喇叭, 但沒有事發生。" #: src/vehicle_use.cpp #, c-format msgid "Move how many? [Have %d] (0 to cancel)" -msgstr "" +msgstr "要移動多少? [擁有 %d] (0 為取消)" #: src/vehicle_use.cpp msgid "a simple melody blaring from the loudspeakers." @@ -181103,7 +181106,7 @@ msgstr "捕捉或釋放生物" #: src/vehicle_use.cpp msgid "Load or unload a vehicle" -msgstr "" +msgstr "裝載或卸載車輛" #: src/vehicle_use.cpp msgid "Harness an animal" diff --git a/src/active_item_cache.cpp b/src/active_item_cache.cpp index ebc45fa62834b..61aacbe5bfa26 100644 --- a/src/active_item_cache.cpp +++ b/src/active_item_cache.cpp @@ -3,10 +3,12 @@ #include #include +#include "colony.h" #include "debug.h" #include "item.h" +#include "item_stack.h" -void active_item_cache::remove( std::list::iterator it, point location ) +void active_item_cache::remove( item_stack::iterator it, point location ) { const auto predicate = [&]( const item_reference & active_item ) { return location == active_item.location && active_item.item_iterator == it; @@ -29,7 +31,7 @@ void active_item_cache::remove( std::list::iterator it, point location ) } } -void active_item_cache::add( std::list::iterator it, point location ) +void active_item_cache::add( item_stack::iterator it, point location ) { if( has( it, location ) ) { return; @@ -38,7 +40,7 @@ void active_item_cache::add( std::list::iterator it, point location ) active_item_set[ &*it ] = false; } -bool active_item_cache::has( std::list::iterator it, point ) const +bool active_item_cache::has( item_stack::iterator it, point ) const { return active_item_set.find( &*it ) != active_item_set.end(); } diff --git a/src/active_item_cache.h b/src/active_item_cache.h index 5810ca66ec661..497d06bfc20f1 100644 --- a/src/active_item_cache.h +++ b/src/active_item_cache.h @@ -5,13 +5,15 @@ #include #include +#include "colony.h" #include "enums.h" #include "item.h" +#include "item_stack.h" // A struct used to uniquely identify an item within a submap or vehicle. struct item_reference { point location; - std::list::iterator item_iterator; + item_stack::iterator item_iterator; // Do not access this from outside this module, it is only used as an ID for active_item_set. item *item_id; }; @@ -25,9 +27,9 @@ class active_item_cache std::unordered_map active_item_set; public: - void remove( std::list::iterator it, point location ); - void add( std::list::iterator it, point location ); - bool has( std::list::iterator it, point ) const; + void remove( item_stack::iterator it, point location ); + void add( item_stack::iterator it, point location ); + bool has( item_stack::iterator it, point ) const; // Use this one if there's a chance that the item being referenced has been invalidated. bool has( const item_reference &itm ) const; bool empty() const; diff --git a/src/activity_handlers.cpp b/src/activity_handlers.cpp index e2d3e455e3bce..73053173cda8c 100644 --- a/src/activity_handlers.cpp +++ b/src/activity_handlers.cpp @@ -119,6 +119,7 @@ activity_handlers::do_turn_functions = { { activity_id( "ACT_PICKUP" ), pickup_do_turn }, { activity_id( "ACT_WEAR" ), wear_do_turn }, { activity_id( "ACT_MULTIPLE_CONSTRUCTION" ), multiple_construction_do_turn }, + { activity_id( "ACT_BLUEPRINT_CONSTRUCTION" ), blueprint_construction_do_turn }, { activity_id( "ACT_BUILD" ), build_do_turn }, { activity_id( "ACT_EAT_MENU" ), eat_menu_do_turn }, { activity_id( "ACT_CONSUME_FOOD_MENU" ), consume_food_menu_do_turn }, @@ -331,33 +332,11 @@ static void butcher_cbm_group( const std::string &group, const tripoint &pos, static void set_up_butchery( player_activity &act, player &u, butcher_type action ) { - if( !act.values.empty() ) { - act.index = act.values.back(); - act.values.pop_back(); - } else { - debugmsg( "Invalid butchery item index %d", act.index ); - act.set_to_null(); - return; - } - const int factor = u.max_quality( action == DISSECT ? quality_id( "CUT_FINE" ) : quality_id( "BUTCHER" ) ); - auto items = g->m.i_at( u.pos() ); - if( static_cast( act.index ) >= items.size() ) { - // Let it print a msg for lack of corpses - act.index = INT_MAX; - return; - } - item corpse_item = items[act.index]; - const mtype *corpse_ptr = corpse_item.get_mtype(); - if( corpse_ptr == nullptr ) { - debugmsg( "Tried to butcher a non-corpse item, %s", - corpse_item.tname( corpse_item.count() ) ); - act.set_to_null(); - return; - } - const mtype &corpse = *corpse_ptr; + const item &corpse_item = *act.targets.back(); + const mtype &corpse = *corpse_item.get_mtype(); if( action != DISSECT ) { if( factor == INT_MIN ) { @@ -421,32 +400,32 @@ static void set_up_butchery( player_activity &act, player &u, butcher_type actio if( !u.has_quality( quality_id( "CUT" ) ) ) { u.add_msg_if_player( m_info, _( "You need a cutting tool to perform a full butchery." ) ); - act.index = -1; + act.targets.pop_back(); return; } if( big_corpse ) { if( has_rope && !has_tree_nearby && !b_rack_present ) { u.add_msg_if_player( m_info, _( "You need to suspend this corpse to butcher it. While you have a rope to lift the corpse, there is no tree nearby to hang it from." ) ); - act.index = -1; + act.targets.pop_back(); return; } if( !has_rope && !b_rack_present ) { u.add_msg_if_player( m_info, - _( "To perform a full butchery on a corpse this big, you need either a butchering rack or both a long rope in your inventory and a nearby tree to hang the corpse from." ) ); - act.index = -1; + _( "To perform a full butchery on a corpse this big, you need either a butchering rack, a nearby hanging meathook, or both a long rope in your inventory and a nearby tree to hang the corpse from." ) ); + act.targets.pop_back(); return; } if( !has_table_nearby ) { u.add_msg_if_player( m_info, _( "To perform a full butchery on a corpse this big, you need a table nearby or something else with a flat surface. A leather tarp spread out on the ground could suffice." ) ); - act.index = -1; + act.targets.pop_back(); return; } if( !( u.has_quality( quality_id( "SAW_W" ) ) || u.has_quality( quality_id( "SAW_M" ) ) ) ) { u.add_msg_if_player( m_info, _( "For a corpse this big you need a saw to perform a full butchery." ) ); - act.index = -1; + act.targets.pop_back(); return; } } @@ -456,20 +435,20 @@ static void set_up_butchery( player_activity &act, player &u, butcher_type actio corpse_item.has_flag( "FIELD_DRESS_FAILED" ) ) ) { u.add_msg_if_player( m_info, _( "It would be futile to search for implants inside this badly damaged corpse." ) ); - act.index = -1; + act.targets.pop_back(); return; } if( action == F_DRESS && ( corpse_item.has_flag( "FIELD_DRESS" ) || corpse_item.has_flag( "FIELD_DRESS_FAILED" ) ) ) { u.add_msg_if_player( m_info, _( "This corpse is already field dressed." ) ); - act.index = -1; + act.targets.pop_back(); return; } if( action == SKIN && corpse_item.has_flag( "SKINNED" ) ) { u.add_msg_if_player( m_info, _( "This corpse is already skinned." ) ); - act.index = -1; + act.targets.pop_back(); return; } @@ -477,18 +456,18 @@ static void set_up_butchery( player_activity &act, player &u, butcher_type actio if( corpse.size == MS_TINY ) { u.add_msg_if_player( m_bad, _( "This corpse is too small to quarter without damaging." ), corpse.nname() ); - act.index = -1; + act.targets.pop_back(); return; } if( corpse_item.has_flag( "QUARTERED" ) ) { u.add_msg_if_player( m_bad, _( "This is already quartered." ), corpse.nname() ); - act.index = -1; + act.targets.pop_back(); return; } if( !( corpse_item.has_flag( "FIELD_DRESS" ) || corpse_item.has_flag( "FIELD_DRESS_FAILED" ) ) ) { u.add_msg_if_player( m_bad, _( "You need to perform field dressing before quartering." ), corpse.nname() ); - act.index = -1; + act.targets.pop_back(); return; } } @@ -515,12 +494,16 @@ static void set_up_butchery( player_activity &act, player &u, butcher_type actio } } else { u.add_msg_if_player( m_good, _( "It needs a coffin, not a knife." ) ); - act.index = -1; + act.targets.pop_back(); return; } } act.moves_left = butcher_time_to_cut( u, corpse_item, action ); + + // We have a valid target, so preform the full finish function + // instead of just selecting the next valid target + act.index = false; } int butcher_time_to_cut( const player &u, const item &corpse_item, const butcher_type action ) @@ -592,6 +575,7 @@ int butcher_time_to_cut( const player &u, const item &corpse_item, const butcher time_to_cut = time_to_cut * ( 1 - ( g->u.get_num_crafting_helpers( 3 ) / 10 ) ); return time_to_cut; } + // The below function exists to allow mods to migrate their content fully to the new harvest system. This function should be removed eventually. static harvest_id butchery_flags_deprecate( const mtype &mt ) { @@ -786,7 +770,7 @@ static void butchery_drops_harvest( item *corpse_item, const mtype &mt, player & if( entry.drop == "pheromone" ) { if( one_in( 3 ) ) { p.add_msg_if_player( m_bad, - _( "You notice some strange organs, pehraps harvestable via careful dissection." ) ); + _( "You notice some strange organs, perhaps harvestable via careful dissection." ) ); } continue; } @@ -1020,6 +1004,21 @@ static void butchery_quarter( item *corpse_item, player &p ) void activity_handlers::butcher_finish( player_activity *act, player *p ) { + // No targets means we are done + if( act->targets.empty() ) { + act->set_to_null(); + return; + } + + item_location &target = act->targets.back(); + + // Corpses can disappear (rezzing!), so check for that + if( !target || !target->is_corpse() ) { + p->add_msg_if_player( m_info, _( "There's no corpse to butcher!" ) ); + act->set_to_null(); + return; + } + butcher_type action = BUTCHER; if( act->id() == activity_id( "ACT_BUTCHER" ) ) { action = BUTCHER; @@ -1037,34 +1036,21 @@ void activity_handlers::butcher_finish( player_activity *act, player *p ) action = DISMEMBER; } - //Negative index means try to start next item - if( act->index < 0 ) { - //No values means no items left to try - if( act->values.empty() ) { - act->set_to_null(); - return; - } + // index is a bool that determines if we are ready to start the next target + if( act->index ) { set_up_butchery( *act, *p, action ); return; } - // Corpses can disappear (rezzing!), so check for that - auto items_here = g->m.i_at( p->pos() ); - if( static_cast( items_here.size() ) <= act->index || - !( items_here[act->index].is_corpse() ) ) { - p->add_msg_if_player( m_info, _( "There's no corpse to butcher!" ) ); - act->set_to_null(); - return; - } - item &corpse_item = items_here[act->index]; - auto contents = corpse_item.contents; + item &corpse_item = *target; + std::list contents = corpse_item.contents; const mtype *corpse = corpse_item.get_mtype(); const field_id type_blood = corpse->bloodType(); const field_id type_gib = corpse->gibType(); if( action == QUARTER ) { butchery_quarter( &corpse_item, *p ); - act->index = -1; + act->index = true; return; } @@ -1114,7 +1100,11 @@ void activity_handlers::butcher_finish( player_activity *act, player *p ) _( "You made so many mistakes during the process that you doubt even vultures will be interested in what's left of it." ) ); break; } - g->m.i_rem( p->pos(), act->index ); + + // Remove the target from the map + target.remove_item(); + act->targets.pop_back(); + g->m.add_splatter( type_gib, p->pos(), rng( corpse->size + 2, ( corpse->size + 1 ) * 2 ) ); g->m.add_splatter( type_blood, p->pos(), rng( corpse->size + 2, ( corpse->size + 1 ) * 2 ) ); for( int i = 1; i <= corpse->size; i++ ) { @@ -1123,7 +1113,9 @@ void activity_handlers::butcher_finish( player_activity *act, player *p ) g->m.add_splatter_trail( type_blood, p->pos(), random_entry( g->m.points_in_radius( p->pos(), corpse->size + 1 ) ) ); } - act->index = -1; + + // Ready to move on to the next item, if there is one + act->index = true; return; } // function just for drop yields @@ -1156,11 +1148,17 @@ void activity_handlers::butcher_finish( player_activity *act, player *p ) p->add_msg_if_player( m_good, _( "You apply few quick cuts to the %s and leave what's left of it for scavengers." ), corpse_item.tname() ); - g->m.i_rem( p->pos(), act->index ); - break; //no set_to_null here, for multibutchering + + // Remove the target from the map + target.remove_item(); + act->targets.pop_back(); + break; case BUTCHER_FULL: p->add_msg_if_player( m_good, _( "You finish butchering the %s." ), corpse_item.tname() ); - g->m.i_rem( p->pos(), act->index ); + + // Remove the target from the map + target.remove_item(); + act->targets.pop_back(); break; case F_DRESS: if( roll_butchery() < 0 ) { // partial failure @@ -1249,15 +1247,22 @@ void activity_handlers::butcher_finish( player_activity *act, player *p ) case 3: p->add_msg_if_player( m_good, _( "You cleave the %s into pieces." ), corpse_item.tname() ); } - g->m.i_rem( p->pos(), act->index ); + + // Remove the target from the map + target.remove_item(); + act->targets.pop_back(); break; case DISSECT: p->add_msg_if_player( m_good, _( "You finish dissecting the %s." ), corpse_item.tname() ); - g->m.i_rem( p->pos(), act->index ); + + // Remove the target from the map + target.remove_item(); + act->targets.pop_back(); break; } - // multibutchering - act->index = -1; + + // Ready to move on to the next item, if there is one (for example if multibutchering) + act->index = true; } void activity_handlers::fill_liquid_do_turn( player_activity *act, player *p ) @@ -1268,7 +1273,7 @@ void activity_handlers::fill_liquid_do_turn( player_activity *act, player *p ) vehicle *source_veh = nullptr; const tripoint source_pos = act_ref.coords.at( 0 ); map_stack source_stack = g->m.i_at( source_pos ); - std::list::iterator on_ground; + map_stack::iterator on_ground; monster *source_mon = nullptr; item liquid; const auto source_type = static_cast( act_ref.values.at( 0 ) ); @@ -1380,9 +1385,12 @@ void activity_handlers::fill_liquid_do_turn( player_activity *act, player *p ) add_msg( _( "With a clang and a shudder, the %s pump goes silent." ), liquid.type_name( 1 ) ); } else if( g->m.furn( source_pos ).obj().examine == &iexamine::fvat_full ) { - g->m.furn_set( source_pos, f_fvat_empty ); add_msg( _( "You squeeze the last drops of %s from the vat." ), liquid.type_name( 1 ) ); + map_stack items_here = g->m.i_at( source_pos ); + if( items_here.empty() ) { + g->m.furn_set( source_pos, f_fvat_empty ); + } } act_ref.set_to_null(); } @@ -2366,7 +2374,7 @@ void activity_handlers::repair_item_finish( player_activity *act, player *p ) return; } if( actor->can_repair_target( *p, *item_loc, true ) ) { - act->targets.emplace_back( item_loc.clone() ); + act->targets.emplace_back( item_loc ); repeat = REPEAT_INIT; } } @@ -2560,9 +2568,9 @@ void activity_handlers::pickup_do_turn( player_activity *, player * ) activity_on_turn_pickup(); } -void activity_handlers::wear_do_turn( player_activity *, player * ) +void activity_handlers::wear_do_turn( player_activity *act, player *p ) { - activity_on_turn_wear(); + activity_on_turn_wear( *act, *p ); } // This activity opens the menu (it's not meant to queue consumption of items) @@ -2586,9 +2594,9 @@ void activity_handlers::consume_meds_menu_do_turn( player_activity *, player * ) g->eat( game_menus::inv::consume_meds ); } -void activity_handlers::move_items_do_turn( player_activity *, player * ) +void activity_handlers::move_items_do_turn( player_activity *act, player *p ) { - activity_on_turn_move_items(); + activity_on_turn_move_items( *act, *p ); } void activity_handlers::move_loot_do_turn( player_activity *act, player *p ) @@ -2923,6 +2931,11 @@ void activity_handlers::multiple_construction_do_turn( player_activity *act, pla } } +void activity_handlers::blueprint_construction_do_turn( player_activity *act, player *p ) +{ + activity_on_turn_blueprint_move( *act, *p ); +} + void activity_handlers::craft_do_turn( player_activity *act, player *p ) { item *craft = act->targets.front().get_item(); @@ -3907,14 +3920,23 @@ void activity_handlers::spellcasting_finish( player_activity *act, player *p ) } return; } + + if( casting.has_flag( spell_flag::VERBAL ) ) { + sounds::sound( p->pos(), p->get_shout_volume() / 2, sounds::sound_t::speech, _( "cast a spell" ), + false ); + } + p->add_msg_if_player( _( "You cast %s!" ), casting.name() ); // figure out which function is the effect (maybe change this into how iuse or activity_handlers does it) + // TODO: refactor these so make_sound can be called inside each of these functions const std::string fx = casting.effect(); if( fx == "pain_split" ) { spell_effect::pain_split(); + casting.make_sound( p->pos() ); } else if( fx == "move_earth" ) { spell_effect::move_earth( target ); + casting.make_sound( target ); } else if( fx == "target_attack" ) { spell_effect::target_attack( casting, p->pos(), target ); } else if( fx == "projectile_attack" ) { @@ -3925,10 +3947,15 @@ void activity_handlers::spellcasting_finish( player_activity *act, player *p ) spell_effect::line_attack( casting, p->pos(), target ); } else if( fx == "teleport_random" ) { spell_effect::teleport( casting.range(), casting.range() + casting.aoe() ); + casting.make_sound( p->pos() ); } else if( fx == "spawn_item" ) { spell_effect::spawn_ethereal_item( casting ); + casting.make_sound( p->pos() ); } else if( fx == "recover_energy" ) { spell_effect::recover_energy( casting, target ); + casting.make_sound( target ); + } else if( fx == "summon" ) { + spell_effect::spawn_summoned_monster( casting, p->pos(), target ); } else { debugmsg( "ERROR: Spell effect not defined properly." ); } @@ -3947,6 +3974,10 @@ void activity_handlers::spellcasting_finish( player_activity *act, player *p ) break; case hp_energy: blood_magic( p, cost ); + break; + case fatigue_energy: + p->mod_fatigue( cost ); + break; case none_energy: default: break; diff --git a/src/activity_handlers.h b/src/activity_handlers.h index 5b5e822a0be92..af708af676661 100644 --- a/src/activity_handlers.h +++ b/src/activity_handlers.h @@ -33,11 +33,11 @@ int butcher_time_to_cut( const player &u, const item &corpse_item, const butcher // activity_item_handling.cpp void activity_on_turn_drop(); -void activity_on_turn_move_items(); +void activity_on_turn_move_items( player_activity &act, player &p ); void activity_on_turn_move_loot( player_activity &act, player &p ); +void activity_on_turn_blueprint_move( player_activity &, player &p ); void activity_on_turn_pickup(); -void activity_on_turn_wear(); -void activity_on_turn_stash(); +void activity_on_turn_wear( player_activity &act, player &p ); void try_fuel_fire( player_activity &act, player &p, const bool starting_fire = false ); enum class item_drop_reason { @@ -76,6 +76,7 @@ void consume_drink_menu_do_turn( player_activity *act, player *p ); void consume_meds_menu_do_turn( player_activity *act, player *p ); void move_items_do_turn( player_activity *act, player *p ); void multiple_construction_do_turn( player_activity *act, player *p ); +void blueprint_construction_do_turn( player_activity *act, player *p ); void move_loot_do_turn( player_activity *act, player *p ); void adv_inventory_do_turn( player_activity *act, player *p ); void armor_layers_do_turn( player_activity *act, player *p ); @@ -164,6 +165,6 @@ void study_spell_finish( player_activity *act, player *p ); extern const std::map< activity_id, std::function > finish_functions; -} +} // namespace activity_handlers #endif diff --git a/src/activity_item_handling.cpp b/src/activity_item_handling.cpp index 821fb069c28fe..c9d415d9201ba 100644 --- a/src/activity_item_handling.cpp +++ b/src/activity_item_handling.cpp @@ -13,6 +13,7 @@ #include #include "avatar.h" +#include "construction.h" #include "clzones.h" #include "debug.h" #include "enums.h" @@ -55,6 +56,7 @@ const efftype_id effect_controlled( "controlled" ); const efftype_id effect_pet( "pet" ); const trap_str_id tr_firewood_source( "tr_firewood_source" ); +const trap_str_id tr_unfinished_construction( "tr_unfinished_construction" ); /** Activity-associated item */ struct act_item { @@ -535,84 +537,48 @@ void activity_handlers::drop_do_turn( player_activity *act, player *p ) pos, force_ground ); } -void activity_on_turn_wear() +void activity_on_turn_wear( player_activity &act, player &p ) { - // Wear activity has source square, bools indicating source type, - // indices of items on map or position of items in inventory, and quantities of same. - tripoint source = g->u.activity.placement + g->u.pos(); - bool from_inventory = g->u.activity.values[0]; - bool from_vehicle = g->u.activity.values[1]; - - // load vehicle information if requested - int s_cargo = -1; - vehicle *s_veh = nullptr; - - if( from_vehicle ) { - const cata::optional vp = g->m.veh_at( source ).part_with_feature( "CARGO", - false ); - assert( vp ); - s_veh = &vp->vehicle(); - s_cargo = vp->part_index(); - assert( s_cargo >= 0 ); - } - - std::list indices; - std::list quantities; - - if( g->u.activity.values.size() % 2 != 0 ) { - debugmsg( "ACT_WEAR started with uneven number of values." ); - g->u.cancel_activity(); - return; - } else { - // Note i = 2, skipping first 2 elements. - for( size_t i = 2; i < g->u.activity.values.size(); i += 2 ) { - indices.push_back( g->u.activity.values[i] ); - quantities.push_back( g->u.activity.values[ i + 1 ] ); + // ACT_WEAR has item_location targets, and int quatities + while( p.moves > 0 && !act.targets.empty() ) { + item_location target = std::move( act.targets.back() ); + int quantity = act.values.back(); + act.targets.pop_back(); + act.values.pop_back(); + + if( !target ) { + debugmsg( "Lost target item of ACT_WEAR" ); + continue; } - } - g->u.cancel_activity(); - while( g->u.moves > 0 && !indices.empty() ) { - int index = indices.back(); - int quantity = quantities.back(); - indices.pop_back(); - quantities.pop_back(); + // Make copies so the original remains untouched if wearing fails + item newit = *target; + item leftovers = newit; - if( from_inventory ) { - if( g->u.wear( index ) ) { - if( --quantity > 0 ) { - indices.push_back( index ); - quantities.push_back( quantity ); - } + // Handle charges, quantity == 0 means move all + if( quantity != 0 && newit.count_by_charges() ) { + leftovers.charges = newit.charges - quantity; + if( leftovers.charges > 0 ) { + newit.charges = quantity; } } else { - item *temp_item = from_vehicle ? g->m.item_from( s_veh, s_cargo, index ) : g->m.item_from( source, - index ); - if( temp_item == nullptr ) { - continue; // No such item. - } - // On successful wear remove from map or vehicle. - if( g->u.wear_item( *temp_item ) ) { - if( from_vehicle ) { - s_veh->remove_item( s_cargo, index ); - } else { - g->m.i_rem( source, index ); - } + leftovers.charges = 0; + } + + if( p.wear_item( newit ) ) { + // If we wore up a whole stack, remove the original item + // Otherwise, replace the item with the leftovers + if( leftovers.charges > 0 ) { + *target = std::move( leftovers ); + } else { + target.remove_item(); } } } - // If there are items left, we ran out of moves, so make a new activity with the remainder. - if( !indices.empty() ) { - g->u.assign_activity( activity_id( "ACT_WEAR" ) ); - g->u.activity.placement = source - g->u.pos(); - g->u.activity.values.push_back( from_inventory ); - g->u.activity.values.push_back( from_vehicle ); - while( !indices.empty() ) { - g->u.activity.values.push_back( indices.front() ); - indices.pop_front(); - g->u.activity.values.push_back( quantities.front() ); - quantities.pop_front(); - } + + // If there are no items left we are done + if( act.targets.empty() ) { + p.cancel_activity(); } } @@ -687,178 +653,108 @@ void activity_handlers::stash_do_turn( player_activity *act, player *p ) void activity_on_turn_pickup() { - // Pickup activity has source square, bool indicating source type, - // indices of items on map, and quantities of same. - bool from_vehicle = g->u.activity.values.front(); - tripoint pickup_target = g->u.activity.placement; - tripoint true_target = g->u.pos(); - true_target += pickup_target; - // Auto_resume implies autopickup. - bool autopickup = g->u.activity.auto_resume; - std::list indices; - std::list quantities; - auto map_stack = g->m.i_at( true_target ); + // ACT_PICKUP has item_locations of target items and quantities of the same. - if( !from_vehicle && map_stack.empty() ) { + // If we don't have target items bail out + if( g->u.activity.targets.empty() ) { g->u.cancel_activity(); return; } - // Note i = 1, skipping first element. - for( size_t i = 1; i < g->u.activity.values.size(); i += 2 ) { - indices.push_back( g->u.activity.values[i] ); - quantities.push_back( g->u.activity.values[ i + 1 ] ); - } - g->u.cancel_activity(); - - bool keep_going = Pickup::do_pickup( pickup_target, from_vehicle, indices, quantities, autopickup ); - - // If there are items left, we ran out of moves, so make a new activity with the remainder. - if( keep_going && !indices.empty() ) { - g->u.assign_activity( activity_id( "ACT_PICKUP" ) ); - g->u.activity.placement = pickup_target; - g->u.activity.auto_resume = autopickup; - g->u.activity.values.push_back( from_vehicle ); - while( !indices.empty() ) { - g->u.activity.values.push_back( indices.front() ); - indices.pop_front(); - g->u.activity.values.push_back( quantities.front() ); - quantities.pop_front(); - } - } - // TODO: Move this to advanced inventory instead of hacking it in here - if( !keep_going ) { + // Auto_resume implies autopickup. + const bool autopickup = g->u.activity.auto_resume; + + // False indicates that the player canceled pickup when met with some prompt + const bool keep_going = Pickup::do_pickup( g->u.activity.targets, g->u.activity.values, + autopickup ); + + // If there are items left we ran out of moves, so continue the activity + // Otherwise, we are done. + if( !keep_going || g->u.activity.targets.empty() ) { + g->u.cancel_activity(); + // TODO: Move this to advanced inventory instead of hacking it in here cancel_aim_processing(); } } // I'd love to have this not duplicate so much code from Pickup::pick_one_up(), // but I don't see a clean way to do that. -static void move_items( player &p, const tripoint &src, bool from_vehicle, - const tripoint &dest, bool to_vehicle, - std::list &indices, std::list &quantities ) +static void move_items( player &p, const tripoint &relative_dest, bool to_vehicle, + std::vector &targets, std::vector &quantities ) { - tripoint source = src + p.pos(); - tripoint destination = dest + p.pos(); - - int s_cargo = -1; - vehicle *s_veh = nullptr; - - // load vehicle information if requested - if( from_vehicle ) { - const cata::optional vp = g->m.veh_at( source ).part_with_feature( "CARGO", - false ); - assert( vp ); - s_veh = &vp->vehicle(); - s_cargo = vp->part_index(); - assert( s_cargo >= 0 ); - } + const tripoint dest = relative_dest + p.pos(); - while( p.moves > 0 && !indices.empty() ) { - int index = indices.back(); + while( p.moves > 0 && !targets.empty() ) { + item_location target = std::move( targets.back() ); int quantity = quantities.back(); - indices.pop_back(); + targets.pop_back(); quantities.pop_back(); - item *temp_item = from_vehicle ? g->m.item_from( s_veh, s_cargo, index ) : - g->m.item_from( source, index ); - - if( temp_item == nullptr ) { - continue; // No such item. + if( !target ) { + debugmsg( "Lost target item of ACT_MOVE_ITEMS" ); + continue; } - item leftovers = *temp_item; + // Don't need to make a copy here since movement can't be canceled + item &leftovers = *target; + // Make a copy to be put in the destination location + item newit = leftovers; - if( quantity != 0 && temp_item->count_by_charges() ) { - // Reinserting leftovers happens after item removal to avoid stacking issues. - leftovers.charges = temp_item->charges - quantity; - if( leftovers.charges > 0 ) { - temp_item->charges = quantity; - } + // Handle charges, quantity == 0 means move all + if( quantity != 0 && newit.count_by_charges() ) { + newit.charges = std::min( newit.charges, quantity ); + leftovers.charges -= quantity; } else { leftovers.charges = 0; } // Check that we can pick it up. - if( !temp_item->made_of_from_type( LIQUID ) ) { + if( !newit.made_of_from_type( LIQUID ) ) { // This is for hauling across zlevels, remove when going up and down stairs // is no longer teleportation + const tripoint src = target.position(); int distance = src.z == dest.z ? std::max( rl_dist( src, dest ), 1 ) : 1; - p.mod_moves( -Pickup::cost_to_move_item( p, *temp_item ) * distance ); + p.mod_moves( -Pickup::cost_to_move_item( p, newit ) * distance ); if( to_vehicle ) { - put_into_vehicle_or_drop( p, item_drop_reason::deliberate, { *temp_item }, - destination ); + put_into_vehicle_or_drop( p, item_drop_reason::deliberate, { newit }, dest ); } else { - drop_on_map( p, item_drop_reason::deliberate, { *temp_item }, destination ); + drop_on_map( p, item_drop_reason::deliberate, { newit }, dest ); } - // Remove from map or vehicle. - if( from_vehicle ) { - s_veh->remove_item( s_cargo, index ); - } else { - g->m.i_rem( source, index ); - } - } - - // If we didn't pick up a whole stack, put the remainder back where it came from. - if( leftovers.charges > 0 ) { - bool to_map = !from_vehicle; - if( !to_map ) { - to_map = !s_veh->add_item( s_cargo, leftovers ); - } - if( to_map ) { - g->m.add_item_or_charges( source, leftovers ); + // If we picked up a whole stack, remove the leftover item + if( leftovers.charges <= 0 ) { + target.remove_item(); } } } } /* values explanation - * 0: items from vehicle? - * 1: items to a vehicle? - * 2: index <-+ - * 3: amount | - * n: ^-------+ + * 0: items to a vehicle? + * 1: amount 0 <-+ + * 2: amount 1 | + * n: ^----------+ + * + * targets correspond to amounts */ -void activity_on_turn_move_items() +void activity_on_turn_move_items( player_activity &act, player &p ) { - // Drop activity if we don't know destination coordinates. - if( g->u.activity.coords.empty() ) { - g->u.activity = player_activity(); + // Drop activity if we don't know destination coordinates or have target items. + if( act.coords.empty() || act.targets.empty() ) { + act.set_to_null(); return; } // Move activity has source square, target square, - // indices of items on map, and quantities of same. - const tripoint destination = g->u.activity.coords[0]; - const tripoint source = g->u.activity.placement; - bool from_vehicle = g->u.activity.values[0]; - bool to_vehicle = g->u.activity.values[1]; - std::list indices; - std::list quantities; - - // Note i = 4, skipping first few elements. - for( size_t i = 2; i < g->u.activity.values.size(); i += 2 ) { - indices.push_back( g->u.activity.values[i] ); - quantities.push_back( g->u.activity.values[i + 1] ); - } - // Nuke the current activity, leaving the backlog alone. - g->u.activity = player_activity(); + // item_locations of targets, and quantities of same. + const tripoint relative_dest = act.coords.front(); + const bool to_vehicle = act.values.front(); // *puts on 3d glasses from 90s cereal box* - move_items( g->u, source, from_vehicle, destination, to_vehicle, indices, quantities ); - - if( !indices.empty() ) { - g->u.assign_activity( activity_id( "ACT_MOVE_ITEMS" ) ); - g->u.activity.placement = source; - g->u.activity.coords.push_back( destination ); - g->u.activity.values.push_back( from_vehicle ); - g->u.activity.values.push_back( to_vehicle ); - while( !indices.empty() ) { - g->u.activity.values.push_back( indices.front() ); - indices.pop_front(); - g->u.activity.values.push_back( quantities.front() ); - quantities.pop_front(); - } + move_items( p, relative_dest, to_vehicle, act.targets, act.values ); + + if( act.targets.empty() ) { + // Nuke the current activity, leaving the backlog alone. + act.set_to_null(); } } @@ -1017,6 +913,258 @@ std::vector route_adjacent( const player &p, const tripoint &dest ) return std::vector(); } +static construction check_build_pre( const construction &con ) +{ + const std::string pre_con_str = con.pre_terrain; + construction pre_con = con; + const std::vector &list_constructions = get_constructions(); + for( const construction elem : list_constructions ) { + if( !elem.post_terrain.empty() && elem.post_terrain == pre_con_str && + elem.category != string_id( "REPAIR" ) && + elem.category != string_id( "REINFORCE" ) ) { + //we found the construction that could build the required terrain + pre_con = elem; + break; + } + } + return pre_con; +} + +void activity_on_turn_blueprint_move( player_activity &, player &p ) +{ + zone_manager &mgr = zone_manager::get_manager(); + + const tripoint abspos = g->m.getabs( p.pos() ); + const std::unordered_set &src_set = mgr.get_near( + zone_type_id( "CONSTRUCTION_BLUEPRINT" ), abspos ); + + const std::vector &src_sorted = get_sorted_tiles_by_distance( abspos, src_set ); + const activity_id act_multiple_construction = activity_id( "ACT_BLUEPRINT_CONSTRUCTION" ); + + // Nuke the current activity, leaving the backlog alone + p.activity = player_activity(); + + // sort source tiles by distance + for( const tripoint &src : src_sorted ) { + const tripoint &src_loc = g->m.getlocal( src ); + // check if somebodies already started it + partial_con *nc = g->m.partial_con_at( src_loc ); + if( nc ) { + continue; + } + + if( !g->m.inbounds( src_loc ) ) { + if( !g->m.inbounds( p.pos() ) ) { + // p is implicitly an NPC that has been moved off the map, so reset the activity + // and unload them + p.assign_activity( act_multiple_construction ); + p.set_moves( 0 ); + g->reload_npcs(); + return; + } + const std::vector route = route_adjacent( p, src_loc ); + if( route.empty() ) { + // can't get there, can't do anything, skip it + continue; + } + p.set_destination( route, player_activity( act_multiple_construction ) ); + return; + } + // dont go there if it's dangerous. + bool dangerous_field = false; + for( const std::pair &e : g->m.field_at( src_loc ) ) { + if( p.is_dangerous_field( e.second ) ) { + dangerous_field = true; + break; + } + } + if( dangerous_field ) { + continue; + } + // work out if we can build it before we move there. + const std::vector &zones = mgr.get_zones( zone_type_id( "CONSTRUCTION_BLUEPRINT" ), + g->m.getabs( src_loc ) ); + construction built_chosen; + const inventory pre_inv = p.crafting_inventory( src_loc, PICKUP_RANGE - 1 ); + // PICKUP_RANGE -1 because we will be adjacent to the spot when arriving. + bool found_any_pre = false; + + for( const zone_data &zone : zones ) { + const blueprint_options options = dynamic_cast( zone.get_options() ); + const int index = options.get_index(); + const std::vector &list_constructions = get_constructions(); + const construction &built = list_constructions[index]; + // maybe it's already built? + if( !built.post_terrain.empty() ) { + if( built.post_is_furniture ) { + furn_id f = furn_id( built.post_terrain ); + if( g->m.furn( src_loc ) == f ) { + break; + } + } else { + ter_id t = ter_id( built.post_terrain ); + if( g->m.ter( src_loc ) == t ) { + break; + } + } + } + if( can_construct( built, src_loc ) && player_can_build( p, pre_inv, built ) ) { + found_any_pre = true; + built_chosen = list_constructions[index]; + break; + } else { + // cant build it + // maybe we can build the pre-requisite instead + // see if the reason is because of pre-terrain requirement + bool place_okay = true; + if( !built.pre_terrain.empty() ) { + if( built.pre_is_furniture ) { + furn_id f = furn_id( built.pre_terrain ); + place_okay &= g->m.furn( src_loc ) == f; + } else { + ter_id t = ter_id( built.pre_terrain ); + place_okay &= g->m.ter( src_loc ) == t; + } + } + if( !place_okay ) { + built_chosen = check_build_pre( built ); + // We only got here because the original choice cant be constructed + // Check again, if we still have the same construction, itll fail again. + if( can_construct( built_chosen, src_loc ) && player_can_build( p, pre_inv, built_chosen ) ) { + found_any_pre = true; + break; + } + } + continue; + } + } + if( !found_any_pre ) { + continue; + } + bool adjacent = false; + for( const tripoint &elem : g->m.points_in_radius( src_loc, 1 ) ) { + if( p.pos() == elem ) { + adjacent = true; + break; + } + } + if( !adjacent ) { + std::vector route = route_adjacent( p, src_loc ); + + // check if we found path to source / adjacent tile + if( route.empty() ) { + add_msg( m_info, _( "%s can't reach the source tile to construct." ), + p.disp_name() ); + return; + } + + // set the destination and restart activity after player arrives there + // we don't need to check for safe mode, + // activity will be restarted only if + // player arrives on destination tile + p.set_destination( route, player_activity( act_multiple_construction ) ); + return; + } + // if it's too dark to construct there + const bool enough_light = p.fine_detail_vision_mod() <= 4; + if( !enough_light ) { + continue; + } + // check if can do the construction now we are actually there + const std::vector &post_zones = mgr.get_zones( zone_type_id( "CONSTRUCTION_BLUEPRINT" ), + g->m.getabs( src_loc ) ); + construction post_built_chosen; + p.invalidate_crafting_inventory(); + const inventory &total_inv = p.crafting_inventory(); + bool found_any = false; + + for( const zone_data &zone : post_zones ) { + const blueprint_options options = dynamic_cast( zone.get_options() ); + const int index = options.get_index(); + const std::vector &list_constructions = get_constructions(); + const construction &built = list_constructions[index]; + // maybe it's already built? + if( !built.post_terrain.empty() ) { + if( built.post_is_furniture ) { + furn_id f = furn_id( built.post_terrain ); + if( g->m.furn( src_loc ) == f ) { + break; + } + } else { + ter_id t = ter_id( built.post_terrain ); + if( g->m.ter( src_loc ) == t ) { + break; + } + } + } + if( can_construct( built, src_loc ) && player_can_build( p, total_inv, built ) ) { + found_any = true; + post_built_chosen = list_constructions[index]; + break; + } else { + // cant build it + // maybe we can build the pre-requisite instead + // see if the reason is because of pre-terrain requirement + bool place_okay = true; + if( !built.pre_terrain.empty() ) { + if( built.pre_is_furniture ) { + furn_id f = furn_id( built.pre_terrain ); + place_okay &= g->m.furn( src_loc ) == f; + } else { + ter_id t = ter_id( built.pre_terrain ); + place_okay &= g->m.ter( src_loc ) == t; + } + } + if( !place_okay ) { + post_built_chosen = check_build_pre( built ); + if( can_construct( post_built_chosen, src_loc ) && + player_can_build( p, total_inv, post_built_chosen ) ) { + found_any = true; + break; + } + } + continue; + } + } + if( !found_any ) { + continue; + } + std::list used; + // create the partial construction struct + partial_con pc; + pc.id = built_chosen.id; + pc.counter = 0; + // Set the trap that has the examine function + g->m.trap_set( src_loc, tr_unfinished_construction ); + // Use up the components + for( const std::vector &it : built_chosen.requirements->get_components() ) { + std::list tmp = p.consume_items( it, 1, is_crafting_component ); + used.splice( used.end(), tmp ); + } + pc.components = used; + g->m.partial_con_set( src_loc, pc ); + for( const std::vector &it : built_chosen.requirements->get_tools() ) { + p.consume_tools( it ); + } + p.backlog.push_front( act_multiple_construction ); + p.assign_activity( activity_id( "ACT_BUILD" ) ); + p.activity.placement = g->m.getabs( src_loc ); + return; + } + if( p.moves <= 0 ) { + // Restart activity and break from cycle. + p.assign_activity( act_multiple_construction ); + return; + } + + // If we got here without restarting the activity, it means we're done. + if( p.is_npc() ) { + npc *guy = dynamic_cast( &p ); + guy->current_activity = ""; + guy->revert_after_activity(); + } +} + void activity_on_turn_move_loot( player_activity &, player &p ) { const activity_id act_move_loot = activity_id( "ACT_MOVE_LOOT" ); @@ -1265,20 +1413,22 @@ void try_fuel_fire( player_activity &act, player &p, const bool starting_fire ) fire_data fd( 1, contained ); time_duration fire_age = g->m.get_field_age( *best_fire, fd_fire ); - // Maybe TODO: - refuelling in the rain could use more fuel + // Maybe TODO: - refueling in the rain could use more fuel // First, simulate expected burn per turn, to see if we need more fuel - auto fuel_on_fire = g->m.i_at( *best_fire ); - for( size_t i = 0; i < fuel_on_fire.size(); i++ ) { - fuel_on_fire[i].simulate_burn( fd ); - // Uncontained fires grow below -50_minutes age - if( !contained && fire_age < -40_minutes && fd.fuel_produced > 1.0f && - !fuel_on_fire[i].made_of( LIQUID ) ) { + map_stack fuel_on_fire = g->m.i_at( *best_fire ); + for( item &it : fuel_on_fire ) { + it.simulate_burn( fd ); + // Unconstrained fires grow below -50_minutes age + if( !contained && fire_age < -40_minutes && fd.fuel_produced > 1.0f && !it.made_of( LIQUID ) ) { // Too much - we don't want a firestorm! - // Put first item back to refuelling pile - std::list indices_to_remove{ static_cast( i ) }; - std::list quantities_to_remove{ 0 }; - move_items( p, *best_fire - pos, false, *refuel_spot - pos, false, indices_to_remove, - quantities_to_remove ); + // Move item back to refueling pile + // Note: this handles messages (they're the generic "you drop x") + drop_on_map( p, item_drop_reason::deliberate, { it }, *refuel_spot ); + + const int distance = std::max( rl_dist( *best_fire, *refuel_spot ), 1 ); + p.mod_moves( -Pickup::cost_to_move_item( p, it ) * distance ); + + g->m.i_rem( *best_fire, &it ); return; } } @@ -1290,20 +1440,22 @@ void try_fuel_fire( player_activity &act, player &p, const bool starting_fire ) } // We need to move fuel from stash to fire - auto potential_fuel = g->m.i_at( *refuel_spot ); - for( size_t i = 0; i < potential_fuel.size(); i++ ) { - if( potential_fuel[i].made_of( LIQUID ) ) { + map_stack potential_fuel = g->m.i_at( *refuel_spot ); + for( item &it : potential_fuel ) { + if( it.made_of( LIQUID ) ) { continue; } float last_fuel = fd.fuel_produced; - potential_fuel[i].simulate_burn( fd ); + it.simulate_burn( fd ); if( fd.fuel_produced > last_fuel ) { - std::list indices{ static_cast( i ) }; - std::list quantities{ 0 }; - // Note: move_items handles messages (they're the generic "you drop x") - move_items( p, *refuel_spot - p.pos(), false, *best_fire - p.pos(), false, indices, - quantities ); + // Note: this handles messages (they're the generic "you drop x") + drop_on_map( p, item_drop_reason::deliberate, { it }, *best_fire ); + + const int distance = std::max( rl_dist( *refuel_spot, *best_fire ), 1 ); + p.mod_moves( -Pickup::cost_to_move_item( p, it ) * distance ); + + g->m.i_rem( *refuel_spot, &it ); return; } } diff --git a/src/advanced_inv.cpp b/src/advanced_inv.cpp index 92e0a4061fb27..101c148dd424a 100644 --- a/src/advanced_inv.cpp +++ b/src/advanced_inv.cpp @@ -10,6 +10,7 @@ #include "input.h" #include "item_category.h" #include "item_search.h" +#include "item_stack.h" #include "map.h" #include "mapdata.h" #include "messages.h" @@ -24,6 +25,7 @@ #include "ui.h" #include "uistate.h" #include "vehicle.h" +#include "vehicle_selector.h" #include "vpart_position.h" #include "vpart_reference.h" #include "calendar.h" @@ -351,7 +353,7 @@ void advanced_inventory::print_items( advanced_inventory_pane &pane, bool active stolen = true; } } - if( it.ammo_types().count( ammotype( "money" ) ) ) { + if( it.is_money() ) { //Count charges // TODO: transition to the item_location system used for the normal inventory unsigned int charges_total = 0; @@ -972,8 +974,11 @@ void advanced_inventory_pane::add_items_from_area( advanced_inv_area &square, if( square.id == AIM_INVENTORY ) { const invslice &stacks = u.inv.slice(); for( size_t x = 0; x < stacks.size(); ++x ) { - auto &an_item = stacks[x]->front(); - advanced_inv_listitem it( &an_item, x, stacks[x]->size(), square.id, false ); + std::list item_pointers; + for( item &i : *stacks[x] ) { + item_pointers.push_back( &i ); + } + advanced_inv_listitem it( item_pointers, x, square.id, false ); if( is_filtered( *it.items.front() ) ) { continue; } @@ -1373,10 +1378,6 @@ bool advanced_inventory::move_all_items( bool nested_call ) } else { if( dpane.get_area() == AIM_INVENTORY || dpane.get_area() == AIM_WORN ) { g->u.assign_activity( activity_id( "ACT_PICKUP" ) ); - g->u.activity.values.push_back( spane.in_vehicle() ); - if( dpane.get_area() == AIM_WORN ) { - g->u.activity.str_values.push_back( "equip" ); - } } else { // Vehicle and map destinations are handled the same. // Check first if the destination area still have enough room for moving all. @@ -1386,22 +1387,21 @@ bool advanced_inventory::move_all_items( bool nested_call ) } g->u.assign_activity( activity_id( "ACT_MOVE_ITEMS" ) ); - // store whether the source is from a vehicle (first entry) - g->u.activity.values.push_back( spane.in_vehicle() ); // store whether the destination is a vehicle g->u.activity.values.push_back( dpane.in_vehicle() ); // Stash the destination g->u.activity.coords.push_back( darea.off ); } - g->u.activity.placement = sarea.off; - std::list::iterator begin, end; + item_stack::iterator stack_begin, stack_end; if( panes[src].in_vehicle() ) { - begin = sarea.veh->get_items( sarea.vstor ).begin(); - end = sarea.veh->get_items( sarea.vstor ).end(); + vehicle_stack targets = sarea.veh->get_items( sarea.vstor ); + stack_begin = targets.begin(); + stack_end = targets.end(); } else { - begin = g->m.i_at( sarea.pos ).begin(); - end = g->m.i_at( sarea.pos ).end(); + map_stack targets = g->m.i_at( sarea.pos ); + stack_begin = targets.begin(); + stack_end = targets.end(); } // If moving to inventory, worn, or vehicle, silently filter buckets @@ -1410,19 +1410,22 @@ bool advanced_inventory::move_all_items( bool nested_call ) dpane.get_area() == AIM_WORN || dpane.in_vehicle(); bool filtered_any_bucket = false; - // push back indices and item count[s] for [begin => end) - int index = 0; - for( auto item_it = begin; item_it != end; ++item_it, ++index ) { - if( spane.is_filtered( *item_it ) ) { + // Push item_locations and item counts for all items at placement + for( item_stack::iterator it = stack_begin; it != stack_end; ++it ) { + if( spane.is_filtered( *it ) ) { continue; } - if( filter_buckets && item_it->is_bucket_nonempty() ) { + if( filter_buckets && it->is_bucket_nonempty() ) { filtered_any_bucket = true; continue; } - int amount = item_it->count(); - g->u.activity.values.push_back( index ); - g->u.activity.values.push_back( amount ); + if( spane.in_vehicle() ) { + g->u.activity.targets.emplace_back( vehicle_cursor( *sarea.veh, sarea.vstor ), &*it ); + } else { + g->u.activity.targets.emplace_back( map_cursor( sarea.pos ), &*it ); + } + // quantity of 0 means move all + g->u.activity.values.push_back( 0 ); } if( filtered_any_bucket ) { @@ -1705,13 +1708,8 @@ void advanced_inventory::display() do_return_entry(); g->u.assign_activity( activity_id( "ACT_WEAR" ) ); - g->u.activity.placement = tripoint_zero; - // Wearing from inventory - g->u.activity.values.push_back( true ); - // Not from vehicle - g->u.activity.values.push_back( false ); - g->u.activity.values.push_back( sitem->idx ); + g->u.activity.targets.emplace_back( g->u, sitem->items.front() ); g->u.activity.values.push_back( amount_to_move ); // exit so that the activity can be carried out @@ -1756,59 +1754,43 @@ void advanced_inventory::display() if( destarea == AIM_INVENTORY ) { g->u.assign_activity( activity_id( "ACT_PICKUP" ) ); - g->u.activity.values.push_back( from_vehicle ); } else if( destarea == AIM_WORN ) { g->u.assign_activity( activity_id( "ACT_WEAR" ) ); - // Wearing from map/vehicle not inventory - g->u.activity.values.push_back( false ); - g->u.activity.values.push_back( from_vehicle ); } else { // Vehicle and map destinations are handled similarly. g->u.assign_activity( activity_id( "ACT_MOVE_ITEMS" ) ); - // store whether the source is from a vehicle (first entry) - g->u.activity.values.push_back( from_vehicle ); // store whether the destination is a vehicle g->u.activity.values.push_back( to_vehicle ); // Stash the destination g->u.activity.coords.push_back( squares[destarea].off ); } - g->u.activity.placement = squares[srcarea].off; - - std::list::iterator begin, end; - if( from_vehicle ) { - begin = squares[srcarea].veh->get_items( squares[srcarea].vstor ).begin(); - end = squares[srcarea].veh->get_items( squares[srcarea].vstor ).end(); - } else { - begin = g->m.i_at( squares[srcarea].pos ).begin(); - end = g->m.i_at( squares[srcarea].pos ).end(); - } - int index = 0; if( by_charges ) { - for( auto item_it = begin; amount_to_move > 0 && item_it != end; ++item_it, ++index ) { - if( item_it->stacks_with( *sitem->items.front() ) ) { - g->u.activity.values.push_back( index ); - g->u.activity.values.push_back( amount_to_move ); - break; - } + if( from_vehicle ) { + g->u.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() ); } + g->u.activity.values.push_back( amount_to_move ); } else { - for( auto item_it = begin; amount_to_move > 0 && item_it != end; ++item_it, ++index ) { - - if( item_it->stacks_with( *sitem->items.front() ) ) { - g->u.activity.values.push_back( index ); - g->u.activity.values.push_back( 1 ); - - --amount_to_move; + for( std::list::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 ); + } else { + g->u.activity.targets.emplace_back( map_cursor( squares[srcarea].pos ), *it ); } + g->u.activity.values.push_back( 0 ); + --amount_to_move; } } // exit so that the activity can be carried out exit = true; } - // Just in case the items have moved from/to the inventory - g->u.inv.restack( g->u ); + // if dest was AIM_ALL then we used query_destination and should undo that if( restore_area ) { dpane.restore_area(); diff --git a/src/anatomy.cpp b/src/anatomy.cpp index 2ce045c175302..e54e66a755644 100644 --- a/src/anatomy.cpp +++ b/src/anatomy.cpp @@ -23,7 +23,7 @@ namespace generic_factory anatomy_factory( "anatomy" ); -} +} // namespace template<> bool anatomy_id::is_valid() const diff --git a/src/animation.cpp b/src/animation.cpp index 1c38aefd63c3c..e144fc43826d1 100644 --- a/src/animation.cpp +++ b/src/animation.cpp @@ -38,7 +38,7 @@ namespace class basic_animation { public: - basic_animation( const long scale ) : + basic_animation( const int scale ) : delay{ 0, get_option( "ANIMATION_DELAY" ) * scale * 1000000l } { } @@ -423,7 +423,7 @@ void draw_bullet_curses( map &m, const tripoint &t, const char bullet, const tri bullet_animation().progress(); } -} ///namespace +} // namespace #if defined(TILES) /* Bullet Animation -- Maybe change this to animate the ammo itself flying through the air?*/ diff --git a/src/artifact.cpp b/src/artifact.cpp index b7aca7f62e067..cb9b222541949 100644 --- a/src/artifact.cpp +++ b/src/artifact.cpp @@ -1160,15 +1160,22 @@ void it_artifact_tool::deserialize( JsonObject &jo ) m_to_hit = jo.get_int( "m_to_hit" ); item_tags = jo.get_tags( "item_flags" ); - tool->max_charges = jo.get_long( "max_charges" ); - tool->def_charges = jo.get_long( "def_charges" ); + tool->max_charges = jo.get_int( "max_charges" ); + tool->def_charges = jo.get_int( "def_charges" ); tool->charges_per_use = jo.get_int( "charges_per_use" ); tool->turns_per_charge = jo.get_int( "turns_per_charge" ); - JsonArray atypes = jo.get_array( "ammo" ); - for( size_t i = 0; i < atypes.size(); ++i ) { - tool->ammo_id.insert( ammotype( atypes.get_string( i ) ) ); + // Artifacts in older saves store ammo as string. + if( jo.has_array( "ammo" ) ) { + JsonArray atypes = jo.get_array( "ammo" ); + for( size_t i = 0; i < atypes.size(); ++i ) { + tool->ammo_id.insert( ammotype( atypes.get_string( i ) ) ); + } + } else if( jo.has_string( "ammo" ) ) { + tool->ammo_id.insert( ammotype( jo.get_string( "ammo" ) ) ); + } else { + jo.throw_error( "\"ammo\" node is neither array, not string" ); } tool->revert_to.emplace( jo.get_string( "revert_to", "null" ) ); diff --git a/src/avatar.cpp b/src/avatar.cpp index 86f339be19ac3..ad813dbf17d18 100644 --- a/src/avatar.cpp +++ b/src/avatar.cpp @@ -827,12 +827,12 @@ void avatar::do_read( item &book ) recipe_list.push_back( elem.name ); } if( !recipe_list.empty() ) { - std::string recipe_line = string_format( - ngettext( "This book contains %1$u crafting recipe: %2$s", - "This book contains %1$u crafting recipes: %2$s", - static_cast( recipe_list.size() ) ), - static_cast( recipe_list.size() ), - enumerate_as_string( recipe_list ) ); + std::string recipe_line = + string_format( ngettext( "This book contains %1$zu crafting recipe: %2$s", + "This book contains %1$zu crafting recipes: %2$s", + recipe_list.size() ), + recipe_list.size(), + enumerate_as_string( recipe_list ) ); add_msg( m_info, recipe_line ); } if( recipe_list.size() != reading->recipes.size() ) { diff --git a/src/avatar_action.cpp b/src/avatar_action.cpp index df718d400771d..2ae54f5e48696 100644 --- a/src/avatar_action.cpp +++ b/src/avatar_action.cpp @@ -103,18 +103,67 @@ bool avatar_action::move( avatar &you, map &m, int dx, int dy, int dz ) } // If the player is *attempting to* move on the X axis, update facing direction of their sprite to match. - const int new_dx = dest_loc.x - you.posx(); - if( new_dx > 0 ) { - you.facing = FD_RIGHT; - if( you.has_effect( effect_riding ) && you.mounted_creature ) { - auto mons = you.mounted_creature.get(); - mons->facing = FD_RIGHT; + int new_dx = dest_loc.x - you.posx(); + int new_dy = dest_loc.y - you.posy(); + + if( ! tile_iso ) { + if( new_dx > 0 ) { + you.facing = FD_RIGHT; + if( you.has_effect( effect_riding ) && you.mounted_creature ) { + auto mons = you.mounted_creature.get(); + mons->facing = FD_RIGHT; + } + } else if( new_dx < 0 ) { + you.facing = FD_LEFT; + if( you.has_effect( effect_riding ) && you.mounted_creature ) { + auto mons = you.mounted_creature.get(); + mons->facing = FD_LEFT; + } + } + } else { + // + // iso: + // + // right key => +x -y FD_RIGHT + // left key => -x +y FD_LEFT + // up key => +x +y ______ + // down key => -x -y ______ + // y: left-up key => __ +y FD_LEFT + // u: right-up key => +x __ FD_RIGHT + // b: left-down key => -x __ FD_LEFT + // n: right-down key => __ -y FD_RIGHT + // + // right key => +x -y FD_RIGHT + // u: right-up key => +x __ FD_RIGHT + // n: right-down key => __ -y FD_RIGHT + // up key => +x +y ______ + // down key => -x -y ______ + // left key => -x +y FD_LEFT + // y: left-up key => __ +y FD_LEFT + // b: left-down key => -x __ FD_LEFT + // + // right key => +x +y FD_RIGHT + // u: right-up key => +x __ FD_RIGHT + // n: right-down key => __ +y FD_RIGHT + // up key => +x -y ______ + // left key => -x -y FD_LEFT + // b: left-down key => -x __ FD_LEFT + // y: left-up key => __ -y FD_LEFT + // down key => -x +y ______ + // + if( new_dx >= 0 && new_dy >= 0 ) { + you.facing = FD_RIGHT; + if( you.has_effect( effect_riding ) && you.mounted_creature ) { + auto mons = you.mounted_creature.get(); + mons->facing = FD_RIGHT; + } } - } else if( new_dx < 0 ) { - you.facing = FD_LEFT; - if( you.has_effect( effect_riding ) && you.mounted_creature ) { - auto mons = you.mounted_creature.get(); - mons->facing = FD_LEFT; + if( new_dy <= 0 && new_dx <= 0 ) { + you.facing = FD_LEFT; + if( you.has_effect( effect_riding ) && you.mounted_creature ) { + auto mons = you.mounted_creature.get(); + mons->facing = FD_LEFT; + } } } @@ -638,9 +687,11 @@ bool avatar_action::fire( avatar &you, map &m ) // TODO: move handling "RELOAD_AND_SHOOT" flagged guns to a separate function. if( gun->has_flag( "RELOAD_AND_SHOOT" ) ) { if( !gun->ammo_remaining() ) { - item::reload_option opt = you.ammo_location && - gun->can_reload_with( you.ammo_location->typeId() ) ? item::reload_option( &you, args.relevant, - args.relevant, you.ammo_location.clone() ) : you.select_ammo( *gun ); + item::reload_option opt = + you.ammo_location && + gun->can_reload_with( you.ammo_location->typeId() ) ? + item::reload_option( &you, args.relevant, args.relevant, you.ammo_location ) : + you.select_ammo( *gun ); if( !opt ) { // Menu canceled return false; @@ -713,8 +764,7 @@ bool avatar_action::fire( avatar &you, map &m, item &weapon, int bp_cost ) if( !gun ) { add_msg( m_info, _( "The %s can't be fired in its current state." ), weapon.tname() ); return false; - } else if( !weapon.has_flag( "RELOAD_AND_SHOOT" ) && - !weapon.ammo_types().count( weapon.ammo_data()->ammo->type ) ) { + } else if( weapon.ammo_data() && !weapon.ammo_types().count( weapon.ammo_data()->ammo->type ) ) { add_msg( m_info, _( "The %s can't be fired while loaded with incompatible ammunition %s" ), weapon.tname(), weapon.ammo_current() ); return false; @@ -773,7 +823,14 @@ void avatar_action::plthrow( avatar &you, int pos, return; } } - + // if you're wearing the item you need to be able to take it off + if( pos < -1 ) { + auto ret = you.can_takeoff( you.i_at( pos ) ); + if( !ret.success() ) { + add_msg( m_info, "%s", ret.c_str() ); + return; + } + } // you must wield the item to throw it if( pos != -1 ) { you.i_rem( pos ); diff --git a/src/avatar_action.h b/src/avatar_action.h index 2daebbb475d26..e290bc9e5aab9 100644 --- a/src/avatar_action.h +++ b/src/avatar_action.h @@ -58,6 +58,6 @@ bool fire( avatar &you, map &m, item &weapon, int bp_cost = 0 ); // Throw an item 't' void plthrow( avatar &you, int pos = INT_MIN, const cata::optional &blind_throw_from_pos = cata::nullopt ); -} +} // namespace avatar_action #endif // !AVATAR_MOVE_H diff --git a/src/basecamp.cpp b/src/basecamp.cpp index e166a02f4c19d..276ef1f066dda 100644 --- a/src/basecamp.cpp +++ b/src/basecamp.cpp @@ -163,7 +163,8 @@ void basecamp::define_camp( npc &p, const std::string &camp_type ) e.pos = omt_pos; expansions[ base_camps::base_dir ] = e; omt_ref = oter_id( "faction_base_camp_0" ); - update_provides( e.type, expansions[ base_camps::base_dir ] ); + update_provides( base_camps::faction_encode_abs( e, 0 ), + expansions[ base_camps::base_dir ] ); } else { expansions[ base_camps::base_dir ] = parse_expansion( om_cur, omt_pos ); } diff --git a/src/basecamp.h b/src/basecamp.h index d9827f763c623..ddc532bd76541 100644 --- a/src/basecamp.h +++ b/src/basecamp.h @@ -43,7 +43,7 @@ using itype_id = std::string; namespace catacurses { class window; -} +} // namespace catacurses namespace base_camps { @@ -56,7 +56,7 @@ const std::string faction_encode_abs( const expansion_data &e, int number ); const std::string faction_decode( const std::string &full_type ); const time_duration to_workdays( const time_duration &work_time ); int max_upgrade_by_type( const std::string &type ); -} +} // namespace base_camps // camp resource structures struct basecamp_resource { diff --git a/src/behavior.cpp b/src/behavior.cpp index 057817b9130e7..fc81dc58936f3 100644 --- a/src/behavior.cpp +++ b/src/behavior.cpp @@ -75,7 +75,7 @@ namespace { generic_factory behavior_factory( "behavior" ); std::list temp_node_data; -} +} // namespace template<> const node_t &string_id::obj() const diff --git a/src/behavior.h b/src/behavior.h index 5888047fb9c61..9696d44d2066a 100644 --- a/src/behavior.h +++ b/src/behavior.h @@ -87,6 +87,6 @@ void finalize(); void check_consistency(); -} +} // namespace behavior #endif diff --git a/src/behavior_oracle.cpp b/src/behavior_oracle.cpp index 5b8df105a7fab..2706701eea6d7 100644 --- a/src/behavior_oracle.cpp +++ b/src/behavior_oracle.cpp @@ -135,4 +135,4 @@ std::unordered_map> pre { "npc_has_food", make_function( &character_oracle_t::has_food ) } } }; -} +} // namespace behavior diff --git a/src/behavior_oracle.h b/src/behavior_oracle.h index f743a4b65592a..c36d81b1c9a37 100644 --- a/src/behavior_oracle.h +++ b/src/behavior_oracle.h @@ -48,5 +48,5 @@ class character_oracle_t : public oracle_t extern std::unordered_map> predicate_map; -} +} // namespace behavior #endif diff --git a/src/behavior_strategy.cpp b/src/behavior_strategy.cpp index e9bce79526669..3ee7e7990d78c 100644 --- a/src/behavior_strategy.cpp +++ b/src/behavior_strategy.cpp @@ -16,7 +16,7 @@ std::unordered_map strategy_map = {{ { "sequential_until_done", &default_until_done } } }; -} +} // namespace behavior using namespace behavior; diff --git a/src/behavior_strategy.h b/src/behavior_strategy.h index 51e4b9d00c438..72889bfd175d1 100644 --- a/src/behavior_strategy.h +++ b/src/behavior_strategy.h @@ -40,6 +40,6 @@ class sequential_until_done_t : public strategy_t extern std::unordered_map strategy_map; -} +} // namespace behavior #endif diff --git a/src/bionics.cpp b/src/bionics.cpp index 834bde906e0da..7f36c0707c9ae 100644 --- a/src/bionics.cpp +++ b/src/bionics.cpp @@ -103,6 +103,7 @@ static const trait_id trait_PROF_AUTODOC( "PROF_AUTODOC" ); static const trait_id trait_THRESH_MEDICAL( "THRESH_MEDICAL" ); static const trait_id trait_MASOCHIST( "MASOCHIST" ); static const trait_id trait_MASOCHIST_MED( "MASOCHIST_MED" ); +static const trait_id trait_NOPAIN( "NOPAIN" ); static const trait_id trait_CENOBITE( "CENOBITE" ); static const bionic_id bionic_TOOLS_EXTEND( "bio_tools_extend" ); @@ -1074,6 +1075,41 @@ void player::bionics_uninstall_failure( monster &installer, player &patient, int } +bool player::has_enough_anesth( const itype *cbm ) +{ + if( !cbm->bionic ) { + debugmsg( "has_enough_anesth( const itype *cbm ): cbm is not a bionic" ); + return false; + } + + if( has_bionic( bionic_id( "bio_painkiller" ) ) || has_trait( trait_NOPAIN ) || + has_trait( trait_id( "DEBUG_BIONICS" ) ) ) { + return true; + } + + const int difficulty = cbm->bionic->difficulty; + int amount = difficulty * 40; + + int anesth_count = 0; + std::vector a_filter = crafting_inventory().items_with( []( const item & it ) { + return it.has_quality( quality_id( "ANESTHESIA" ) ); + } ); + std::vector b_filter = crafting_inventory().items_with( []( const item & it ) { + return it.has_flag( "ANESTHESIA" ); // legacy + } ); + for( const item *anesthesia_item : a_filter ) { + if( anesthesia_item->ammo_remaining() >= 1 ) { + anesth_count += anesthesia_item->ammo_remaining(); + } + } + + if( amount <= anesth_count || b_filter.size() > 0 ) { + return true; + } + + return false; +} + // bionic manipulation adjusted skill float player::bionics_adjusted_skill( const skill_id &most_important_skill, const skill_id &important_skill, @@ -1134,10 +1170,10 @@ int bionic_manip_cos( float adjusted_skill, bool autodoc, int bionic_difficulty return chance_of_success; } -bool player::uninstall_bionic( const bionic_id &b_id, player &installer, bool autodoc, - int skill_level ) +bool player::can_uninstall_bionic( const bionic_id &b_id, player &installer, bool autodoc, + int skill_level ) { - // malfunctioning bionics don't have associated items and get a difficulty of 12 + // if malfunctioning bionics doesn't have associated item it gets a difficulty of 12 int difficulty = 12; if( item::type_is_defined( b_id.c_str() ) ) { auto type = item::find_type( b_id.c_str() ); @@ -1181,10 +1217,18 @@ bool player::uninstall_bionic( const bionic_id &b_id, player &installer, bool au int assist_bonus = installer.get_effect_int( effect_assisted ); // removal of bionics adds +2 difficulty over installation - float adjusted_skill = installer.bionics_adjusted_skill( skilll_firstaid, - skilll_computer, - skilll_electronics, - skill_level ); + float adjusted_skill; + if( autodoc ) { + adjusted_skill = installer.bionics_adjusted_skill( skilll_firstaid, + skilll_computer, + skilll_electronics, + skill_level ); + } else { + adjusted_skill = installer.bionics_adjusted_skill( skilll_electronics, + skilll_firstaid, + skilll_mechanics, + skill_level ); + } int chance_of_success = bionic_manip_cos( adjusted_skill + assist_bonus, autodoc, difficulty + 2 ); if( chance_of_success >= 100 ) { @@ -1200,6 +1244,40 @@ bool player::uninstall_bionic( const bionic_id &b_id, player &installer, bool au return false; } } + + return true; +} + +bool player::uninstall_bionic( const bionic_id &b_id, player &installer, bool autodoc, + int skill_level ) +{ + // if malfunctioning bionics doesn't have associated item it gets a difficulty of 12 + int difficulty = 12; + if( item::type_is_defined( b_id.c_str() ) ) { + auto type = item::find_type( b_id.c_str() ); + if( type->bionic ) { + difficulty = type->bionic->difficulty; + } + } + + int assist_bonus = installer.get_effect_int( effect_assisted ); + + // removal of bionics adds +2 difficulty over installation + float adjusted_skill; + if( autodoc ) { + adjusted_skill = installer.bionics_adjusted_skill( skilll_firstaid, + skilll_computer, + skilll_electronics, + skill_level ); + } else { + adjusted_skill = installer.bionics_adjusted_skill( skilll_electronics, + skilll_firstaid, + skilll_mechanics, + skill_level ); + } + + int chance_of_success = bionic_manip_cos( adjusted_skill + assist_bonus, autodoc, difficulty + 2 ); + // Surgery is imminent, retract claws or blade if active for( size_t i = 0; i < installer.my_bionics->size(); i++ ) { const auto &bio = ( *installer.my_bionics )[ i ]; @@ -1312,18 +1390,19 @@ bool player::uninstall_bionic( const bionic &target_cbm, monster &installer, pla return false; } -bool player::install_bionics( const itype &type, player &installer, bool autodoc, int skill_level ) +bool player::can_install_bionics( const itype &type, player &installer, bool autodoc, + int skill_level ) { if( !type.bionic ) { debugmsg( "Tried to install NULL bionic" ); return false; } - int assist_bonus = installer.get_effect_int( effect_assisted ); const bionic_id &bioid = type.bionic->id; const int difficult = type.bionic->difficulty; float adjusted_skill; + if( autodoc ) { adjusted_skill = installer.bionics_adjusted_skill( skilll_firstaid, skilll_computer, @@ -1365,6 +1444,35 @@ bool player::install_bionics( const itype &type, player &installer, bool autodoc } } + return true; +} + +bool player::install_bionics( const itype &type, player &installer, bool autodoc, int skill_level ) +{ + if( !type.bionic ) { + debugmsg( "Tried to install NULL bionic" ); + return false; + } + + int assist_bonus = installer.get_effect_int( effect_assisted ); + + const bionic_id &bioid = type.bionic->id; + const int difficult = type.bionic->difficulty; + float adjusted_skill; + + if( autodoc ) { + adjusted_skill = installer.bionics_adjusted_skill( skilll_firstaid, + skilll_computer, + skilll_electronics, + skill_level ); + } else { + adjusted_skill = installer.bionics_adjusted_skill( skilll_electronics, + skilll_firstaid, + skilll_mechanics, + skill_level ); + } + int chance_of_success = bionic_manip_cos( adjusted_skill + assist_bonus, autodoc, difficult ); + // Practice skills only if conducting manual installation if( !autodoc ) { installer.practice( skilll_electronics, static_cast( ( 100 - chance_of_success ) * 1.5 ) ); @@ -1774,6 +1882,7 @@ void load_bionic( JsonObject &jsobj ) jsobj.read( "canceled_mutations", new_bionic.canceled_mutations ); jsobj.read( "included_bionics", new_bionic.included_bionics ); + jsobj.read( "included", new_bionic.included ); jsobj.read( "upgraded_bionic", new_bionic.upgraded_bionic ); JsonArray jsarr = jsobj.get_array( "occupied_bodyparts" ); @@ -1830,6 +1939,9 @@ void check_bionics() bio.first.c_str(), bio.second.upgraded_bionic.c_str() ); } } + if( !item::type_is_defined( bio.first.c_str() ) && !bio.second.included ) { + debugmsg( "Bionic %s has no defined item version", bio.first.c_str() ); + } } } @@ -1889,7 +2001,7 @@ void player::introduce_into_anesthesia( const time_duration &duration, player &i bool anesthetic ) //used by the Autodoc { installer.add_msg_player_or_npc( m_info, - _( "You set up the operation step-by-step, configuring the Autodoc to manipulate a CBM" ), + _( "You set up the operation step-by-step, configuring the Autodoc to manipulate a CBM." ), _( " sets up the operation, configuring the Autodoc to manipulate a CBM." ) ); add_msg_player_or_npc( m_info, diff --git a/src/bionics.h b/src/bionics.h index f48e031e75ffe..2cb0019f213de 100644 --- a/src/bionics.h +++ b/src/bionics.h @@ -70,6 +70,10 @@ struct bionic_data { * If true, this bionic can't be incapacitated by electrical attacks. */ bool shockproof = false; + /** + * If true, this bionic is included with another. + */ + bool included = false; /** * Body part slots used to install this bionic, mapped to the amount of space required. */ diff --git a/src/bodypart.cpp b/src/bodypart.cpp index 35736f16d92f2..5613e10e03ace 100644 --- a/src/bodypart.cpp +++ b/src/bodypart.cpp @@ -42,7 +42,7 @@ side string_to_enum( const std::string &data ) return string_to_enum_look_up( side_map, data ); } -} +} // namespace io namespace { diff --git a/src/calendar.cpp b/src/calendar.cpp index b8f2cb13c00d6..d94b9e551645a 100644 --- a/src/calendar.cpp +++ b/src/calendar.cpp @@ -236,6 +236,22 @@ bool calendar::is_night() const return now > sunset + twilight_duration || now < sunrise; } +bool calendar::is_sunset_now() const +{ + const time_duration now = time_past_midnight( *this ); + const time_duration sunset = time_past_midnight( this->sunset() ); + + return now > sunset && now < sunset + twilight_duration; +} + +bool calendar::is_sunrise_now() const +{ + const time_duration now = time_past_midnight( *this ); + const time_duration sunrise = time_past_midnight( this->sunrise() ); + + return now > sunrise && now < sunrise + twilight_duration; +} + double calendar::current_daylight_level() const { const double percent = static_cast( static_cast( day ) / to_days diff --git a/src/calendar.h b/src/calendar.h index ca09438446224..784a7a04dc6e9 100644 --- a/src/calendar.h +++ b/src/calendar.h @@ -180,6 +180,10 @@ class calendar calendar sunset() const; /** Returns true if it's currently after sunset + TWILIGHT_SECONDS or before sunrise - TWILIGHT_SECONDS. */ bool is_night() const; + /** Returns true if it's currently after sunset and before sunset + TWILIGHT_SECONDS. */ + bool is_sunset_now() const; + /** Returns true if it's currently after sunrise and before sunrise + TWILIGHT_SECONDS. */ + bool is_sunrise_now() const; /** Returns the current seasonally-adjusted maximum daylight level */ double current_daylight_level() const; /** Returns the current sunlight or moonlight level through the preceding functions. */ diff --git a/src/cata_algo.h b/src/cata_algo.h index 6888d4aa580f6..7337246f30217 100644 --- a/src/cata_algo.h +++ b/src/cata_algo.h @@ -41,6 +41,6 @@ void sort_by_rating( Iterator begin, Iterator end, RatingFunction rating_func ) } ); } -} +} // namespace algo #endif // CATA_ALGO_H diff --git a/src/cata_tiles.cpp b/src/cata_tiles.cpp index f984d9be7ef5d..368350618adbb 100644 --- a/src/cata_tiles.cpp +++ b/src/cata_tiles.cpp @@ -246,7 +246,7 @@ void cata_tiles::load_tileset( const std::string &tileset_id, const bool prechec // Load the tileset into a separate instance and only set this->tileset_ptr // when the loading has succeeded. - std::unique_ptr new_tileset_ptr( new tileset() ); + std::unique_ptr new_tileset_ptr = std::make_unique(); tileset_loader loader( *new_tileset_ptr, renderer ); loader.load( tileset_id, precheck ); tileset_ptr = std::move( new_tileset_ptr ); @@ -1095,20 +1095,20 @@ void cata_tiles::draw( int destx, int desty, const tripoint ¢er, int width, if( g->displaying_temperature ) { int temp_value = g->weather.get_temperature( {x, y, center.z} ); int ctemp = temp_to_celsius( temp_value ); - short col; + short color; const short bold = 8; if( ctemp > 40 ) { - col = catacurses::red; + color = catacurses::red; } else if( ctemp > 25 ) { - col = catacurses::yellow + bold; + color = catacurses::yellow + bold; } else if( ctemp > 10 ) { - col = catacurses::green + bold; + color = catacurses::green + bold; } else if( ctemp > 0 ) { - col = catacurses::white + bold; + color = catacurses::white + bold; } else if( ctemp > -10 ) { - col = catacurses::cyan + bold; + color = catacurses::cyan + bold; } else { - col = catacurses::blue + bold; + color = catacurses::blue + bold; } if( get_option( "USE_CELSIUS" ) == "celsius" ) { temp_value = temp_to_celsius( temp_value ); @@ -1117,7 +1117,7 @@ void cata_tiles::draw( int destx, int desty, const tripoint ¢er, int width, } overlay_strings.emplace( player_to_screen( x, y ) + point( tile_width / 2, 0 ), - formatted_text( std::to_string( temp_value ), col, + formatted_text( std::to_string( temp_value ), color, NORTH ) ); } @@ -1176,24 +1176,24 @@ void cata_tiles::draw( int destx, int desty, const tripoint ¢er, int width, } //Memorize everything the character just saw even if it wasn't displayed. - for( int y = 0; y < MAPSIZE_Y; y++ ) { - for( int x = 0; x < MAPSIZE_X; x++ ) { + for( int mem_y = 0; mem_y < MAPSIZE_Y; mem_y++ ) { + for( int mem_x = 0; mem_x < MAPSIZE_X; mem_x++ ) { //just finished o_x,o_y through sx+o_x,sy+o_y so skip them - if( x >= o_x && x < sx + o_x && - y >= o_y && y < sy + o_y ) { + if( mem_x >= o_x && mem_x < sx + o_x && + mem_y >= o_y && mem_y < sy + o_y ) { continue; } - tripoint p( x, y, center.z ); + tripoint p( mem_x, mem_y, center.z ); int height_3d = 0; if( iso_mode ) { //Iso_mode skips in a checkerboard - if( ( y ) % 2 != ( x ) % 2 ) { + if( ( mem_y ) % 2 != ( mem_x ) % 2 ) { continue; } //iso_mode does weird things to x and y... replicate that //The MAPSIZE_X/2 offset is to keep the rectangle in the upper right quadrant. - p.x = ( x - y - MAPSIZE_X / 2 + MAPSIZE_Y / 2 ) / 2 + MAPSIZE_X / 2; - p.y = ( y + x - MAPSIZE_Y / 2 - MAPSIZE_X / 2 ) / 2 + MAPSIZE_Y / 2; + p.x = ( mem_x - mem_y - MAPSIZE_X / 2 + MAPSIZE_Y / 2 ) / 2 + MAPSIZE_X / 2; + p.y = ( mem_y + mem_x - MAPSIZE_Y / 2 - MAPSIZE_X / 2 ) / 2 + MAPSIZE_Y / 2; //Check if we're in previously done iso_mode space if( p.x >= ( 0 - sy - sx / 2 + sy / 2 ) / 2 + o_x && p.x < ( sx - 0 - sx / 2 + sy / 2 ) / 2 + o_x && p.y >= ( 0 + 0 - sy / 2 - sx / 2 ) / 2 + o_y && p.y < ( sy + sx - sy / 2 - sx / 2 ) / 2 + o_y ) { @@ -1497,7 +1497,7 @@ bool cata_tiles::draw_from_id_string( std::string id, TILE_CATEGORY category, } else if( category == C_FIELD ) { const field_id fid = field_from_ident( id ); sym = all_field_types_enum_list[fid].sym; - // TODO: field density? + // TODO: field intensity? col = all_field_types_enum_list[fid].color[0]; } else if( category == C_TRAP ) { const trap_str_id tmp( id ); @@ -1750,7 +1750,7 @@ bool cata_tiles::draw_sprite_at( const tile_type &tile, sprite_num = 0; } else if( spritelist.size() == 1 ) { // just one tile, apply SDL sprite rotation if not in isometric mode - rotate_sprite = !tile_iso; + rotate_sprite = true; sprite_num = 0; } else { // multiple rotated tiles defined, don't apply sprite rotation after picking one @@ -1805,19 +1805,31 @@ bool cata_tiles::draw_sprite_at( const tile_type &tile, #if defined(_WIN32) destination.y -= 1; #endif - ret = sprite_tex->render_copy_ex( renderer, &destination, -90, NULL, SDL_FLIP_NONE ); + if( ! tile_iso ) { // never rotate isometric tiles + ret = sprite_tex->render_copy_ex( renderer, &destination, -90, NULL, SDL_FLIP_NONE ); + } else { + ret = sprite_tex->render_copy_ex( renderer, &destination, 0, NULL, SDL_FLIP_NONE ); + } break; case 2: // 180 degrees, implemented with flips instead of rotation - ret = sprite_tex->render_copy_ex( renderer, &destination, 0, NULL, - static_cast( SDL_FLIP_HORIZONTAL | SDL_FLIP_VERTICAL ) ); + if( ! tile_iso ) { // never flip isometric tiles vertically + ret = sprite_tex->render_copy_ex( renderer, &destination, 0, NULL, + static_cast( SDL_FLIP_HORIZONTAL | SDL_FLIP_VERTICAL ) ); + } else { + ret = sprite_tex->render_copy_ex( renderer, &destination, 0, NULL, SDL_FLIP_NONE ); + } break; case 3: // 270 degrees #if defined(_WIN32) destination.x -= 1; #endif - ret = sprite_tex->render_copy_ex( renderer, &destination, 90, NULL, SDL_FLIP_NONE ); + if( ! tile_iso ) { // never rotate isometric tiles + ret = sprite_tex->render_copy_ex( renderer, &destination, 90, NULL, SDL_FLIP_NONE ); + } else { + ret = sprite_tex->render_copy_ex( renderer, &destination, 0, NULL, SDL_FLIP_NONE ); + } break; - case 4: // flip horizontaly + case 4: // flip horizontally ret = sprite_tex->render_copy_ex( renderer, &destination, 0, NULL, static_cast( SDL_FLIP_HORIZONTAL ) ); } @@ -1837,8 +1849,9 @@ bool cata_tiles::draw_tile_at( const tile_type &tile, int x, int y, unsigned int int rota, lit_level ll, bool apply_night_vision_goggles, int &height_3d ) { - draw_sprite_at( tile, tile.bg, x, y, loc_rand, false, rota, ll, apply_night_vision_goggles ); - draw_sprite_at( tile, tile.fg, x, y, loc_rand, true, rota, ll, apply_night_vision_goggles, + draw_sprite_at( tile, tile.bg, x, y, loc_rand, /*fg:*/ false, rota, ll, + apply_night_vision_goggles ); + draw_sprite_at( tile, tile.fg, x, y, loc_rand, /*fg:*/ true, rota, ll, apply_night_vision_goggles, height_3d ); return true; } @@ -2314,10 +2327,10 @@ bool cata_tiles::draw_entity( const Creature &critter, const tripoint &p, lit_le const int subtile = corner; // depending on the toggle flip sprite left or right int rot_facing = -1; - if( m->facing == FD_LEFT ) { - rot_facing = 4; - } else if( m->facing == FD_RIGHT ) { + if( m->facing == FD_RIGHT ) { rot_facing = 0; + } else if( m->facing == FD_LEFT ) { + rot_facing = 4; } if( rot_facing >= 0 ) { const auto ent_name = m->type->id; @@ -2372,10 +2385,10 @@ void cata_tiles::draw_entity_with_overlays( const player &pl, const tripoint &p, int prev_height_3d = height_3d; // depending on the toggle flip sprite left or right - if( pl.facing == FD_LEFT ) { - draw_from_id_string( ent_name, C_NONE, "", p, corner, 4, ll, false, height_3d ); - } else if( pl.facing == FD_RIGHT ) { + if( pl.facing == FD_RIGHT ) { draw_from_id_string( ent_name, C_NONE, "", p, corner, 0, ll, false, height_3d ); + } else if( pl.facing == FD_LEFT ) { + draw_from_id_string( ent_name, C_NONE, "", p, corner, 4, ll, false, height_3d ); } // next up, draw all the overlays @@ -2384,10 +2397,10 @@ void cata_tiles::draw_entity_with_overlays( const player &pl, const tripoint &p, std::string draw_id = overlay; if( find_overlay_looks_like( pl.male, overlay, draw_id ) ) { int overlay_height_3d = prev_height_3d; - if( pl.facing == FD_LEFT ) { - draw_from_id_string( draw_id, C_NONE, "", p, corner, 4, ll, false, overlay_height_3d ); - } else if( pl.facing == FD_RIGHT ) { - draw_from_id_string( draw_id, C_NONE, "", p, corner, 0, ll, false, overlay_height_3d ); + if( pl.facing == FD_RIGHT ) { + draw_from_id_string( draw_id, C_NONE, "", p, corner, /*rota:*/ 0, ll, false, overlay_height_3d ); + } else if( pl.facing == FD_LEFT ) { + draw_from_id_string( draw_id, C_NONE, "", p, corner, /*rota:*/ 4, ll, false, overlay_height_3d ); } // the tallest height-having overlay is the one that counts height_3d = std::max( height_3d, overlay_height_3d ); diff --git a/src/cata_utility.h b/src/cata_utility.h index 6cd7a67fb9577..6ceca5584e21d 100644 --- a/src/cata_utility.h +++ b/src/cata_utility.h @@ -36,20 +36,6 @@ struct null_deleter { void operator()( T * ) const {} }; -namespace cata -{ - -/** - * Until we can use std::make_unique, have our own - */ -template -std::unique_ptr make_unique( Args &&... args ) -{ - return std::unique_ptr( new T( std::forward( args )... ) ); -} - -} - /** * Type of object that a measurement is taken on. Used, for example, to display wind speed in m/s * while displaying vehicle speed in km/h. diff --git a/src/cellular_automata.h b/src/cellular_automata.h index 4f11bd409078b..da8f0bab14ce4 100644 --- a/src/cellular_automata.h +++ b/src/cellular_automata.h @@ -105,6 +105,6 @@ inline std::vector> generate_cellular_automaton( const int widt return current; } -} +} // namespace CellularAutomata #endif diff --git a/src/char_validity_check.cpp b/src/char_validity_check.cpp index 16267b2d7054e..bd0e019e3edfd 100644 --- a/src/char_validity_check.cpp +++ b/src/char_validity_check.cpp @@ -10,7 +10,7 @@ * @param ch The char to check. * @return true if the char is allowed in a name, false if not. */ -bool is_char_allowed( long ch ) +bool is_char_allowed( int ch ) { if( !std::isprint( ch ) && ch <= 127 ) { // above 127 are non-ASCII, therefore Unicode, therefore OK diff --git a/src/char_validity_check.h b/src/char_validity_check.h index f5ade8a6ffaf5..b2b4bf652a76d 100644 --- a/src/char_validity_check.h +++ b/src/char_validity_check.h @@ -2,6 +2,6 @@ #ifndef CHAR_VALIDITY_CHECK_H #define CHAR_VALIDITY_CHECK_H -bool is_char_allowed( long ch ); +bool is_char_allowed( int ch ); #endif diff --git a/src/character.cpp b/src/character.cpp index 798c1dd1f33cc..3a1d8d440ae30 100644 --- a/src/character.cpp +++ b/src/character.cpp @@ -90,6 +90,7 @@ static const trait_id trait_DISORGANIZED( "DISORGANIZED" ); static const trait_id trait_ELFA_FNV( "ELFA_FNV" ); static const trait_id trait_ELFA_NV( "ELFA_NV" ); static const trait_id trait_FEL_NV( "FEL_NV" ); +static const trait_id trait_PROF_FOODP( "PROF_FOODP" ); static const trait_id trait_GILLS( "GILLS" ); static const trait_id trait_GILLS_CEPH( "GILLS_CEPH" ); static const trait_id trait_GLASSJAW( "GLASSJAW" ); @@ -3118,6 +3119,7 @@ mutation_value_map = { { "hp_modifier", calc_mutation_value<&mutation_branch::hp_modifier> }, { "hp_modifier_secondary", calc_mutation_value<&mutation_branch::hp_modifier_secondary> }, { "hp_adjustment", calc_mutation_value<&mutation_branch::hp_adjustment> }, + { "temperature_speed_modifier", calc_mutation_value<&mutation_branch::temperature_speed_modifier> }, { "metabolism_modifier", calc_mutation_value<&mutation_branch::metabolism_modifier> }, { "thirst_modifier", calc_mutation_value<&mutation_branch::thirst_modifier> }, { "fatigue_regen_modifier", calc_mutation_value<&mutation_branch::fatigue_regen_modifier> }, @@ -3463,6 +3465,13 @@ int Character::get_shout_volume() const shout_multiplier = 3; } + // You can't shout without your face + if( has_trait( trait_PROF_FOODP ) && !( is_wearing( itype_id( "foodperson_mask" ) ) || + is_wearing( itype_id( "foodperson_mask_on" ) ) ) ) { + base = 0; + shout_multiplier = 0; + } + // Masks and such dampen the sound // Balanced around whisper for wearing bondage mask // and noise ~= 10 (door smashing) for wearing dust mask for character with strength = 8 @@ -3490,6 +3499,13 @@ void Character::shout( std::string msg, bool order ) int base = 10; std::string shout = ""; + // You can't shout without your face + if( has_trait( trait_PROF_FOODP ) && !( is_wearing( itype_id( "foodperson_mask" ) ) || + is_wearing( itype_id( "foodperson_mask_on" ) ) ) ) { + add_msg_if_player( m_warning, _( "You try to shout but you have no face!" ) ); + return; + } + // Mutations make shouting louder, they also define the default message if( has_trait( trait_SHOUT3 ) ) { base = 20; diff --git a/src/character.h b/src/character.h index 6a8872d06a63e..51626e42b29b2 100644 --- a/src/character.h +++ b/src/character.h @@ -798,6 +798,12 @@ class Character : public Creature, public visitable stomach_contents stomach; stomach_contents guts; + int power_level; + int max_power_level; + int oxygen; + int stamina; + int radiation; + void initialize_stomach_contents(); /** Stable base metabolic rate due to traits */ diff --git a/src/clzones.cpp b/src/clzones.cpp index 3ed581c20a05d..5e3ac3b127d07 100644 --- a/src/clzones.cpp +++ b/src/clzones.cpp @@ -9,6 +9,7 @@ #include "avatar.h" #include "cata_utility.h" +#include "construction.h" #include "debug.h" #include "game.h" #include "iexamine.h" @@ -17,6 +18,7 @@ #include "json.h" #include "line.h" #include "map.h" +#include "messages.h" #include "output.h" #include "string_input_popup.h" #include "translations.h" @@ -128,6 +130,9 @@ zone_manager::zone_manager() types.emplace( zone_type_id( "LOOT_IGNORE" ), zone_type( translate_marker( "Loot: Ignore" ), translate_marker( "Items inside of this zone are ignored by \"sort out loot\" zone-action." ) ) ); + types.emplace( zone_type_id( "CONSTRUCTION_BLUEPRINT" ), + zone_type( translate_marker( "Construction: Blueprint" ), + translate_marker( "Designate a blueprint zone for construction." ) ) ); types.emplace( zone_type_id( "FARM_PLOT" ), zone_type( translate_marker( "Farm: Plot" ), translate_marker( "Designate a farm plot for tilling and planting." ) ) ); @@ -151,6 +156,8 @@ std::shared_ptr zone_options::create( const zone_type_id &type ) { if( type == zone_type_id( "FARM_PLOT" ) ) { return std::make_shared(); + } else if( type == zone_type_id( "CONSTRUCTION_BLUEPRINT" ) ) { + return std::make_shared(); } return std::make_shared(); @@ -160,12 +167,39 @@ bool zone_options::is_valid( const zone_type_id &type, const zone_options &optio { if( type == zone_type_id( "FARM_PLOT" ) ) { return dynamic_cast( &options ) != nullptr ; + } else if( type == zone_type_id( "CONSTRUCTION_BLUEPRINT" ) ) { + return dynamic_cast( &options ) != nullptr ; } // ensure options is not derived class for the rest of zone types return !options.has_options(); } +blueprint_options::query_con_result blueprint_options::query_con() +{ + int con_index = construction_menu( true ); + if( con_index > -1 ) { + const std::vector &list_constructions = get_constructions(); + std::string chosen_desc = list_constructions[con_index].description; + std::string chosen_mark; + if( !list_constructions[con_index].post_terrain.empty() ) { + chosen_mark = list_constructions[con_index].post_terrain; + } else { + chosen_mark = con; + } + if( chosen_desc != con || chosen_mark != mark || con_index != index ) { + con = chosen_desc; + mark = chosen_mark; + index = con_index; + return changed; + } else { + return successful; + } + } else { + return canceled; + } +} + plot_options::query_seed_result plot_options::query_seed() { player &p = g->u; @@ -174,7 +208,7 @@ plot_options::query_seed_result plot_options::query_seed() return itm.is_seed(); } ); - auto seed_entries = iexamine::get_seed_entries( seed_inv ); + std::vector seed_entries = iexamine::get_seed_entries( seed_inv ); seed_entries.emplace( seed_entries.begin(), seed_tuple( itype_id( "null" ), _( "No seed" ), 0 ) ); int seed_index = iexamine::query_seed( seed_entries ); @@ -211,16 +245,35 @@ plot_options::query_seed_result plot_options::query_seed() } } +bool blueprint_options::query_at_creation() +{ + return query_con() != canceled; +} + bool plot_options::query_at_creation() { return query_seed() != canceled; } +bool blueprint_options::query() +{ + return query_con() == changed; +} + bool plot_options::query() { return query_seed() == changed; } +std::string blueprint_options::get_zone_name_suggestion() const +{ + if( !con.empty() ) { + return con; + } + + return _( "No construction" ); +} + std::string plot_options::get_zone_name_suggestion() const { if( !seed.empty() ) { @@ -236,6 +289,16 @@ std::string plot_options::get_zone_name_suggestion() const return _( "No seed" ); } +std::vector> blueprint_options::get_descriptions() const +{ + std::vector> options = + std::vector>(); + options.emplace_back( std::make_pair( _( "Construct: " ), + !con.empty() ? con : _( "No Construction" ) ) ); + + return options; +} + std::vector> plot_options::get_descriptions() const { auto options = std::vector>(); @@ -245,6 +308,20 @@ std::vector> plot_options::get_descriptions( return options; } +void blueprint_options::serialize( JsonOut &json ) const +{ + json.member( "mark", mark ); + json.member( "con", con ); + json.member( "index", index ); +} + +void blueprint_options::deserialize( JsonObject &jo_zone ) +{ + jo_zone.read( "mark", mark ); + jo_zone.read( "con", con ); + jo_zone.read( "index", index ); +} + void plot_options::serialize( JsonOut &json ) const { json.member( "mark", mark ); @@ -495,6 +572,7 @@ bool zone_manager::has_loot_dest_near( const tripoint &where ) const const zone_type_id &type = ztype.first; if( type == zone_type_id( "CAMP_FOOD" ) || type == zone_type_id( "FARM_PLOT" ) || type == zone_type_id( "LOOT_UNSORTED" ) || type == zone_type_id( "LOOT_IGNORE" ) || + type == zone_type_id( "CONSTRUCTION_BLUEPRINT" ) || type == zone_type_id( "NO_AUTO_PICKUP" ) || type == zone_type_id( "NO_NPC_PICKUP" ) ) { continue; } @@ -738,7 +816,7 @@ void zone_manager::add( const std::string &name, const zone_type_id &type, const // TODO:Allow for loot zones on vehicles to be larger than 1x1 if( start == end && query_yn( _( "Bind this zone to the cargo part here?" ) ) ) { // TODO: refactor zone options for proper validation code - if( type == zone_type_id( "FARM_PLOT" ) ) { + if( type == zone_type_id( "FARM_PLOT" ) || type == zone_type_id( "CONSTRUCTION_BLUEPRINT" ) ) { popup( _( "You cannot add that type of zone to a vehicle." ), PF_NONE ); return; } diff --git a/src/clzones.h b/src/clzones.h index 10210e58a6850..98c8e89dcb314 100644 --- a/src/clzones.h +++ b/src/clzones.h @@ -127,6 +127,47 @@ class plot_options : public zone_options, public mark_option void deserialize( JsonObject &jo_zone ) override; }; +class blueprint_options : public zone_options, public mark_option +{ + private: + std::string mark; // furn/ter id as string. + std::string con; + int index; + + enum query_con_result { + canceled, + successful, + changed, + }; + + query_con_result query_con(); + + public: + std::string get_mark() const override { + return mark; + } + std::string get_con() const { + return con; + } + int get_index() const { + return index; + } + + bool has_options() const override { + return true; + } + + bool query_at_creation() override; + bool query() override; + + std::string get_zone_name_suggestion() const override; + + std::vector> get_descriptions() const override; + + void serialize( JsonOut &json ) const override; + void deserialize( JsonObject &jo_zone ) override; +}; + /** * These are zones the player can designate. */ diff --git a/src/colony.h b/src/colony.h index fa2a31980b30a..0bda1bc23e8c0 100644 --- a/src/colony.h +++ b/src/colony.h @@ -59,6 +59,9 @@ #include // std::is_trivially_destructible, etc #include // std::move +namespace cata +{ + template , typename element_skipfield_type = unsigned short > // Empty base class optimization - inheriting allocator functions class colony : private element_allocator_type @@ -604,7 +607,13 @@ class colony : private element_allocator_type public: - // Default constuctor: + /** + * Default constructor: + * default minimum group size is 8, default maximum group size is + * std::numeric_limits::max() (typically 65535). You cannot set the group + * sizes from the constructor in this scenario, but you can call the change_group_sizes() + * member function after construction has occurred. + */ colony() noexcept: element_allocator_type( element_allocator_type() ), groups_with_erasures_list_head( NULL ), @@ -619,7 +628,10 @@ class colony : private element_allocator_type !std::numeric_limits::is_signed ); } - // Default constuctor (allocator-extended): + /** + * Default constructor, but using a custom memory allocator eg. something other than + * std::allocator. + */ explicit colony( const element_allocator_type &alloc ): element_allocator_type( alloc ), groups_with_erasures_list_head( NULL ), @@ -633,7 +645,12 @@ class colony : private element_allocator_type !std::numeric_limits::is_signed ); } - // Copy constructor: + /** + * Copy constructor: + * Copy all contents from source colony, removes any empty (erased) element locations in the + * process. Size of groups created is either the total size of the source colony, or the + * maximum group size of the source colony, whichever is the smaller. + */ colony( const colony &source ): element_allocator_type( source ), groups_with_erasures_list_head( NULL ), @@ -693,7 +710,12 @@ class colony : private element_allocator_type public: - // Move constructor: + /** + * Move constructor: + * Move all contents from source colony, does not remove any erased element locations or + * alter any of the source group sizes. Source colony is now empty and can be safely + * destructed or otherwise used. + */ colony( colony &&source ) noexcept: element_allocator_type( source ), end_iterator( std::move( source.end_iterator ) ), @@ -719,7 +741,18 @@ class colony : private element_allocator_type source.blank(); } - // Fill constructor: + /** + * Fill constructor with value_type unspecified, so the value_type's default constructor is + * used. n specifies the number of elements to create upon construction. If n is larger than + * min_group_size, the size of the groups created will either be n and max_group_size, + * depending on which is smaller. min_group_size (ie. the smallest possible number of + * elements which can be stored in a colony group) can be defined, as can the max_group_size. + * Setting the group sizes can be a performance advantage if you know in advance roughly how + * many objects are likely to be stored in your colony long-term - or at least the rough + * scale of storage. If that case, using this can stop many small initial groups being + * allocated (reserve() will achieve a similar result, but structurally at the moment is + * limited to allocating one group). + */ colony( const size_type fill_number, const element_type &element, const skipfield_type min_allocation_amount = 0, const skipfield_type max_allocation_amount = std::numeric_limits::max(), @@ -896,6 +929,11 @@ class colony : private element_allocator_type public: + /** + * Inserts the element supplied to the colony, using the object's copy-constructor. Will + * insert the element into a previously erased element slot if one exists, otherwise will + * insert to back of colony. Returns iterator to location of inserted element. + */ iterator insert( const element_type &element ) { if( end_iterator.element_pointer != NULL ) { switch( ( ( groups_with_erasures_list_head != NULL ) << 1 ) | ( end_iterator.element_pointer == @@ -1047,7 +1085,14 @@ class colony : private element_allocator_type } } - // The move-insert function is near-identical to the regular insert function, with the exception of the element construction method and is_nothrow tests. + /** + * Moves the element supplied to the colony, using the object's move-constructor. Will + * insert the element in a previously erased element slot if one exists, otherwise will + * insert to back of colony. Returns iterator to location of inserted element. + * + * The move-insert function is near-identical to the regular insert function, with the + * exception of the element construction method and is_nothrow tests. + */ iterator insert( element_type &&element ) { if( end_iterator.element_pointer != NULL ) { switch( ( ( groups_with_erasures_list_head != NULL ) << 1 ) | ( end_iterator.element_pointer == @@ -1186,8 +1231,16 @@ class colony : private element_allocator_type } } + /** + * Constructs new element directly within colony. Will insert the element in a previously + * erased element slot if one exists, otherwise will insert to back of colony. Returns + * iterator to location of inserted element. "...parameters" are whatever parameters are + * required by the object's constructor. + * + * The emplace function is near-identical to the regular insert function, with the exception + * of the element construction method and change to is_nothrow tests. + */ template - // The emplace function is near-identical to the regular insert function, with the exception of the element construction method, removal of internal VARIADICS support checks, and change to is_nothrow tests. iterator emplace( arguments &&... parameters ) { if( end_iterator.element_pointer != NULL ) { switch( ( ( groups_with_erasures_list_head != NULL ) << 1 ) | ( end_iterator.element_pointer == @@ -1455,7 +1508,11 @@ class colony : private element_allocator_type public: - // Fill insert + /** + * Fill insert: + * Inserts n copies of val into the colony. Will insert the element into a previously erased + * element slot if one exists, otherwise will insert to back of colony. + */ void insert( size_type number_of_elements, const element_type &element ) { if( number_of_elements == 0 ) { return; @@ -1589,7 +1646,12 @@ class colony : private element_allocator_type ( end_iterator.element_pointer - end_iterator.group_pointer->elements ); } - // Range insert + /** + * Range insert: + * Inserts a series of value_type elements from an external source into a colony holding the + * same value_type (eg. int, float, a particular class, etcetera). Stops inserting once it + * reaches last. + */ template inline void insert( typename enable_if_c < !std::numeric_limits::is_integer, iterator_type >::type first, const iterator_type last ) { @@ -1598,7 +1660,11 @@ class colony : private element_allocator_type } } - // Initializer-list insert + /** + * Initializer-list insert: + * Copies elements from an initializer list into the colony. Will insert the element in a + * previously erased element slot if one exists, otherwise will insert to back of colony. + */ inline void insert( const std::initializer_list &element_list ) { // use range insert: insert( element_list.begin(), element_list.end() ); @@ -1656,8 +1722,21 @@ class colony : private element_allocator_type public: - // must return iterator to subsequent non-erased element (or end()), in case the group containing the element which the iterator points to becomes empty after the erasure, and is thereafter removed from the colony chain, making the current iterator invalid and unusable in a ++ operation: - // if uninitialized/invalid iterator supplied, function could generate an exception + /** + * Removes the element pointed to by the supplied iterator, from the colony. Returns an + * iterator pointing to the next non-erased element in the colony (or to end() if no more + * elements are available). This must return an iterator because if a colony group becomes + * entirely empty, it will be removed from the colony, invalidating the existing iterator. + * Attempting to erase a previously-erased element results in undefined behaviour (this is + * checked for via an assert in debug mode). + * + * must return iterator to subsequent non-erased element (or end()), in case the group + * containing the element which the iterator points to becomes empty after the erasure, and + * is thereafter removed from the colony chain, making the current iterator invalid and + * unusable in a ++ operation: + * + * if uninitialized/invalid iterator supplied, function could generate an exception + */ iterator erase( const const_iterator &it ) { assert( !empty() ); const group_pointer_type group_pointer = it.group_pointer; @@ -1881,7 +1960,12 @@ class colony : private element_allocator_type } } - // Range erase: + /** + * Range erase: + * Erases all elements of a given colony from first to the element before the last iterator. + * This function is optimized for multiple consecutive erasures and will always be faster + * than sequential single-element erase calls in that scenario. + */ void erase( const const_iterator &iterator1, const const_iterator &iterator2 ) { // if uninitialized/invalid iterators supplied, function could generate an exception. If iterator1 > iterator2, behaviour is undefined. assert( iterator1 <= iterator2 ); @@ -2194,22 +2278,31 @@ class colony : private element_allocator_type } } + /** Returns a boolean indicating whether the colony is currently empty of elements. */ inline COLONY_FORCE_INLINE bool empty() const noexcept { return total_number_of_elements == 0; } + /** Returns total number of elements currently stored in container. */ inline size_type size() const noexcept { return total_number_of_elements; } + /** Returns the maximum number of elements that the allocator can store in the container. */ inline size_type max_size() const noexcept { return std::allocator_traits::max_size( *this ); } + /** Returns total number of elements currently able to be stored in container without expansion. */ inline size_type capacity() const noexcept { return total_capacity; } + /** + * Returns the approximate memory use of the container plus it's elements. Will be + * inaccurate if the elements themselves dynamically-allocate data. Utility function + * primarily for benchmarking. + */ inline size_type approximate_memory_use() const noexcept { return sizeof( *this ) + // sizeof colony basic structure @@ -2220,6 +2313,15 @@ class colony : private element_allocator_type skipfield_type ) ) ) ); // if colony not empty, add the memory usage of the group structures themselves, adding the extra skipfield node } + /** + * Changes the minimum and maximum internal group sizes, in terms of number of elements + * stored per group. If the colony is not empty and either min_group_size is larger than the + * smallest group in the colony, or max_group_size is smaller than the largest group in the + * colony, the colony will be internally copy-constructed into a new colony which uses the + * new group sizes, invalidating all pointers/iterators/references. If trying to change + * group sizes with a colony storing a non-copyable/movable type, please use the + * reinitialize function instead. + */ void change_group_sizes( const skipfield_type min_allocation_amount, const skipfield_type max_allocation_amount ) { assert( ( min_allocation_amount > 2 ) & ( min_allocation_amount <= max_allocation_amount ) ); @@ -2234,20 +2336,48 @@ class colony : private element_allocator_type } } + /** + * Changes the minimum internal group size only, in terms of minimum number of elements + * stored per group. If the colony is not empty and min_group_size is larger than the + * smallest group in the colony, the colony will be internally move-constructed (if possible) + * or copy-constructed into a new colony which uses the new minimum group size, invalidating + * all pointers/iterators/references. If trying to change group sizes with a colony storing + * a non-copyable/movable type, please use the reinitialize function instead. + */ inline void change_minimum_group_size( const skipfield_type min_allocation_amount ) { change_group_sizes( min_allocation_amount, group_allocator_pair.max_elements_per_group ); } + /** + * Changes the maximum internal group size only, in terms of maximum number of elements + * stored per group. If the colony is not empty and either max_group_size is smaller than + * the largest group in the colony, the colony will be internally move-constructed (if + * possible) or copy-constructed into a new colony which uses the new maximum group size, + * invalidating all pointers/iterators/references. If trying to change group sizes with a + * colony storing a non-copyable/movable type, please use the reinitialize function instead. + */ inline void change_maximum_group_size( const skipfield_type max_allocation_amount ) { change_group_sizes( pointer_allocator_pair.min_elements_per_group, max_allocation_amount ); } + /** + * Sets @param minimum_group_size and @param maximum_group_size to the minimum and maximum + * group size respectively + */ inline void get_group_sizes( skipfield_type &minimum_group_size, skipfield_type &maximum_group_size ) const noexcept { minimum_group_size = pointer_allocator_pair.min_elements_per_group; maximum_group_size = group_allocator_pair.max_elements_per_group; } + /** + * Semantics of this function are the same as + * clear(); + * change_group_sizes(min_group_size, max_group_size); + * but without the move/copy-construction code of the change_group_sizes() function - this + * means it can be used with element types which are non-copy-constructible and + * non-move-constructible, unlike change_group_sizes(). + */ inline void reinitialize( const skipfield_type min_allocation_amount, const skipfield_type max_allocation_amount ) noexcept { assert( ( min_allocation_amount > 2 ) & ( min_allocation_amount <= max_allocation_amount ) ); @@ -2256,11 +2386,19 @@ class colony : private element_allocator_type group_allocator_pair.max_elements_per_group = max_allocation_amount; } + /** + * Empties the colony and removes all elements and groups. + */ inline COLONY_FORCE_INLINE void clear() noexcept { destroy_all_data(); blank(); } + /** + * Copy assignment: + * Copy the elements from another colony to this colony, clearing this colony of existing + * elements first. + */ inline colony &operator=( const colony &source ) { assert( &source != this ); @@ -2272,7 +2410,13 @@ class colony : private element_allocator_type return *this; } - // Move assignment + /** + * Move assignment: + * Move the elements from another colony to this colony, clearing this colony of existing + * elements first. Source colony is now empty and in a valid state (same as a new colony + * without any insertions), can be safely destructed or used in any regular way without + * problems. + */ colony &operator=( colony &&source ) COLONY_NOEXCEPT_MOVE_ASSIGNMENT( allocator_type ) { assert( &source != this ); destroy_all_data(); @@ -2295,6 +2439,7 @@ class colony : private element_allocator_type return *this; } + /** Compare contents of another colony to this colony. Returns true if they are equal. */ bool operator==( const colony &rh ) const noexcept { assert( this != &rh ); @@ -2312,10 +2457,18 @@ class colony : private element_allocator_type return true; } + /** Compare contents of another colony to this colony. Returns true if they are unequal. */ inline bool operator!=( const colony &rh ) const noexcept { return !( *this == rh ); } + /** + * Reduces container capacity to the amount necessary to store all currently stored + * elements, consolidates elements and removes any erased locations. If the total number of + * elements is larger than the maximum group size, the resultant capacity will be equal to + * ((total_elements / max_group_size) + 1) * max_group_size (rounding down at division). + * Invalidates all pointers, iterators and references to elements within the container. + */ void shrink_to_fit() { if( total_number_of_elements == total_capacity ) { return; @@ -2327,6 +2480,18 @@ class colony : private element_allocator_type consolidate(); } + /** + * Preallocates memory space sufficient to store the number of elements indicated by + * reserve_amount. The maximum size for this number is currently limited to the maximum + * group size of the colony and will be rounded down if necessary. The default maximum group + * size is 65535 on the majority of platforms. The default minimum reserve amount is the + * same as the current minimum group size, and will be rounded up silently if necessary. + * This function is useful from a performance perspective when the user is inserting + * elements singly, but the overall number of insertions is known in advance. By reserving, + * colony can forgo creating many smaller memory block allocations (due to colony's growth + * factor) and reserve a single memory block instead. Alternatively one could simply change + * the default group sizes. + */ void reserve( const size_type original_reserve_amount ) { if( original_reserve_amount == 0 || original_reserve_amount <= total_capacity ) { // Already have enough space allocated @@ -2367,6 +2532,13 @@ class colony : private element_allocator_type } } + /** + * Increments/decrements the iterator supplied by the positive or negative amount indicated + * by distance. Speed of incrementation will almost always be faster than using the ++ + * operator on the iterator for increments greater than 1. In some cases it may approximate + * O(1). The iterator_type can be an iterator, const_iterator, reverse_iterator or + * const_reverse_iterator. + */ // Advance implementation for iterator and const_iterator: // Cannot be noexcept due to the possibility of an uninitialized iterator template @@ -2765,7 +2937,10 @@ class colony : private element_allocator_type } } - // Next implementations: + /** + * Creates a copy of the iterator supplied, then increments/decrements this iterator by + * the positive or negative amount indicated by distance. + */ template inline colony_iterator next( const colony_iterator &it, const typename colony_iterator::difference_type distance = 1 ) const { @@ -2774,6 +2949,10 @@ class colony : private element_allocator_type return return_iterator; } + /** + * Creates a copy of the iterator supplied, then increments/decrements this iterator by + * the positive or negative amount indicated by distance. + */ template inline colony_reverse_iterator next( const colony_reverse_iterator &it, const typename colony_reverse_iterator::difference_type distance = 1 ) const { @@ -2782,7 +2961,10 @@ class colony : private element_allocator_type return return_iterator; } - // Prev implementations: + /** + * Creates a copy of the iterator supplied, then decrements/increments this iterator by the + * positive or negative amount indicated by distance. + */ template inline colony_iterator prev( const colony_iterator &it, const typename colony_iterator::difference_type distance = 1 ) const { @@ -2791,6 +2973,10 @@ class colony : private element_allocator_type return return_iterator; } + /** + * Creates a copy of the iterator supplied, then decrements/increments this iterator by the + * positive or negative amount indicated by distance. + */ template inline colony_reverse_iterator prev( const colony_reverse_iterator &it, const typename colony_reverse_iterator::difference_type distance = 1 ) const { @@ -2799,7 +2985,11 @@ class colony : private element_allocator_type return return_iterator; } - // distance implementation: + /** + * Measures the distance between two iterators, returning the result, which will be negative + * if the second iterator supplied is before the first iterator supplied in terms of its + * location in the colony. + */ template typename colony_iterator::difference_type distance( const colony_iterator &first, const colony_iterator &last ) const { @@ -2892,7 +3082,22 @@ class colony : private element_allocator_type // Type-changing functions: - // Cannot be noexcept as colony could be empty or pointer invalid + /** + * Getting a pointer from an iterator is simple - simply dereference it then grab the + * address ie. "&(*the_iterator);". Getting an iterator from a pointer is typically not so + * simple. This function enables the user to do exactly that. This is expected to be useful + * in the use-case where external containers are storing pointers to colony elements instead + * of iterators (as iterators for colonies have 3 times the size of an element pointer) and + * the program wants to erase the element being pointed to or possibly change the element + * being pointed to. Converting a pointer to an iterator using this method and then erasing, + * is about 20% slower on average than erasing when you already have the iterator. This is + * less dramatic than it sounds, as it is still faster than all std:: container erasure + * times which it is roughly equal to. However this is generally a slower, lookup-based + * operation. If the lookup doesn't find a non-erased element based on that pointer, it + * returns end(). Otherwise it returns an iterator pointing to the element in question. + * + * Cannot be noexcept as colony could be empty or pointer invalid + */ iterator get_iterator_from_pointer( const pointer element_pointer ) const { assert( !empty() ); assert( element_pointer != NULL ); @@ -2917,8 +3122,16 @@ class colony : private element_allocator_type return end_iterator; } + /** + * While colony is a container with unordered insertion (and is therefore unordered), it + * still has a (transitory) order which changes upon any erasure or insertion. Temporary + * index numbers are therefore obtainable. These can be useful, for example, when creating + * a save file in a computer game, where certain elements in a container may need to be + * re-linked to other elements in other container upon reloading the save file. + * + * may throw exception if iterator is invalid/uninitialized + */ template - // may throw exception if iterator is invalid/uninitialized size_type get_index_from_iterator( const colony_iterator &it ) const { assert( !empty() ); assert( it.group_pointer != NULL ); @@ -2950,14 +3163,26 @@ class colony : private element_allocator_type return index; } + /** + * The same as get_index_from_iterator, but for reverse_iterators and const_reverse_iterators. + * Index is from front of colony (same as iterator), not back of colony. + */ template inline size_type get_index_from_reverse_iterator( const colony_reverse_iterator &rev_iterator ) const { return get_index_from_iterator( rev_iterator.it ); } + /** + * As described above, there may be situations where obtaining iterators to specific + * elements based on an index can be useful, for example, when reloading save files. This + * function is basically a shorthand to avoid typing + * iterator it = colony.begin(); + * colony.advance(it, index); + * + * Cannot be noexcept as colony could be empty + */ template - // Cannot be noexcept as colony could be empty iterator get_iterator_from_index( const index_type index ) const { assert( !empty() ); assert( std::numeric_limits::is_integer ); @@ -2967,6 +3192,7 @@ class colony : private element_allocator_type return it; } + /** Returns a copy of the allocator used by the colony instance. */ inline allocator_type get_allocator() const noexcept { return element_allocator_type(); } @@ -2997,6 +3223,13 @@ class colony : private element_allocator_type public: + /** + * Sort the content of the colony. By default this compares the colony content using a + * less-than operator, unless the user supplies a comparison function (ie. same conditions + * as std::list's sort function). + * + * Uses std::sort internally. + */ template void sort( comparison_function compare ) { if( total_number_of_elements < 2 ) { @@ -3070,6 +3303,19 @@ class colony : private element_allocator_type sort( less() ); } + /** + * Transfer all elements from source colony into destination colony without invalidating + * pointers/iterators to either colony's elements (in other words the destination takes + * ownership of the source's memory blocks). After the splice, the source colony is empty. + * Splicing is much faster than range-moving or copying all elements from one colony to + * another. Colony does not guarantee a particular order of elements after splicing, for + * performance reasons; the insertion location of source elements in the destination colony + * is chosen based on the most positive performance outcome for subsequent iterations/ + * insertions. For example if the destination colony is {1, 2, 3, 4} and the source colony + * is {5, 6, 7, 8} the destination colony post-splice could be {1, 2, 3, 4, 5, 6, 7, 8} or + * {5, 6, 7, 8, 1, 2, 3, 4}, depending on internal state of both colonies and prior + * insertions/erasures. + */ void splice( colony &source ) COLONY_NOEXCEPT_SWAP( allocator_type ) { // Process: if there are unused memory spaces at the end of the current back group of the chain, convert them // to skipped elements and add the locations to the group's free list. @@ -3178,6 +3424,7 @@ class colony : private element_allocator_type source.blank(); } + /** Swaps the colony's contents with that of source. */ void swap( colony &source ) COLONY_NOEXCEPT_SWAP( allocator_type ) { assert( &source != this ); @@ -3230,6 +3477,10 @@ class colony : private element_allocator_type }; // colony +/** + * Swaps colony A's contents with that of colony B. + * Assumes both colonies have same element type, allocator type, etc. + */ template inline void swap( colony &a, colony &b ) COLONY_NOEXCEPT_SWAP( @@ -3238,6 +3489,8 @@ inline void swap( colony= num_colors ) { - debugmsg( "Invalid color index: %d. Color array size: %ld", id, - static_cast( color_array.size() ) ); + debugmsg( "Invalid color index: %d. Color array size: %zd", id, color_array.size() ); return nc_color(); } @@ -546,7 +545,9 @@ nc_color cyan_background( const nc_color &c ) */ nc_color color_from_string( const std::string &color ) { - + if( color.empty() ) { + return c_unset; + } std::string new_color = color; if( new_color.substr( 1, 1 ) != "_" ) { //c_ //i_ //h_ new_color = "c_" + new_color; @@ -645,6 +646,17 @@ std::string colorize( const std::string &text, const nc_color &color ) return get_tag_from_color( color ) + text + ""; } +std::string get_note_string_from_color( const nc_color &color ) +{ + for( auto i : color_by_string_map ) { + if( i.second.color == color ) { + return i.first; + } + } + // The default note string. + return "Y"; +} + nc_color get_note_color( const std::string ¬e_id ) { const auto candidate_color = color_by_string_map.find( note_id ); diff --git a/src/color.h b/src/color.h index aadccbfef0daa..04a56f7ce4b65 100644 --- a/src/color.h +++ b/src/color.h @@ -385,7 +385,7 @@ struct hash { return hash()( v.operator int() ); } }; -} +} // namespace std class color_manager { @@ -481,7 +481,6 @@ struct color_tag_parse_result { }; extern std::unordered_map color_by_string_map; -extern std::unordered_map color_shortcuts; nc_color hilite( const nc_color &c ); nc_color invert_color( const nc_color &c ); @@ -499,6 +498,7 @@ color_tag_parse_result get_color_from_tag( const std::string &s ); std::string get_tag_from_color( const nc_color &color ); std::string colorize( const std::string &text, const nc_color &color ); +std::string get_note_string_from_color( const nc_color &color ); nc_color get_note_color( const std::string ¬e_id ); std::list> get_note_color_names(); diff --git a/src/computer.cpp b/src/computer.cpp index b62957330660a..99b972539f1b7 100644 --- a/src/computer.cpp +++ b/src/computer.cpp @@ -596,7 +596,7 @@ void computer::activate_function( computer_action action ) for( int i = -60; i <= 60; i++ ) { for( int j = -60; j <= 60; j++ ) { const oter_id &oter = overmap_buffer.ter( center.x + i, center.y + j, center.z ); - if( is_ot_type( "sewer", oter ) || is_ot_type( "sewage", oter ) ) { + if( is_ot_type( "sewer", oter ) || is_ot_prefix( "sewage", oter ) ) { overmap_buffer.set_seen( center.x + i, center.y + j, center.z, true ); } } @@ -877,16 +877,17 @@ PERTINENT FOREMAN LOGS WILL BE PREPENDED TO NOTES" ), g->u.moves -= 70; for( const tripoint &dest : g->m.points_in_radius( g->u.pos(), 2 ) ) { if( g->m.ter( dest ) == t_centrifuge ) { - if( g->m.i_at( dest ).empty() ) { + map_stack items = g->m.i_at( dest ); + if( items.empty() ) { print_error( _( "ERROR: Please place sample in centrifuge." ) ); - } else if( g->m.i_at( dest ).size() > 1 ) { + } else if( items.size() > 1 ) { print_error( _( "ERROR: Please remove all but one sample from centrifuge." ) ); - } else if( g->m.i_at( dest )[0].contents.empty() ) { + } else if( items.only_item().contents.empty() ) { print_error( _( "ERROR: Please only use container with blood sample." ) ); - } else if( g->m.i_at( dest )[0].contents.front().typeId() != "blood" ) { + } else if( items.only_item().contents.front().typeId() != "blood" ) { print_error( _( "ERROR: Please only use blood samples." ) ); } else { // Success! - const item &blood = g->m.i_at( dest ).front().contents.front(); + const item &blood = items.only_item().contents.front(); const mtype *mt = blood.get_mtype(); if( mt == nullptr || mt->id == mtype_id::NULL_ID() ) { print_line( _( "Result: Human blood, no pathogens found." ) ); @@ -921,17 +922,18 @@ PERTINENT FOREMAN LOGS WILL BE PREPENDED TO NOTES" ), for( const tripoint &dest : g->m.points_in_radius( g->u.pos(), 2 ) ) { if( g->m.ter( dest ) == t_floor_blue ) { print_error( _( "PROCESSING DATA" ) ); - if( g->m.i_at( dest ).empty() ) { + map_stack items = g->m.i_at( dest ); + if( items.empty() ) { print_error( _( "ERROR: Please place memory bank in scan area." ) ); - } else if( g->m.i_at( dest ).size() > 1 ) { + } else if( items.size() > 1 ) { print_error( _( "ERROR: Please only scan one item at a time." ) ); - } else if( g->m.i_at( dest )[0].typeId() != "usb_drive" && - g->m.i_at( dest )[0].typeId() != "black_box" ) { + } else if( items.only_item().typeId() != "usb_drive" && + items.only_item().typeId() != "black_box" ) { print_error( _( "ERROR: Memory bank destroyed or not present." ) ); - } else if( g->m.i_at( dest )[0].typeId() == "usb_drive" && g->m.i_at( dest )[0].contents.empty() ) { + } else if( items.only_item().typeId() == "usb_drive" && items.only_item().contents.empty() ) { print_error( _( "ERROR: Memory bank is empty." ) ); } else { // Success! - if( g->m.i_at( dest )[0].typeId() == "black_box" ) { + if( items.only_item().typeId() == "black_box" ) { print_line( _( "Memory Bank: Military Hexron Encryption\nPrinting Transcript\n" ) ); item transcript( "black_box_transcript", calendar::turn ); g->m.add_item_or_charges( g->u.posx(), g->u.posy(), transcript ); @@ -1617,15 +1619,16 @@ void computer::activate_failure( computer_failure_type fail ) print_error( _( "ERROR: Disruptive Spin" ) ); for( const tripoint &dest : g->m.points_in_radius( g->u.pos(), 2 ) ) { if( g->m.ter( dest ) == t_centrifuge ) { - if( g->m.i_at( dest ).empty() ) { + map_stack items = g->m.i_at( dest ); + if( items.empty() ) { print_error( _( "ERROR: Please place sample in centrifuge." ) ); - } else if( g->m.i_at( dest ).size() > 1 ) { + } else if( items.size() > 1 ) { print_error( _( "ERROR: Please remove all but one sample from centrifuge." ) ); - } else if( g->m.i_at( dest )[0].typeId() != "vacutainer" ) { + } else if( items.only_item().typeId() != "vacutainer" ) { print_error( _( "ERROR: Please use blood-contained samples." ) ); - } else if( g->m.i_at( dest )[0].contents.empty() ) { + } else if( items.only_item().contents.empty() ) { print_error( _( "ERROR: Blood draw kit, empty." ) ); - } else if( g->m.i_at( dest )[0].contents.front().typeId() != "blood" ) { + } else if( items.only_item().contents.front().typeId() != "blood" ) { print_error( _( "ERROR: Please only use blood samples." ) ); } else { print_error( _( "ERROR: Blood sample destroyed." ) ); @@ -1641,13 +1644,14 @@ void computer::activate_failure( computer_failure_type fail ) for( int x = 0; x < SEEX * 2; x++ ) { for( int y = 0; y < SEEY * 2; y++ ) { if( g->m.ter( x, y ) == t_floor_blue ) { - if( g->m.i_at( x, y ).empty() ) { + map_stack items = g->m.i_at( x, y ); + if( items.empty() ) { print_error( _( "ERROR: Please place memory bank in scan area." ) ); - } else if( g->m.i_at( x, y ).size() > 1 ) { + } else if( items.size() > 1 ) { print_error( _( "ERROR: Please only scan one item at a time." ) ); - } else if( g->m.i_at( x, y )[0].typeId() != "usb_drive" ) { + } else if( items.only_item().typeId() != "usb_drive" ) { print_error( _( "ERROR: Memory bank destroyed or not present." ) ); - } else if( g->m.i_at( x, y )[0].contents.empty() ) { + } else if( items.only_item().contents.empty() ) { print_error( _( "ERROR: Memory bank is empty." ) ); } else { print_error( _( "ERROR: Data bank destroyed." ) ); diff --git a/src/construction.cpp b/src/construction.cpp index f5ad03966531c..29a1cad674a09 100644 --- a/src/construction.cpp +++ b/src/construction.cpp @@ -47,6 +47,7 @@ #include "player_activity.h" #include "pldata.h" #include "morale_types.h" +#include "ui.h" class inventory; @@ -73,8 +74,9 @@ static bool check_nothing( const tripoint & ) bool check_empty( const tripoint & ); // tile is empty bool check_support( const tripoint & ); // at least two orthogonal supports bool check_deconstruct( const tripoint & ); // either terrain or furniture must be deconstructible -bool check_up_OK( const tripoint & ); // tile is empty and you're not on the surface -bool check_down_OK( const tripoint & ); // tile is empty and you're not on z-10 already +bool check_empty_up_OK( const tripoint & ); // tile is empty and below OVERMAP_HEIGHT +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 & ); // Special actions to be run post-terrain-mod @@ -87,6 +89,7 @@ void done_digormine_stair( const tripoint &, bool ); void done_dig_stair( const tripoint & ); void done_mine_downstair( const tripoint & ); void done_mine_upstair( const tripoint & ); +void done_wood_stairs( const tripoint & ); void done_window_curtains( const tripoint & ); void done_extract_maybe_revert_to_dirt( const tripoint & ); void done_mark_firewood( const tripoint & ); @@ -94,17 +97,16 @@ void done_mark_practice_target( const tripoint & ); void failure_standard( const tripoint & ); void failure_deconstruct( const tripoint & ); -} +} // namespace construct + +std::vector constructions; // Helper functions, nobody but us needs to call these. static bool can_construct( const std::string &desc ); static bool can_construct( const construction &con ); -static bool player_can_build( player &p, const inventory &inv, const construction &con ); static bool player_can_build( player &p, const inventory &inv, const std::string &desc ); static void place_construction( const std::string &desc ); -std::vector constructions; - // Color standardization for string streams static const deferred_color color_title = def_c_light_red; //color for titles static const deferred_color color_data = def_c_cyan; //color for data parts @@ -128,7 +130,7 @@ static std::vector constructions_by_desc( const std::string &des } static void load_available_constructions( std::vector &available, - std::map> &cat_available, + std::map> &cat_available, bool hide_unconstructable ) { cat_available.clear(); @@ -201,17 +203,17 @@ const std::vector &get_constructions() return constructions; } -void construction_menu() +int construction_menu( bool blueprint ) { static bool hide_unconstructable = false; // only display constructions the player can theoretically perform std::vector available; - std::map> cat_available; + std::map> cat_available; load_available_constructions( available, cat_available, hide_unconstructable ); if( available.empty() ) { popup( _( "You can not construct anything here." ) ); - return; + return -1; } int w_height = TERMY; @@ -235,14 +237,9 @@ void construction_menu() draw_grid( w_con, w_list_width + w_list_x0 ); - //tabcount needs to be increased to add more categories - const int tabcount = 10; - std::array construct_cat = {{ - _( "All" ), _( "Constructions" ), _( "Furniture" ), _( "Digging and Mining" ), - _( "Repairing" ), _( "Reinforcing" ), _( "Decorative" ), _( "Farming and Woodcutting" ), - _( "Others" ), _( "Filter" ) - } - }; + int ret = -1; + std::vector construct_cat; + construct_cat = construction_categories::get_all(); bool update_info = true; bool update_cat = true; @@ -251,7 +248,7 @@ void construction_menu() int select = 0; int offset = 0; bool exit = false; - std::string category_name; + construction_category_id category_id; std::vector constructs; //storage for the color text so it can be scrolled std::vector< std::vector < std::string > > construct_buffers; @@ -279,48 +276,18 @@ void construction_menu() ctxt.register_action( "HELP_KEYBINDINGS" ); ctxt.register_action( "FILTER" ); + static const int tabcount = static_cast( construction_category::count() ); + std::string filter; int previous_index = 0; do { if( update_cat ) { update_cat = false; - switch( tabindex ) { - case 0: - category_name = "ALL"; - break; - case 1: - category_name = "CONSTRUCT"; - break; - case 2: - category_name = "FURN"; - break; - case 3: - category_name = "DIG"; - break; - case 4: - category_name = "REPAIR"; - break; - case 5: - category_name = "REINFORCE"; - break; - case 6: - category_name = "DECORATE"; - break; - case 7: - category_name = "FARM_WOOD"; - break; - case 8: - category_name = "OTHER"; - break; - case 9: - category_name = "FILTER"; - break; - } - - if( category_name == "ALL" ) { + category_id = construction_categories::get_all()[tabindex].id; + if( category_id == "ALL" ) { constructs = available; previous_index = tabindex; - } else if( category_name == "FILTER" ) { + } else if( category_id == "FILTER" ) { constructs.clear(); previous_select = -1; std::copy_if( available.begin(), available.end(), @@ -329,7 +296,7 @@ void construction_menu() return lcmatch( _( a ), filter ); } ); } else { - constructs = cat_available[category_name]; + constructs = cat_available[category_id]; previous_index = tabindex; } if( isnew ) { @@ -347,7 +314,7 @@ void construction_menu() mvwhline( w_con, 1, 1, ' ', w_list_width ); werase( w_list ); // Print new tab listing - mvwprintz( w_con, 1, 1, c_yellow, "<< %s >>", construct_cat[tabindex] ); + mvwprintz( w_con, 1, 1, c_yellow, "<< %s >>", _( construct_cat[tabindex].name ) ); // Determine where in the master list to start printing calcStartPos( offset, select, w_list_height, constructs.size() ); // Print the constructions between offset and max (or how many will fit) @@ -622,9 +589,9 @@ void construction_menu() if( !filter.empty() ) { update_info = true; update_cat = true; - tabindex = 9; + tabindex = tabcount - 1; select = 0; - } else if( previous_index != 9 ) { + } else if( previous_index != tabcount - 1 ) { tabindex = previous_index; update_info = true; update_cat = true; @@ -690,14 +657,32 @@ void construction_menu() // Nothing to be done here continue; } - if( player_can_build( g->u, total_inv, constructs[select] ) ) { - place_construction( constructs[select] ); - uistate.last_construction = constructs[select]; - exit = true; + if( !blueprint ) { + if( player_can_build( g->u, total_inv, constructs[select] ) ) { + 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." ) ); + } else { + place_construction( constructs[select] ); + uistate.last_construction = constructs[select]; + } + exit = true; + } else { + popup( _( "You can't build that!" ) ); + draw_grid( w_con, w_list_width + w_list_x0 ); + update_info = true; + } } else { - popup( _( "You can't build that!" ) ); - draw_grid( w_con, w_list_width + w_list_x0 ); - update_info = true; + // get the index of the overall constructions list from current_desc + const std::vector &list_constructions = get_constructions(); + for( int i = 0; i < static_cast( list_constructions.size() ); ++i ) { + if( constructs[select] == list_constructions[i].description ) { + ret = i; + break; + } + } + exit = true; + + } } } while( !exit ); @@ -705,6 +690,7 @@ void construction_menu() w_list = catacurses::window(); w_con = catacurses::window(); g->refresh_all(); + return ret; } bool player_can_build( player &p, const inventory &inv, const std::string &desc ) @@ -751,7 +737,7 @@ bool can_construct( const std::string &desc ) return false; } -static bool can_construct( const construction &con, const tripoint &p ) +bool can_construct( const construction &con, const tripoint &p ) { // see if the special pre-function checks out bool place_okay = con.pre_special( p ); @@ -897,11 +883,10 @@ void complete_construction( player *p ) } if( !dump_spots.empty() ) { tripoint dump_spot = random_entry( dump_spots ); - auto items_at = g->m.i_at( terp ); - for( auto it = items_at.rbegin(); it != items_at.rend(); it++ ) { + map_stack items = g->m.i_at( terp ); + for( map_stack::iterator it = items.begin(); it != items.end(); ) { g->m.add_item_or_charges( dump_spot, *it ); - item *item_ptr = &*it; - g->m.i_rem( terp, item_ptr ); + it = items.erase( it ); } } else { debugmsg( "No space to displace items from construction finishing" ); @@ -970,6 +955,11 @@ bool construct::check_deconstruct( const tripoint &p ) return g->m.ter( p.x, p.y ).obj().deconstruct.can_do; } +bool construct::check_empty_up_OK( const tripoint &p ) +{ + return check_empty( p ) && check_up_OK( p ); +} + bool construct::check_up_OK( const tripoint & ) { // You're not going above +OVERMAP_HEIGHT. @@ -1102,7 +1092,7 @@ void construct::done_deconstruct( const tripoint &p ) } else { g->m.furn_set( p, f.deconstruct.furn_set ); } - add_msg( _( "You disassemble the %s." ), f.name() ); + add_msg( _( "The %s is disassembled." ), f.name() ); g->m.spawn_items( p, item_group::items_from( f.deconstruct.drop_group, calendar::turn ) ); // Hack alert. // Signs have cosmetics associated with them on the submap since @@ -1116,6 +1106,14 @@ void construct::done_deconstruct( const tripoint &p ) add_msg( _( "That %s can not be disassembled!" ), t.name() ); return; } + if( t.deconstruct.deconstruct_above ) { + const tripoint top = p + tripoint( 0, 0, 1 ); + if( g->m.has_furn( top ) ) { + add_msg( _( "That %s can not be dissasembled, since there is furniture above it." ), t.name() ); + return; + } + done_deconstruct( top ); + } if( t.id == "t_console_broken" ) { if( g->u.get_skill_level( skill_electronics ) >= 1 ) { g->u.practice( skill_electronics, 20, 4 ); @@ -1127,7 +1125,7 @@ void construct::done_deconstruct( const tripoint &p ) } } g->m.ter_set( p, t.deconstruct.ter_set ); - add_msg( _( "You disassemble the %s." ), t.name() ); + add_msg( _( "The %s is disassembled." ), t.name() ); g->m.spawn_items( p, item_group::items_from( t.deconstruct.drop_group, calendar::turn ) ); } } @@ -1237,6 +1235,12 @@ void construct::done_mine_upstair( const tripoint &p ) tmpmap.save(); } +void construct::done_wood_stairs( const tripoint &p ) +{ + const tripoint top = p + tripoint( 0, 0, 1 ); + g->m.ter_set( top, ter_id( "t_wood_stairs_down" ) ); +} + void construct::done_window_curtains( const tripoint & ) { // copied from iexamine::curtains @@ -1319,7 +1323,7 @@ void load_construction( JsonObject &jo ) con.required_skills[ legacy_skill ] = legacy_diff; } - con.category = jo.get_string( "category", "OTHER" ); + con.category = construction_category_id( jo.get_string( "category", "OTHER" ) ); if( jo.has_int( "time" ) ) { con.time = to_moves( time_duration::from_minutes( jo.get_int( "time" ) ) ); } else if( jo.has_string( "time" ) ) { @@ -1365,6 +1369,7 @@ void load_construction( JsonObject &jo ) { "check_empty", construct::check_empty }, { "check_support", construct::check_support }, { "check_deconstruct", construct::check_deconstruct }, + { "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 } @@ -1379,6 +1384,7 @@ void load_construction( JsonObject &jo ) { "done_dig_stair", construct::done_dig_stair }, { "done_mine_downstair", construct::done_mine_downstair }, { "done_mine_upstair", construct::done_mine_upstair }, + { "done_wood_stairs", construct::done_wood_stairs }, { "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 }, @@ -1522,6 +1528,17 @@ void finalize_constructions() if( con.vehicle_start ) { const_cast( con.requirements.obj() ).get_components().push_back( frame_items ); } + bool is_valid_construction_category = false; + for( const construction_category &cc : construction_categories::get_all() ) { + if( con.category == cc.id ) { + is_valid_construction_category = true; + break; + } + } + if( !is_valid_construction_category ) { + debugmsg( "Invalid construction category (%s) defined for construction (%s)", con.category.str(), + con.description ); + } } constructions.erase( std::remove_if( constructions.begin(), constructions.end(), diff --git a/src/construction.h b/src/construction.h index ca9b210ed3a50..f12e566c0a08d 100644 --- a/src/construction.h +++ b/src/construction.h @@ -10,6 +10,7 @@ #include #include +#include "construction_category.h" #include "item.h" #include "optional.h" #include "string_id.h" @@ -37,7 +38,7 @@ struct build_reqs { struct construction { // Construction type category - std::string category; + construction_category_id category; // How the action is displayed to the player std::string description; // Additional note displayed along with construction requirements. @@ -98,8 +99,10 @@ void standardize_construction_times( int time ); void load_construction( JsonObject &jo ); void reset_constructions(); -void construction_menu(); +int construction_menu( bool blueprint ); void complete_construction( player *p ); +bool can_construct( const construction &con, const tripoint &p ); +bool player_can_build( player &p, const inventory &inv, const construction &con ); void check_constructions(); void finalize_constructions(); diff --git a/src/construction_category.cpp b/src/construction_category.cpp new file mode 100644 index 0000000000000..574c6f257ce3c --- /dev/null +++ b/src/construction_category.cpp @@ -0,0 +1,53 @@ +#include "construction_category.h" + +#include + +#include "debug.h" +#include "generic_factory.h" +#include "json.h" + +namespace +{ + +generic_factory all_construction_categories( "construction categories" ); + +} // namespace + +/** @relates string_id */ +template<> +bool string_id::is_valid() const +{ + return all_construction_categories.is_valid( *this ); +} + +/** @relates string_id */ +template<> +const construction_category &string_id::obj() const +{ + return all_construction_categories.obj( *this ); +} + +void construction_category::load( JsonObject &jo, const std::string & ) +{ + mandatory( jo, was_loaded, "name", name ); +} + +size_t construction_category::count() +{ + return all_construction_categories.size(); +} + +void construction_categories::load( JsonObject &jo, const std::string &src ) +{ + all_construction_categories.load( jo, src ); +} + +void construction_categories::reset() +{ + all_construction_categories.reset(); +} + +const std::vector &construction_categories::get_all() +{ + return all_construction_categories.get_all(); +} diff --git a/src/construction_category.h b/src/construction_category.h new file mode 100644 index 0000000000000..71b5d5a70711e --- /dev/null +++ b/src/construction_category.h @@ -0,0 +1,33 @@ +#pragma once +#ifndef CONSTRUCTION_CATEGORY_H +#define CONSTRUCTION_CATEGORY_H + +#include + +#include "json.h" +#include "type_id.h" + +class JsonObject; + +struct construction_category { + void load( JsonObject &jo, const std::string &src ); + + construction_category_id id; + bool was_loaded = false; + + std::string name; + + static size_t count(); +}; + +namespace construction_categories +{ + +void load( JsonObject &jo, const std::string &src ); +void reset(); + +const std::vector &get_all(); + +} // namespace construction_categories + +#endif diff --git a/src/consumption.cpp b/src/consumption.cpp index 1bc279faaba8a..8c235ab1039f4 100644 --- a/src/consumption.cpp +++ b/src/consumption.cpp @@ -80,7 +80,7 @@ const std::map plut_charges = { { "plut_slurry", PLUTONIUM_CHARGES / 2 } }; -} +} // namespace int player::stomach_capacity() const { @@ -586,7 +586,7 @@ ret_val player::will_eat( const item &food, bool interactive ) co } if( stomach.stomach_remaining() < food.volume() / food.charges && !food.has_infinite_charges() ) { - if( food.has_flag( "USE_EAT_VERB" ) ) { + if( edible ) { add_consequence( _( "You're full already and will be forcing yourself to eat." ), TOO_FULL ); } else { add_consequence( _( "You're full already and will be forcing yourself to drink." ), TOO_FULL ); @@ -1089,7 +1089,7 @@ bool player::consume_effects( item &food ) // Moved here and changed a bit - it was too complex // Incredibly minor stuff like this shouldn't require complexity if( !is_npc() && has_trait( trait_id( "SLIMESPAWNER" ) ) && - ( get_healthy_kcal() < get_stored_kcal() + 4000 || + ( get_healthy_kcal() < get_stored_kcal() + 4000 && get_thirst() - stomach.get_water() / 5_ml < 40 ) ) { add_msg_if_player( m_mixed, _( "You feel as though you're going to split open! In a good way?" ) ); diff --git a/src/crafting.cpp b/src/crafting.cpp index 603327b90d46c..ff59995a97122 100644 --- a/src/crafting.cpp +++ b/src/crafting.cpp @@ -474,14 +474,18 @@ bool player::can_make( const recipe *r, int batch_size ) batch_size ); } -const inventory &player::crafting_inventory() +const inventory &player::crafting_inventory( tripoint src_pos, int radius ) { + tripoint inv_pos = src_pos; + if( src_pos == tripoint_zero ) { + inv_pos = pos(); + } if( cached_moves == moves && cached_time == calendar::turn - && cached_position == pos() ) { + && cached_position == inv_pos ) { return cached_crafting_inventory; } - cached_crafting_inventory.form_from_map( pos(), PICKUP_RANGE, false ); + cached_crafting_inventory.form_from_map( inv_pos, radius, false ); cached_crafting_inventory += inv; cached_crafting_inventory += weapon; cached_crafting_inventory += worn; @@ -500,7 +504,7 @@ const inventory &player::crafting_inventory() cached_moves = moves; cached_time = calendar::turn; - cached_position = pos(); + cached_position = inv_pos; return cached_crafting_inventory; } @@ -636,19 +640,15 @@ static item_location set_item_map_or_vehicle( const player &p, const tripoint &l if( const cata::optional vp = g->m.veh_at( loc ).part_with_feature( "CARGO", false ) ) { - if( vp->vehicle().add_item( vp->part_index(), newit ) ) { - - // Since add succeded, we know that the craft is the last item in the vehicle_stack - auto items_at_part = vp->vehicle().get_items( vp->part_index() ); - item *newit_in_vehicle = &items_at_part[items_at_part.size() - 1]; - + if( const cata::optional it = vp->vehicle().add_item( vp->part_index(), + newit ) ) { p.add_msg_player_or_npc( string_format( pgettext( "item, furniture", "You put the %s on the %s." ), - newit.tname(), vp->part().name() ), + ( *it )->tname(), vp->part().name() ), string_format( pgettext( "item, furniture", " puts the %s on the %s." ), - newit.tname(), vp->part().name() ) ); + ( *it )->tname(), vp->part().name() ) ); - return item_location( vehicle_cursor( vp->vehicle(), vp->part_index() ), newit_in_vehicle ); + return item_location( vehicle_cursor( vp->vehicle(), vp->part_index() ), & **it ); } // Couldn't add the in progress craft to the target part, so drop it to the map. @@ -724,7 +724,7 @@ void player::start_craft( craft_command &command, const tripoint &loc ) if( target == tripoint_zero ) { if( !is_armed() ) { if( cata::optional it_loc = wield_craft( *this, craft ) ) { - craft_in_world = it_loc->clone(); + craft_in_world = *it_loc; } else { // This almost certianly shouldn't happen put_into_vehicle_or_drop( *this, item_drop_reason::tumbling, {craft} ); @@ -753,7 +753,7 @@ void player::start_craft( craft_command &command, const tripoint &loc ) switch( choice ) { case WIELD_CRAFT: { if( cata::optional it_loc = wield_craft( *this, craft ) ) { - craft_in_world = it_loc->clone(); + craft_in_world = *it_loc; } else { // This almost certianly shouldn't happen put_into_vehicle_or_drop( *this, item_drop_reason::tumbling, {craft} ); @@ -785,7 +785,7 @@ void player::start_craft( craft_command &command, const tripoint &loc ) } assign_activity( activity_id( "ACT_CRAFT" ) ); - activity.targets.push_back( craft_in_world.clone() ); + activity.targets.push_back( craft_in_world ); activity.values.push_back( command.is_long() ); add_msg_player_or_npc( @@ -1660,25 +1660,17 @@ ret_val player::can_disassemble( const item &obj, const inventory &inv ) c bool player::disassemble() { - auto loc = game_menus::inv::disassemble( *this ); + return disassemble( game_menus::inv::disassemble( *this ), false ); +} - if( !loc ) { +bool player::disassemble( item_location target, bool interactive ) +{ + if( !target ) { add_msg( _( "Never mind." ) ); return false; } - loc.set_should_stack( false ); - - return disassemble( loc.obtain( *this ) ); -} - -bool player::disassemble( int dis_pos ) -{ - return disassemble( i_at( dis_pos ), dis_pos, false ); -} - -bool player::disassemble( item &obj, int pos, bool ground, bool interactive ) -{ + const item &obj = *target; const auto ret = can_disassemble( obj, crafting_inventory() ); if( !ret.success() ) { @@ -1717,8 +1709,9 @@ bool player::disassemble( item &obj, int pos, bool ground, bool interactive ) activity.moves_left = r.time; } - activity.values.push_back( pos ); - activity.coords.push_back( ground ? this->pos() : tripoint_min ); + // index is used as a bool that indicates if we want recursive uncraft. + activity.index = false; + activity.targets.emplace_back( std::move( target ) ); activity.str_values.push_back( r.result() ); return true; @@ -1728,101 +1721,68 @@ void player::disassemble_all( bool one_pass ) { // Reset all the activity values assign_activity( activity_id( "ACT_DISASSEMBLE" ), 0 ); - auto items = g->m.i_at( pos() ); + bool found_any = false; - if( !one_pass ) { - // Kinda hacky - // That INT_MIN notes we want infinite uncraft - // If INT_MIN is reached in complete_disassemble, - // we will call this function again. - activity.values.push_back( INT_MIN ); - activity.str_values.push_back( "" ); - activity.coords.push_back( tripoint_min ); - } - - for( size_t i = 0; i < items.size(); i++ ) { - if( disassemble( items[i], i, true, false ) ) { + for( item &it : g->m.i_at( pos() ) ) { + if( disassemble( item_location( map_cursor( pos() ), &it ), false ) ) { found_any = true; } } + // index is used as a bool that indicates if we want recursive uncraft. + // Upon calling complete_disassemble, if we have no targets left, + // we will call this function again. + activity.index = !one_pass; + if( !found_any ) { // Reset the activity - don't loop if there is nothing to do activity = player_activity(); } } -static item &get_item_for_uncraft( player &p, int item_pos, - const tripoint &loc, bool from_ground ) -{ - item *org_item; - if( from_ground ) { - auto items_on_ground = g->m.i_at( loc ); - if( static_cast( item_pos ) >= items_on_ground.size() ) { - return null_item_reference(); - } - org_item = &items_on_ground[item_pos]; - } else { - org_item = &p.i_at( item_pos ); - } - - return *org_item; -} - void player::complete_disassemble() { - // Clean up old settings - // Warning: Breaks old saves with disassembly in progress! - // But so would adding a new recipe... - if( activity.values.empty() || - activity.values.size() != activity.str_values.size() || - activity.values.size() != activity.coords.size() ) { + // Cancel the activity if we have bad (possibly legacy) values + if( activity.targets.empty() || !activity.targets.back() || + activity.targets.size() != activity.str_values.size() ) { debugmsg( "bad disassembly activity values" ); activity.set_to_null(); return; } - // Disassembly activity is now saved in 3 parallel vectors: - // item position, tripoint location (tripoint_min for inventory) and recipe - - // Note: we're reading from the back (in inverse order) - // This is to avoid having to maintain indices - const int item_pos = activity.values.back(); - const tripoint loc = activity.coords.back(); - const auto recipe_name = activity.str_values.back(); - - activity.values.pop_back(); - activity.str_values.pop_back(); - activity.coords.pop_back(); + // Disassembly has 2 parallel vectors: + // item location, and recipe id + const recipe &rec = recipe_dictionary::get_uncraft( activity.str_values.back() ); - if( item_pos == INT_MIN ) { - disassemble_all( false ); + if( rec ) { + complete_disassemble( activity.targets.back(), rec ); + } else { + debugmsg( "bad disassembly recipe: %d", activity.str_values.back() ); + activity.set_to_null(); return; } - const bool from_ground = loc != tripoint_min; - - complete_disassemble( item_pos, loc, from_ground, recipe_dictionary::get_uncraft( recipe_name ) ); - - if( !activity ) { - // Something above went wrong, don't continue - return; - } + activity.targets.pop_back(); + activity.str_values.pop_back(); - // Try to get another disassembly target from the activity - if( activity.values.empty() ) { - // No more targets - activity.set_to_null(); - return; + // If we have no more targets end the activity or start a second round + if( activity.targets.empty() ) { + // index is used as a bool that indicates if we want recursive uncraft. + if( activity.index ) { + disassemble_all( false ); + return; + } else { + // No more targets + activity.set_to_null(); + return; + } } - if( activity.values.back() == INT_MIN ) { - disassemble_all( false ); - return; - } + // Set get and set duration of next uncraft + const recipe &next_recipe = recipe_dictionary::get_uncraft( activity.str_values.back() ); - const auto &next_recipe = recipe_dictionary::get_uncraft( activity.str_values.back() ); if( !next_recipe ) { + debugmsg( "bad disassembly recipe: %d", activity.str_values.back() ); activity.set_to_null(); return; } @@ -1830,24 +1790,14 @@ void player::complete_disassemble() activity.moves_left = next_recipe.time; } -void player::complete_disassemble( int item_pos, const tripoint &loc, - bool from_ground, const recipe &dis ) +void player::complete_disassemble( item_location &target, const recipe &dis ) { // Get the proper recipe - the one for disassembly, not assembly const auto dis_requirements = dis.disassembly_requirements(); - item &org_item = get_item_for_uncraft( *this, item_pos, loc, from_ground ); - bool filthy = org_item.is_filthy(); - if( org_item.is_null() ) { - add_msg( _( "The item has vanished." ) ); - activity.set_to_null(); - return; - } + item &org_item = *target; + const bool filthy = org_item.is_filthy(); + const tripoint loc = target.position(); - if( org_item.typeId() != dis.result() ) { - add_msg( _( "The item might be gone, at least it is not at the expected position anymore." ) ); - activity.set_to_null(); - return; - } // Make a copy to keep its data (damage/components) even after it // has been removed. item dis_item = org_item; @@ -1865,11 +1815,7 @@ void player::complete_disassemble( int item_pos, const tripoint &loc, } // remove the item, except when it's counted by charges and still has some if( !org_item.count_by_charges() || org_item.charges <= 0 ) { - if( from_ground ) { - g->m.i_rem( loc, item_pos ); - } else { - i_rem( item_pos ); - } + target.remove_item(); } // Consume tool charges @@ -2051,7 +1997,7 @@ void remove_ammo( item &dis_item, player &p ) if( dis_item.is_tool() && dis_item.charges > 0 && dis_item.ammo_current() != "null" ) { item ammodrop( dis_item.ammo_current(), calendar::turn ); ammodrop.charges = dis_item.charges; - if( dis_item.ammo_current() == "plutonium" ) { + if( dis_item.ammo_current() == "plut_cell" ) { ammodrop.charges /= PLUTONIUM_CHARGES; } drop_or_handle( ammodrop, p ); diff --git a/src/crafting_gui.cpp b/src/crafting_gui.cpp index 273a5a3c34335..b06108ba1bab4 100644 --- a/src/crafting_gui.cpp +++ b/src/crafting_gui.cpp @@ -355,19 +355,19 @@ const recipe *select_crafting_recipe( int &batch_size ) } else if( subtab.cur() == "CSC_*_RECENT" ) { picking = available_recipes.recent(); } else if( subtab.cur() == "CSC_*_HIDDEN" ) { - picking.insert( picking.end(), available_recipes.begin(), available_recipes.end() ); + current = available_recipes.hidden(); show_hidden = true; } else { picking = available_recipes.in_category( tab.cur(), subtab.cur() != "CSC_ALL" ? subtab.cur() : "" ); } - current.clear(); - for( auto i : picking ) { - if( ( uistate.hidden_recipes.find( i->ident() ) != uistate.hidden_recipes.end() ) == show_hidden ) { - current.push_back( i ); - } - } if( !show_hidden ) { + current.clear(); + for( auto i : picking ) { + if( uistate.hidden_recipes.find( i->ident() ) == uistate.hidden_recipes.end() ) { + current.push_back( i ); + } + } draw_hidden_amount( w_head, 0, picking.size() - current.size() ); } diff --git a/src/creature.cpp b/src/creature.cpp index 190f05a594d37..e181d5c37338f 100644 --- a/src/creature.cpp +++ b/src/creature.cpp @@ -969,13 +969,13 @@ void Creature::add_effect( const efftype_id &eff_id, const time_duration dur, bo } ( *effects )[eff_id][bp] = e; if( is_player() ) { - // Only print the message if we didn't already have it if( !type.get_apply_message().empty() ) { - add_msg( type.gain_game_message_type(), - _( type.get_apply_message() ) ); + add_msg( type.gain_game_message_type(), _( type.get_apply_message() ) ); + } + if( !type.get_apply_memorial_log().empty() ) { + add_memorial_log( pgettext( "memorial_male", type.get_apply_memorial_log().c_str() ), + pgettext( "memorial_female", type.get_apply_memorial_log().c_str() ) ); } - add_memorial_log( pgettext( "memorial_male", type.get_apply_memorial_log().c_str() ), - pgettext( "memorial_female", type.get_apply_memorial_log().c_str() ) ); } on_effect_int_change( eff_id, e.get_intensity(), bp ); // Perform any effect addition effects. @@ -1020,13 +1020,13 @@ bool Creature::remove_effect( const efftype_id &eff_id, body_part bp ) const effect_type &type = eff_id.obj(); if( is_player() ) { - // Print the removal message and add the memorial log if needed if( !type.get_remove_message().empty() ) { - add_msg( type.lose_game_message_type(), - _( type.get_remove_message() ) ); + add_msg( type.lose_game_message_type(), _( type.get_remove_message() ) ); + } + if( !type.get_remove_memorial_log().empty() ) { + add_memorial_log( pgettext( "memorial_male", type.get_remove_memorial_log().c_str() ), + pgettext( "memorial_female", type.get_remove_memorial_log().c_str() ) ); } - add_memorial_log( pgettext( "memorial_male", type.get_remove_memorial_log().c_str() ), - pgettext( "memorial_female", type.get_remove_memorial_log().c_str() ) ); } // num_bp means remove all of a given effect id diff --git a/src/creature.h b/src/creature.h index 6949b97b57158..5ae96b78e72df 100644 --- a/src/creature.h +++ b/src/creature.h @@ -15,6 +15,8 @@ #include "string_formatter.h" #include "type_id.h" #include "units.h" +#include "debug.h" +#include "enums.h" enum game_message_type : int; class nc_color; @@ -266,7 +268,7 @@ class Creature /** Returns true if the given field entry is dangerous to us. */ bool is_dangerous_field( const field_entry &entry ) const; /** Returns true if we are immune to the field type with the given fid. Does not - * handle density, so this function should only be called through is_dangerous_field(). + * handle intensity, so this function should only be called through is_dangerous_field(). */ virtual bool is_immune_field( const field_id ) const { return false; @@ -505,11 +507,17 @@ class Creature template void add_msg_if_player( const game_message_type type, const char *const msg, Args &&... args ) const { + if( type == m_debug && !debug_mode ) { + return; + } return add_msg_if_player( type, string_format( msg, std::forward( args )... ) ); } template void add_msg_if_player( const game_message_type type, const std::string &msg, Args &&... args ) const { + if( type == m_debug && !debug_mode ) { + return; + } return add_msg_if_player( type, string_format( msg, std::forward( args )... ) ); } @@ -526,10 +534,16 @@ class Creature virtual void add_msg_if_npc( game_message_type /*type*/, const std::string &/*msg*/ ) const {} template void add_msg_if_npc( const game_message_type type, const char *const msg, Args &&... args ) const { + if( type == m_debug && !debug_mode ) { + return; + } return add_msg_if_npc( type, string_format( msg, std::forward( args )... ) ); } template void add_msg_if_npc( const game_message_type type, const std::string &msg, Args &&... args ) const { + if( type == m_debug && !debug_mode ) { + return; + } return add_msg_if_npc( type, string_format( msg, std::forward( args )... ) ); } @@ -553,12 +567,18 @@ class Creature template void add_msg_player_or_npc( const game_message_type type, const char *const player_msg, const char *const npc_msg, Args &&... args ) const { + if( type == m_debug && !debug_mode ) { + return; + } return add_msg_player_or_npc( type, string_format( player_msg, std::forward( args )... ), string_format( npc_msg, std::forward( args )... ) ); } template void add_msg_player_or_npc( const game_message_type type, const std::string &player_msg, const std::string &npc_msg, Args &&... args ) const { + if( type == m_debug && !debug_mode ) { + return; + } return add_msg_player_or_npc( type, string_format( player_msg, std::forward( args )... ), string_format( npc_msg, std::forward( args )... ) ); } @@ -583,12 +603,18 @@ class Creature template void add_msg_player_or_say( const game_message_type type, const char *const player_msg, const char *const npc_speech, Args &&... args ) const { + if( type == m_debug && !debug_mode ) { + return; + } return add_msg_player_or_say( type, string_format( player_msg, std::forward( args )... ), string_format( npc_speech, std::forward( args )... ) ); } template void add_msg_player_or_say( const game_message_type type, const std::string &player_msg, const std::string &npc_speech, Args &&... args ) const { + if( type == m_debug && !debug_mode ) { + return; + } return add_msg_player_or_say( type, string_format( player_msg, std::forward( args )... ), string_format( npc_speech, std::forward( args )... ) ); } diff --git a/src/debug.cpp b/src/debug.cpp index f1027b31e4778..bb34d3b4da6a4 100644 --- a/src/debug.cpp +++ b/src/debug.cpp @@ -95,7 +95,7 @@ namespace std::set ignored_messages; -} +} // namespace void realDebugmsg( const char *filename, const char *line, const char *funcname, const std::string &text ) diff --git a/src/debug.h b/src/debug.h index f2d012028ce0e..68a07b933fdcc 100644 --- a/src/debug.h +++ b/src/debug.h @@ -105,7 +105,7 @@ std::string mods_loaded(); /** Generate a game report, including the information returned by all of the other functions. */ std::string game_report(); -} +} // namespace game_info // Enumerations {{{1 // --------------------------------------------------------------------- diff --git a/src/debug_menu.cpp b/src/debug_menu.cpp index 483e5bb55cf7b..b26bf1def4498 100644 --- a/src/debug_menu.cpp +++ b/src/debug_menu.cpp @@ -20,6 +20,7 @@ #include "coordinate_conversions.h" #include "filesystem.h" #include "game.h" +#include "map_extras.h" #include "messages.h" #include "mission.h" #include "morale_types.h" @@ -58,7 +59,6 @@ #include "item.h" #include "sounds.h" #include "trait_group.h" -#include "map_extras.h" #include "artifact.h" #include "vpart_position.h" #include "rng.h" @@ -403,8 +403,8 @@ void character_edit_menu() enum { D_NAME, D_SKILLS, D_STATS, D_ITEMS, D_DELETE_ITEMS, D_ITEM_WORN, - D_HP, D_MORALE, D_PAIN, D_NEEDS, D_HEALTHY, D_STATUS, D_MISSION_ADD, D_MISSION_EDIT, - D_TELE, D_MUTATE, D_CLASS, D_ATTITUDE + D_HP, D_STAMINA, D_MORALE, D_PAIN, D_NEEDS, D_HEALTHY, D_STATUS, D_MISSION_ADD, D_MISSION_EDIT, + D_TELE, D_MUTATE, D_CLASS, D_ATTITUDE, D_OPINION }; nmenu.addentry( D_NAME, true, 'N', "%s", _( "Edit [N]ame" ) ); nmenu.addentry( D_SKILLS, true, 's', "%s", _( "Edit [s]kills" ) ); @@ -414,6 +414,7 @@ void character_edit_menu() nmenu.addentry( D_ITEM_WORN, true, 'w', "%s", _( "[w]ear/[w]ield an item from player's inventory" ) ); nmenu.addentry( D_HP, true, 'h', "%s", _( "Set [h]it points" ) ); + nmenu.addentry( D_STAMINA, true, 'S', "%s", _( "Set [S]tamina" ) ); nmenu.addentry( D_MORALE, true, 'o', "%s", _( "Set m[o]rale" ) ); nmenu.addentry( D_PAIN, true, 'p', "%s", _( "Cause [p]ain" ) ); nmenu.addentry( D_HEALTHY, true, 'a', "%s", _( "Set he[a]lth" ) ); @@ -426,6 +427,7 @@ void character_edit_menu() nmenu.addentry( D_MISSION_ADD, true, 'm', "%s", _( "Add [m]ission" ) ); nmenu.addentry( D_CLASS, true, 'c', "%s", _( "Randomize with [c]lass" ) ); nmenu.addentry( D_ATTITUDE, true, 'A', "%s", _( "Set [A]ttitude" ) ); + nmenu.addentry( D_OPINION, true, 'O', "%s", _( "Set [O]pinion" ) ); } nmenu.query(); switch( nmenu.ret ) { @@ -533,6 +535,17 @@ void character_edit_menu() } } break; + case D_STAMINA: + int value; + if( query_int( value, _( "Set stamina to? Current: %d. Max: %d." ), p.stamina, + p.get_stamina_max() ) ) { + if( value > 0 && value <= p.get_stamina_max() ) { + p.stamina = value; + } else { + add_msg( m_bad, _( "Target stamina value out of bounds!" ) ); + } + } + break; case D_MORALE: { int current_morale_level = p.get_morale_level(); int value; @@ -543,6 +556,48 @@ void character_edit_menu() } } break; + case D_OPINION: { + uilist smenu; + smenu.addentry( 0, true, 'h', "%s: %d", _( "trust" ), np->op_of_u.trust ); + smenu.addentry( 1, true, 's', "%s: %d", _( "fear" ), np->op_of_u.fear ); + smenu.addentry( 2, true, 't', "%s: %d", _( "value" ), np->op_of_u.value ); + smenu.addentry( 3, true, 'f', "%s: %d", _( "anger" ), np->op_of_u.anger ); + smenu.addentry( 4, true, 'd', "%s: %d", _( "owed" ), np->op_of_u.owed ); + + smenu.query(); + int value; + switch( smenu.ret ) { + case 0: + if( query_int( value, _( "Set trust to? Currently: %d" ), + np->op_of_u.trust ) ) { + np->op_of_u.trust = value; + } + break; + case 1: + if( query_int( value, _( "Set fear to? Currently: %d" ), np->op_of_u.fear ) ) { + np->op_of_u.fear = value; + } + break; + case 2: + if( query_int( value, _( "Set value to? Currently: %d" ), + np->op_of_u.value ) ) { + np->op_of_u.value = value; + } + break; + case 3: + if( query_int( value, _( "Set anger to? Currently: %d" ), + np->op_of_u.anger ) ) { + np->op_of_u.anger = value; + } + break; + case 4: + if( query_int( value, _( "Set owed to? Currently: %d" ), np->op_of_u.owed ) ) { + np->op_of_u.owed = value; + } + break; + } + } + break; case D_NAME: { std::string filterstring = p.name; string_input_popup popup; @@ -915,7 +970,7 @@ void draw_benchmark( const int max_difference ) // call the draw procedure as many times as possible in max_difference milliseconds auto start_tick = std::chrono::steady_clock::now(); auto end_tick = std::chrono::steady_clock::now(); - long difference = 0; + int64_t difference = 0; int draw_counter = 0; while( true ) { end_tick = std::chrono::steady_clock::now(); @@ -1386,7 +1441,7 @@ void debug() raise( SIGSEGV ); break; case DEBUG_MAP_EXTRA: { - std::unordered_map FM = MapExtras::all_functions(); + std::unordered_map FM = MapExtras::all_functions(); uilist mx_menu; std::vector mx_str; for( auto &extra : FM ) { @@ -1396,14 +1451,11 @@ void debug() mx_menu.query(); int mx_choice = mx_menu.ret; if( mx_choice >= 0 && mx_choice < static_cast( mx_str.size() ) ) { - auto func = MapExtras::get_function( mx_str[mx_choice] ); - if( func != nullptr ) { - const tripoint where( ui::omap::choose_point() ); - if( where != overmap::invalid_tripoint ) { - tinymap mx_map; - mx_map.load( where.x * 2, where.y * 2, where.z, false ); - func( mx_map, where ); - } + const tripoint where( ui::omap::choose_point() ); + if( where != overmap::invalid_tripoint ) { + tinymap mx_map; + mx_map.load( where.x * 2, where.y * 2, where.z, false ); + MapExtras::apply_function( mx_str[mx_choice], mx_map, where ); } } break; @@ -1525,4 +1577,4 @@ void debug() g->refresh_all(); } -} +} // namespace debug_menu diff --git a/src/debug_menu.h b/src/debug_menu.h index 883978f2bd7d5..cf01b8283094a 100644 --- a/src/debug_menu.h +++ b/src/debug_menu.h @@ -29,6 +29,6 @@ void draw_benchmark( const int max_difference ); void debug(); -} +} // namespace debug_menu #endif // DEBUG_MENU_H diff --git a/src/defense.cpp b/src/defense.cpp index 38ecd4c1f0b5f..d45cebb78a0f8 100644 --- a/src/defense.cpp +++ b/src/defense.cpp @@ -59,7 +59,7 @@ int caravan_price( player &u, int price ); void draw_caravan_borders( const catacurses::window &w, int current_window ); void draw_caravan_categories( const catacurses::window &w, int category_selected, - signed total_price, signed long cash ); + int total_price, int cash ); void draw_caravan_items( const catacurses::window &w, std::vector *items, std::vector *counts, int offset, int item_selected ); @@ -1107,7 +1107,7 @@ Press %s to buy everything in your cart, %s to buy nothing." ), "Buy %d items, leaving you with %s?", items[0].size() ), items[0].size(), - format_money( static_cast( g->u.cash ) - static_cast( total_price ) ) ) ) ) { + format_money( static_cast( g->u.cash ) - static_cast( total_price ) ) ) ) ) { done = true; } if( !done ) { // We canceled, so redraw everything @@ -1280,7 +1280,7 @@ void draw_caravan_borders( const catacurses::window &w, int current_window ) } void draw_caravan_categories( const catacurses::window &w, int category_selected, - signed total_price, signed long cash ) + int total_price, int cash ) { // Clear the window for( int i = 1; i <= 10; i++ ) { @@ -1289,7 +1289,7 @@ void draw_caravan_categories( const catacurses::window &w, int category_selected mvwprintz( w, 1, 1, c_white, _( "Your Cash: %s" ), format_money( cash ) ); wprintz( w, c_light_gray, " -> " ); wprintz( w, ( total_price > cash ? c_red : c_green ), "%s", - format_money( static_cast( cash ) - static_cast( total_price ) ) ); + format_money( static_cast( cash ) - static_cast( total_price ) ) ); for( int i = 0; i < NUM_CARAVAN_CATEGORIES; i++ ) { mvwprintz( w, i + 3, 1, ( i == category_selected ? h_white : c_white ), @@ -1324,8 +1324,8 @@ void draw_caravan_items( const catacurses::window &w, std::vector *ite item::nname( ( *items )[i], ( *counts )[i] ) ); wprintz( w, c_white, " x %2d", ( *counts )[i] ); if( ( *counts )[i] > 0 ) { - signed long price = caravan_price( g->u, item( ( *items )[i], - 0 ).price( false ) * ( *counts )[i] ); + int price = caravan_price( g->u, item( ( *items )[i], + 0 ).price( false ) * ( *counts )[i] ); wprintz( w, ( price > g->u.cash ? c_red : c_green ), " (%s)", format_money( price ) ); } } diff --git a/src/dialogue.h b/src/dialogue.h index 98a4ef7ea685a..b40c4e3cc1f75 100644 --- a/src/dialogue.h +++ b/src/dialogue.h @@ -357,12 +357,13 @@ const std::unordered_set complex_conds = { { "u_has_items", "npc_has_items", "u_has_item_category", "npc_has_item_category", "u_has_bionics", "npc_has_bionics", "u_has_effect", "npc_has_effect", "u_need", "npc_need", "u_at_om_location", "npc_at_om_location", "npc_role_nearby", "npc_allies", "npc_service", - "u_has_cash", "npc_aim_rule", "npc_engagement_rule", "npc_rule", "npc_override", + "u_has_cash", "u_are_owed", + "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" } }; -} +} // namespace dialogue_data // the truly awful declaration for the conditional_t loading helper_function void read_dialogue_condition( JsonObject &jo, std::function &condition, @@ -405,8 +406,8 @@ struct conditional_t { void set_at_om_location( JsonObject &jo, const std::string &member, bool is_npc = false ); void set_npc_role_nearby( JsonObject &jo ); void set_npc_allies( JsonObject &jo ); - void set_npc_service( JsonObject &jo ); void set_u_has_cash( JsonObject &jo ); + void set_u_are_owed( JsonObject &jo ); void set_npc_aim_rule( JsonObject &jo ); void set_npc_engagement_rule( JsonObject &jo ); void set_npc_cbm_reserve_rule( JsonObject &jo ); diff --git a/src/editmap.cpp b/src/editmap.cpp index 8f6d1a7333e66..8827fb6488c00 100644 --- a/src/editmap.cpp +++ b/src/editmap.cpp @@ -196,7 +196,7 @@ editmap::editmap() cur_field = 0; cur_trap = tr_null; sel_field = -1; - sel_fdensity = -1; + sel_field_intensity = -1; sel_trap = undefined_trap_id; fsel = undefined_furn_id; @@ -648,7 +648,7 @@ void editmap::update_view( bool update_info ) for( auto &fld : *cur_field ) { const field_entry &cur = fld.second; mvwprintz( w_info, off, 1, cur.color(), - _( "field: %s (%d) density %d age %d" ), + _( "field: %s (%d) intensity %d age %d" ), cur.name(), cur.get_field_type(), cur.get_field_intensity(), to_turns( cur.get_field_age() ) ); @@ -673,7 +673,7 @@ void editmap::update_view( bool update_info ) const int target_stack_size = target_stack.size(); if( !g->m.has_flag( "CONTAINER", target ) && target_stack_size > 0 ) { trim_and_print( w_info, off, 1, getmaxx( w_info ), c_light_gray, _( "There is a %s there." ), - target_stack.front().tname() ); + target_stack.begin()->tname() ); off++; if( target_stack_size > 1 ) { mvwprintw( w_info, off, 1, ngettext( "There is %d other item there as well.", @@ -1059,18 +1059,18 @@ int editmap::edit_ter() void editmap::update_fmenu_entry( uilist &fmenu, field &field, const field_id idx ) { - int fdens = 1; + int fintensity = 1; const field_t &ftype = all_field_types_enum_list[idx]; field_entry *fld = field.find_field( idx ); if( fld != nullptr ) { - fdens = fld->get_field_intensity(); + fintensity = fld->get_field_intensity(); } - fmenu.entries[idx].txt = ftype.name( fdens - 1 ); + fmenu.entries[idx].txt = ftype.name( fintensity - 1 ); if( fld != nullptr ) { - fmenu.entries[idx].txt += " " + std::string( fdens, '*' ); + fmenu.entries[idx].txt += " " + std::string( fintensity, '*' ); } fmenu.entries[idx].text_color = ( fld != nullptr ? c_cyan : fmenu.text_color ); - fmenu.entries[idx].extratxt.color = ftype.color[fdens - 1]; + fmenu.entries[idx].extratxt.color = ftype.color[fintensity - 1]; } void editmap::setup_fmenu( uilist &fmenu ) @@ -1079,8 +1079,8 @@ void editmap::setup_fmenu( uilist &fmenu ) for( int i = 0; i < num_fields; i++ ) { const field_id fid = static_cast( i ); const field_t &ftype = all_field_types_enum_list[fid]; - int fdens = 1; - std::string fname = ftype.name( fdens - 1 ); + int fintensity = 1; + std::string fname = ftype.name( fintensity - 1 ); fmenu.addentry( fid, true, -2, fname ); fmenu.entries[fid].extratxt.left = 1; fmenu.entries[fid].extratxt.txt = string_format( "%c", ftype.sym ); @@ -1104,7 +1104,7 @@ int editmap::edit_fld() do { uphelp( pgettext( "Map editor: Field effects shortkeys", - "[s/tab] shape select, [m]ove, [<,>] density" ), + "[s/tab] shape select, [m]ove, [<,>] intensity" ), pgettext( "Map editor: Field effects shortkeys", "[enter] edit, [q]uit, [v] showall" ), pgettext( "Map editor: Editing field effects", "Field effects" ) ); @@ -1112,13 +1112,13 @@ int editmap::edit_fld() if( fmenu.selected > 0 && fmenu.selected < num_fields && ( fmenu.ret > 0 || fmenu.keypress == KEY_LEFT || fmenu.keypress == KEY_RIGHT ) ) { - int fdens = 0; + int fintensity = 0; const field_id idx = static_cast( fmenu.selected ); field_entry *fld = cur_field->find_field( idx ); if( fld != nullptr ) { - fdens = fld->get_field_intensity(); + fintensity = fld->get_field_intensity(); } - int fsel_dens = fdens; + int fsel_intensity = fintensity; if( fmenu.ret > 0 ) { uilist femenu; femenu.w_width = width; @@ -1127,49 +1127,49 @@ int editmap::edit_fld() femenu.w_x = offsetX; const field_t &ftype = all_field_types_enum_list[idx]; - femenu.text = ftype.name( fdens == 0 ? 0 : fdens - 1 ); + femenu.text = ftype.name( fintensity == 0 ? 0 : fintensity - 1 ); femenu.addentry( pgettext( "map editor: used to describe a clean field (e.g. without blood)", "-clear-" ) ); femenu.addentry( string_format( "1: %s", ftype.name( 0 ) ) ); femenu.addentry( string_format( "2: %s", ftype.name( 1 ) ) ); femenu.addentry( string_format( "3: %s", ftype.name( 2 ) ) ); - femenu.entries[fdens].text_color = c_cyan; - femenu.selected = ( sel_fdensity > 0 ? sel_fdensity : fdens ); + femenu.entries[fintensity].text_color = c_cyan; + femenu.selected = ( sel_field_intensity > 0 ? sel_field_intensity : fintensity ); femenu.query(); if( femenu.ret >= 0 ) { - fsel_dens = femenu.ret; + fsel_intensity = femenu.ret; } - } else if( fmenu.keypress == KEY_RIGHT && fdens < 3 ) { - fsel_dens++; - } else if( fmenu.keypress == KEY_LEFT && fdens > 0 ) { - fsel_dens--; + } else if( fmenu.keypress == KEY_RIGHT && fintensity < 3 ) { + fsel_intensity++; + } else if( fmenu.keypress == KEY_LEFT && fintensity > 0 ) { + fsel_intensity--; } - if( fdens != fsel_dens || target_list.size() > 1 ) { + if( fintensity != fsel_intensity || target_list.size() > 1 ) { for( auto &elem : target_list ) { const auto fid = static_cast( idx ); field &t_field = g->m.get_field( elem ); field_entry *t_fld = t_field.find_field( fid ); - int t_dens = 0; + int t_intensity = 0; if( t_fld != nullptr ) { - t_dens = t_fld->get_field_intensity(); + t_intensity = t_fld->get_field_intensity(); } - if( fsel_dens != 0 ) { - if( t_dens != 0 ) { - g->m.set_field_strength( elem, fid, fsel_dens ); + if( fsel_intensity != 0 ) { + if( t_intensity != 0 ) { + g->m.set_field_intensity( elem, fid, fsel_intensity ); } else { - g->m.add_field( elem, fid, fsel_dens ); + g->m.add_field( elem, fid, fsel_intensity ); } } else { - if( t_dens != 0 ) { + if( t_intensity != 0 ) { g->m.remove_field( elem, fid ); } } } update_fmenu_entry( fmenu, *cur_field, idx ); sel_field = fmenu.selected; - sel_fdensity = fsel_dens; + sel_field_intensity = fsel_intensity; } update_view( true ); } else if( fmenu.ret == 0 ) { @@ -1185,7 +1185,7 @@ int editmap::edit_fld() } update_view( true ); sel_field = fmenu.selected; - sel_fdensity = 0; + sel_field_intensity = 0; } else if( fmenu.keypress == 's' || fmenu.keypress == '\t' || fmenu.keypress == 'm' ) { int sel_tmp = fmenu.selected; int ret = select_shape( editshape, ( fmenu.keypress == 'm' ? 1 : 0 ) ); @@ -1315,7 +1315,7 @@ int editmap::edit_itm() do { ilmenu.query(); if( ilmenu.ret >= 0 && ilmenu.ret < static_cast( items.size() ) ) { - item &it = items[ilmenu.ret]; + item &it = *items.get_iterator_from_index( ilmenu.ret ); uilist imenu; imenu.w_x = ilmenu.w_x; imenu.w_y = ilmenu.w_height; diff --git a/src/editmap.h b/src/editmap.h index f81b188d6285a..34d98415c944c 100644 --- a/src/editmap.h +++ b/src/editmap.h @@ -94,7 +94,7 @@ class editmap trap_id cur_trap; int sel_field; - int sel_fdensity; + int sel_field_intensity; trap_id sel_trap; diff --git a/src/effect.cpp b/src/effect.cpp index 091f53fca5b0f..b34b4a873b56c 100644 --- a/src/effect.cpp +++ b/src/effect.cpp @@ -19,7 +19,7 @@ namespace { std::map effect_types; -} +} // namespace /** @relates string_id */ template<> @@ -687,22 +687,21 @@ std::string effect::disp_short_desc( bool reduced ) const void effect::decay( std::vector &rem_ids, std::vector &rem_bps, const time_point &time, const bool player ) { - // Decay duration if not permanent - if( !is_permanent() ) { - mod_duration( -1_turns, player ); - } - // Decay intensity if supposed to do so // TODO: Remove effects that would decay to 0 intensity? if( intensity > 1 && eff_type->int_decay_tick != 0 && - to_turn( time ) % eff_type->int_decay_tick == 0 ) { + to_turn( time ) % eff_type->int_decay_tick == 0 && + get_max_duration() > get_duration() ) { set_intensity( intensity + eff_type->int_decay_step, player ); } // Add to removal list if duration is <= 0 + // Decay duration if not permanent if( duration <= 0_turns ) { rem_ids.push_back( get_id() ); rem_bps.push_back( bp ); + } else if( !is_permanent() ) { + mod_duration( -1_turns, player ); } } diff --git a/src/emit.cpp b/src/emit.cpp index f372b73fdb7e3..11277d3540d5d 100644 --- a/src/emit.cpp +++ b/src/emit.cpp @@ -47,7 +47,7 @@ void emit::load_emit( JsonObject &jo ) et.id_ = emit_id( jo.get_string( "id" ) ); et.field_name = jo.get_string( "field" ); - jo.read( "density", et.density_ ); + jo.read( "intensity", et.intensity_ ); jo.read( "qty", et.qty_ ); jo.read( "chance", et.chance_ ); @@ -64,15 +64,15 @@ void emit::check_consistency() for( auto &e : emits_all ) { e.second.field_ = field_from_ident( e.second.field_name ); - if( e.second.density_ > MAX_FIELD_DENSITY || e.second.density_ < 1 ) { - debugmsg( "emission density of %s out of range", e.second.id_.c_str() ); - e.second.density_ = std::max( std::min( e.second.density_, MAX_FIELD_DENSITY ), 1 ); + if( e.second.intensity_ > MAX_FIELD_INTENSITY || e.second.intensity_ < 1 ) { + debugmsg( "emission intensity of %s out of range", e.second.id_.c_str() ); + e.second.intensity_ = std::max( std::min( e.second.intensity_, MAX_FIELD_INTENSITY ), 1 ); } if( e.second.qty_ <= 0 ) { debugmsg( "emission qty of %s out of range", e.second.id_.c_str() ); } if( e.second.chance_ > 100 || e.second.chance_ <= 0 ) { - e.second.density_ = std::max( std::min( e.second.chance_, 100 ), 1 ); + e.second.intensity_ = std::max( std::min( e.second.chance_, 100 ), 1 ); debugmsg( "emission chance of %s out of range", e.second.id_.c_str() ); } } diff --git a/src/emit.h b/src/emit.h index d9b83bac25a3f..3942d173d2043 100644 --- a/src/emit.h +++ b/src/emit.h @@ -32,9 +32,9 @@ class emit return field_; } - /** Density of output fields, range [1..MAX_FIELD_DENSITY] */ - int density() const { - return density_; + /** Intensity of output fields, range [1..MAX_FIELD_INTENSITY] */ + int intensity() const { + return intensity_; } /** Units of field to generate per turn subject to @ref chance */ @@ -62,7 +62,7 @@ class emit private: emit_id id_; field_id field_ = fd_null; - int density_ = MAX_FIELD_DENSITY; + int intensity_ = MAX_FIELD_INTENSITY; int qty_ = 1; int chance_ = 100; diff --git a/src/enums.h b/src/enums.h index 88039e4ca683e..c590c50166645 100644 --- a/src/enums.h +++ b/src/enums.h @@ -237,7 +237,7 @@ struct hash { return result; } }; -} +} // namespace std inline constexpr bool operator<( const point &a, const point &b ) { @@ -333,7 +333,7 @@ struct hash { return result; } }; -} +} // namespace std inline constexpr bool operator==( const tripoint &a, const tripoint &b ) { diff --git a/src/explosion.cpp b/src/explosion.cpp index 2a4a43ae1ee2b..0ccd8e48ecede 100644 --- a/src/explosion.cpp +++ b/src/explosion.cpp @@ -251,18 +251,18 @@ static void do_blast( const tripoint &p, const float power, g->m.smash_items( pt, force ); if( fire ) { - int density = ( force > 50.0f ) + ( force > 100.0f ); + int intensity = ( force > 50.0f ) + ( force > 100.0f ); if( force > 10.0f || x_in_y( force, 10.0f ) ) { - density++; + intensity++; } - if( !g->m.has_zlevels() && g->m.is_outside( pt ) && density == 2 ) { + if( !g->m.has_zlevels() && g->m.is_outside( pt ) && intensity == 2 ) { // In 3D mode, it would have fire fields above, which would then fall // and fuel the fire on this tile - density++; + intensity++; } - g->m.add_field( pt, fd_fire, density ); + g->m.add_field( pt, fd_fire, intensity ); } if( const optional_vpart_position vp = g->m.veh_at( pt ) ) { @@ -841,7 +841,7 @@ void nuke( const tripoint &p ) } } -} +} // namespace explosion_handler // This is only ever used to zero the cloud values, which is what makes it work. fragment_cloud &fragment_cloud::operator=( const float &value ) diff --git a/src/explosion.h b/src/explosion.h index 5d3583c6f22f6..a603f790485d1 100644 --- a/src/explosion.h +++ b/src/explosion.h @@ -66,7 +66,7 @@ void shockwave( const tripoint &p, int radius, int force, int stun, int dam_mult void draw_explosion( const tripoint &p, int radius, const nc_color &col ); void draw_custom_explosion( const tripoint &p, const std::map &area ); -} +} // namespace explosion_handler shrapnel_data load_shrapnel_data( JsonObject &jo ); explosion_data load_explosion_data( JsonObject &jo ); diff --git a/src/faction.cpp b/src/faction.cpp index be90273dbabf9..465b5a93c6b62 100644 --- a/src/faction.cpp +++ b/src/faction.cpp @@ -34,7 +34,7 @@ namespace npc_factions { std::vector all_templates; -} +} // namespace npc_factions const faction_id your_faction = faction_id( "your_followers" ); diff --git a/src/faction.h b/src/faction.h index fae06ca639070..1ee86cc09a70f 100644 --- a/src/faction.h +++ b/src/faction.h @@ -50,7 +50,7 @@ const std::unordered_map relation_strs = { { { "knows your voice", knows_your_voice } } }; -} +} // namespace npc_factions class faction_template { diff --git a/src/faction_camp.cpp b/src/faction_camp.cpp index dac0e6e056495..539cc71f30527 100644 --- a/src/faction_camp.cpp +++ b/src/faction_camp.cpp @@ -275,7 +275,7 @@ std::map miss_info = {{ } } }; -} +} // namespace base_camps /**** Forward declaration of utility functions */ /** @@ -1909,9 +1909,13 @@ static std::pair farm_action( const tripoint &omt_tgt, farm } break; case farm_ops::harvest: - if( farm_map.furn( pos ) == f_plant_harvest && !farm_map.i_at( pos ).empty() ) { - const item &seed = farm_map.i_at( pos ).front(); - if( farm_valid_seed( seed ) ) { + if( farm_map.furn( pos ) == f_plant_harvest ) { + // Can't use item_stack::only_item() since there might be fertilizer + map_stack items = farm_map.i_at( pos ); + const map_stack::iterator seed = std::find_if( items.begin(), items.end(), []( const item & it ) { + return it.is_seed(); + } ); + if( seed != items.end() && farm_valid_seed( *seed ) ) { plots_cnt += 1; if( comp ) { int skillLevel = comp->get_skill_level( skill_survival ); @@ -1919,7 +1923,7 @@ static std::pair farm_action( const tripoint &omt_tgt, farm int plant_cnt = rng( skillLevel / 2, skillLevel ); plant_cnt = std::min( std::max( plant_cnt, 1 ), 9 ); int seed_cnt = std::max( 1, rng( plant_cnt / 4, plant_cnt / 2 ) ); - for( auto &i : iexamine::get_harvest_items( *seed.type, plant_cnt, + for( auto &i : iexamine::get_harvest_items( *seed->type, plant_cnt, seed_cnt, true ) ) { g->m.add_item_or_charges( g->u.pos(), i ); } @@ -1927,7 +1931,7 @@ static std::pair farm_action( const tripoint &omt_tgt, farm farm_map.furn_set( pos, f_null ); farm_map.ter_set( pos, t_dirt ); } else { - plant_names.insert( item::nname( itype_id( seed.type->seed->fruit_id ) ) ); + plant_names.insert( item::nname( itype_id( seed->type->seed->fruit_id ) ) ); } } } diff --git a/src/faction_camp.h b/src/faction_camp.h index 60a999b9165c5..3e06e9bee8b6c 100644 --- a/src/faction_camp.h +++ b/src/faction_camp.h @@ -64,5 +64,5 @@ std::vector> om_building_region( const tripoint std::string om_simple_dir( const tripoint &omt_pos, const tripoint &omt_tar ); /// Converts a direction into a point offset point om_dir_to_offset( const std::string &dir ); -} +} // namespace talk_function #endif diff --git a/src/field.cpp b/src/field.cpp index 3e6b9a7d98339..846a80bda4457 100644 --- a/src/field.cpp +++ b/src/field.cpp @@ -484,7 +484,7 @@ int field_entry::move_cost() const nc_color field_entry::color() const { - return all_field_types_enum_list[type].color[density - 1]; + return all_field_types_enum_list[type].color[intensity - 1]; } char field_entry::symbol() const @@ -499,7 +499,7 @@ field_id field_entry::get_field_type() const int field_entry::get_field_intensity() const { - return density; + return intensity; } time_duration field_entry::get_field_age() const @@ -521,10 +521,10 @@ field_id field_entry::set_field_type( const field_id new_field_id ) } -int field_entry::set_field_density( const int new_density ) +int field_entry::set_field_intensity( const int new_intensity ) { - is_alive = new_density > 0; - return density = std::max( std::min( new_density, MAX_FIELD_DENSITY ), 1 ); + is_alive = new_intensity > 0; + return intensity = std::max( std::min( new_intensity, MAX_FIELD_INTENSITY ), 1 ); } time_duration field_entry::set_field_age( const time_duration &new_age ) @@ -569,11 +569,11 @@ const field_entry *field::find_field( const field_id field_to_find ) const Function: addfield Inserts the given field_id into the field list for a given tile if it does not already exist. Returns false if the field_id already exists, true otherwise. -If the field already exists, it will return false BUT it will add the density/age to the current values for upkeep. +If the field already exists, it will return false BUT it will add the intensity/age to the current values for upkeep. If you wish to modify an already existing field use find_field and modify the result. -Density defaults to 1, and age to 0 (permanent) if not specified. +Intensity defaults to 1, and age to 0 (permanent) if not specified. */ -bool field::add_field( const field_id field_to_add, const int new_density, +bool field::add_field( const field_id field_to_add, const int new_intensity, const time_duration &new_age ) { auto it = field_list.find( field_to_add ); @@ -583,10 +583,10 @@ bool field::add_field( const field_id field_to_add, const int new_density, } if( it != field_list.end() ) { //Already exists, but lets update it. This is tentative. - it->second.set_field_density( it->second.get_field_intensity() + new_density ); + it->second.set_field_intensity( it->second.get_field_intensity() + new_intensity ); return false; } - field_list[field_to_add] = field_entry( field_to_add, new_density, new_age ); + field_list[field_to_add] = field_entry( field_to_add, new_intensity, new_age ); return true; } @@ -645,9 +645,10 @@ std::map::const_iterator field::end() const return field_list.end(); } -std::string field_t::name( const int density ) const +std::string field_t::name( const int intensity ) const { - const std::string &n = untranslated_name[std::min( std::max( 0, density ), MAX_FIELD_DENSITY - 1 )]; + const std::string &n = untranslated_name[std::min( std::max( 0, intensity ), + MAX_FIELD_INTENSITY - 1 )]; return n.empty() ? n : _( n ); } diff --git a/src/field.h b/src/field.h index f9949dca528ea..3ea2883940f30 100644 --- a/src/field.h +++ b/src/field.h @@ -26,32 +26,32 @@ struct field_t { // should be the same as the entry in field_id below (e.g. "fd_fire"). std::string id; - /** Display name for field at given density (e.g. light smoke, smoke, heavy smoke) */ - std::string untranslated_name[ MAX_FIELD_DENSITY ]; - /// Can be empty! \p density must be in the range [0, MAX_FIELD_DENSITY - 1]. - std::string name( int density ) const; + /** Display name for field at given intensity (e.g. light smoke, smoke, heavy smoke) */ + std::string untranslated_name[ MAX_FIELD_INTENSITY ]; + /// Can be empty! \p intensity must be in the range [0, MAX_FIELD_INTENSITY - 1]. + std::string name( int intensity ) const; char sym; //The symbol to draw for this field. Note that some are reserved like * and %. You will have to check the draw function for specifics. int priority; //Inferior numbers have lower priority. 0 is "ground" (splatter), 2 is "on the ground", 4 is "above the ground" (fire), 6 is reserved for furniture, and 8 is "in the air" (smoke). - /** Color the field will be drawn as on the screen at a given density */ - deferred_color color[ MAX_FIELD_DENSITY ]; + /** Color the field will be drawn as on the screen at a given intensity */ + deferred_color color[ MAX_FIELD_INTENSITY ]; /** * If false this field may block line of sight. * @warning this does nothing by itself. You must go to the code block in lightmap.cpp and modify * transparancy code there with a case statement as well! **/ - bool transparent[ MAX_FIELD_DENSITY ]; + bool transparent[ MAX_FIELD_INTENSITY ]; - /** Where tile is dangerous (prompt before moving into) at given density */ - bool dangerous[ MAX_FIELD_DENSITY ]; + /** Where tile is dangerous (prompt before moving into) at given intensity */ + bool dangerous[ MAX_FIELD_INTENSITY ]; - //Controls, albeit randomly, how long a field of a given type will last before going down in density. + //Controls, albeit randomly, how long a field of a given type will last before going down in intensity. time_duration halflife; - /** cost of moving into and out of this field at given density */ - int move_cost[ MAX_FIELD_DENSITY ]; + /** cost of moving into and out of this field at given intensity */ + int move_cost[ MAX_FIELD_INTENSITY ]; /** Does it penetrate obstacles like gas, spread like liquid or just lie there like solid? */ phase_id phase; @@ -134,13 +134,13 @@ bool field_type_dangerous( field_id id ); /** * An active or passive effect existing on a tile. - * Each effect can vary in intensity (density) and age (usually used as a time to live). + * Each effect can vary in intensity and age (usually used as a time to live). */ class field_entry { public: - field_entry() : type( fd_null ), density( 1 ), age( 0_turns ), is_alive( false ) { } - field_entry( const field_id t, const int d, const time_duration &a ) : type( t ), density( d ), + field_entry() : type( fd_null ), intensity( 1 ), age( 0_turns ), is_alive( false ) { } + field_entry( const field_id t, const int i, const time_duration &a ) : type( t ), intensity( i ), age( a ), is_alive( true ) { } nc_color color() const; @@ -153,7 +153,7 @@ class field_entry //Returns the field_id of the current field entry. field_id get_field_type() const; - //Returns the current density (aka intensity) of the current field entry. + //Returns the current intensity of the current field entry. int get_field_intensity() const; //Allows you to modify the field_id of the current field entry. @@ -161,8 +161,8 @@ class field_entry //breaks the field drawing code and field lookup field_id set_field_type( const field_id new_field_id ); - //Allows you to modify the density of the current field entry. - int set_field_density( const int new_density ); + //Allows you to modify the intensity of the current field entry. + int set_field_intensity( const int new_intensity ); /// @returns @ref age. time_duration get_field_age() const; @@ -177,13 +177,13 @@ class field_entry //Returns if the current field is dangerous or not. bool is_dangerous() const { - return all_field_types_enum_list[type].dangerous[density - 1]; + return all_field_types_enum_list[type].dangerous[intensity - 1]; } - //Returns the display name of the current field given its current density. + //Returns the display name of the current field given its current intensity. //IE: light smoke, smoke, heavy smoke std::string name() const { - return all_field_types_enum_list[type].name( density - 1 ); + return all_field_types_enum_list[type].name( intensity - 1 ); } //Returns true if this is an active field, false if it should be removed. @@ -197,7 +197,7 @@ class field_entry private: field_id type; //The field identifier. - int density; //The density, or intensity (higher is stronger), of the field entry. + int intensity; //The intensity (higher is stronger), of the field entry. time_duration age; //The age, of the field effect. 0 is permanent. bool is_alive; //True if this is an active field, false if it should be destroyed next check. }; @@ -234,11 +234,11 @@ class field /** * Inserts the given field_id into the field list for a given tile if it does not already exist. * If you wish to modify an already existing field use find_field and modify the result. - * Density defaults to 1, and age to 0 (permanent) if not specified. - * The density is added to an existing field entry, but the age is only used for newly added entries. + * Intensity defaults to 1, and age to 0 (permanent) if not specified. + * The intensity is added to an existing field entry, but the age is only used for newly added entries. * @return false if the field_id already exists, true otherwise. */ - bool add_field( field_id field_to_add, int new_density = 1, + bool add_field( field_id field_to_add, int new_intensity = 1, const time_duration &new_age = 0_turns ); /** diff --git a/src/field_type.cpp b/src/field_type.cpp index b4be88e7dc51c..c529594824bf3 100644 --- a/src/field_type.cpp +++ b/src/field_type.cpp @@ -11,7 +11,7 @@ namespace generic_factory all_field_types( "field types" ); -} +} // namespace /** @relates int_id */ template<> diff --git a/src/field_type.h b/src/field_type.h index 73b41b10ffe54..ce876854b5d25 100644 --- a/src/field_type.h +++ b/src/field_type.h @@ -89,7 +89,7 @@ const std::vector &get_all(); void set_field_type_ids(); field_type get_field_type_by_legacy_enum( int legacy_enum_id ); -} +} // namespace field_types extern field_type_id x_fd_null, x_fd_blood, diff --git a/src/filesystem.h b/src/filesystem.h index d86a415452c82..718f7831b3c1e 100644 --- a/src/filesystem.h +++ b/src/filesystem.h @@ -18,7 +18,7 @@ bool rename_file( const std::string &old_path, const std::string &new_path ); namespace cata_files { const char *eol(); -} +} // namespace cata_files //-------------------------------------------------------------------------------------------------- /** diff --git a/src/flat_set.h b/src/flat_set.h index 00b2f96782bbb..0d3c831f32a5e 100644 --- a/src/flat_set.h +++ b/src/flat_set.h @@ -214,6 +214,6 @@ class flat_set : private Compare, Data } }; -} +} // namespace cata #endif // CATA_FLAT_SET diff --git a/src/fungal_effects.cpp b/src/fungal_effects.cpp index 38c454a02398b..5675af8711169 100644 --- a/src/fungal_effects.cpp +++ b/src/fungal_effects.cpp @@ -150,7 +150,7 @@ void fungal_effects::spread_fungus_one_tile( const tripoint &p, const int growth } } else if( m.has_flag( "YOUNG", p ) ) { if( x_in_y( growth * 10, 500 ) ) { - if( m.get_field_strength( p, fd_fungal_haze ) != 0 ) { + if( m.get_field_intensity( p, fd_fungal_haze ) != 0 ) { if( x_in_y( growth * 10, 800 ) ) { // young trees are vulnerable m.ter_set( p, t_fungus ); gm.summon_mon( mon_fungal_blossom, p ); @@ -167,7 +167,7 @@ void fungal_effects::spread_fungus_one_tile( const tripoint &p, const int growth } } else if( m.has_flag( "TREE", p ) ) { if( one_in( 10 ) ) { - if( m.get_field_strength( p, fd_fungal_haze ) != 0 ) { + if( m.get_field_intensity( p, fd_fungal_haze ) != 0 ) { if( x_in_y( growth * 10, 100 ) ) { m.ter_set( p, t_fungus ); gm.summon_mon( mon_fungal_blossom, p ); @@ -200,11 +200,16 @@ void fungal_effects::spread_fungus_one_tile( const tripoint &p, const int growth } } else if( m.has_flag( "PLANT", p ) ) { // Replace the (already existing) seed - if( !m.i_at( p ).empty() ) { - m.i_at( p )[0] = item( "fungal_seeds", calendar::turn ); - } else { + // Can't use item_stack::only_item() since there might be fertilizer + map_stack items = m.i_at( p ); + const map_stack::iterator seed = std::find_if( items.begin(), items.end(), []( const item & it ) { + return it.is_seed(); + } ); + if( seed == items.end() || !seed->is_seed() ) { DebugLog( D_ERROR, DC_ALL ) << "No seed item in the PLANT terrain at position " << string_format( "%d,%d,%d.", p.x, p.y, p.z ); + } else { + *seed = item( "fungal_seeds", calendar::turn ); } } } diff --git a/src/game.cpp b/src/game.cpp index 61d4b35ce037d..4a34abb5787db 100644 --- a/src/game.cpp +++ b/src/game.cpp @@ -698,10 +698,10 @@ bool game::start_game() } start_loc.prepare_map( omtstart ); - if( scen->has_map_special() ) { - // Specials can add monster spawn points and similar and should be done before the main + if( scen->has_map_extra() ) { + // Map extras can add monster spawn points and similar and should be done before the main // map is loaded. - start_loc.add_map_special( omtstart, scen->get_map_special() ); + start_loc.add_map_extra( omtstart, scen->get_map_extra() ); } tripoint lev = omt_to_sm_copy( omtstart ); @@ -1711,7 +1711,7 @@ int get_heat_radiation( const tripoint &location, bool direct ) } int heat_intensity = 0; - int ffire = g->m.get_field_strength( dest, fd_fire ); + int ffire = g->m.get_field_intensity( dest, fd_fire ); if( ffire > 0 ) { heat_intensity = ffire; } else if( g->m.tr_at( dest ).loadid == tr_lava ) { @@ -1747,26 +1747,26 @@ int get_convection_temperature( const tripoint &location ) int temp_mod = 0; const trap &trap_at_pos = g->m.tr_at( location ); // directly on fire/lava tiles - int tile_strength = g->m.get_field_strength( location, fd_fire ); - if( tile_strength > 0 || trap_at_pos.loadid == tr_lava ) { + int tile_intensity = g->m.get_field_intensity( location, fd_fire ); + if( tile_intensity > 0 || trap_at_pos.loadid == tr_lava ) { temp_mod += 300; } // hot air of a fire/lava - auto tile_strength_mod = []( const tripoint & loc, field_id fld, int case_1, int case_2, + auto tile_intensity_mod = []( const tripoint & loc, field_id fld, int case_1, int case_2, int case_3 ) { - int strength = g->m.get_field_strength( loc, fld ); + int intensity = g->m.get_field_intensity( loc, fld ); int cases[3] = { case_1, case_2, case_3 }; - return ( strength > 0 && strength < 4 ) ? cases[ strength - 1 ] : 0; + return ( intensity > 0 && intensity < 4 ) ? cases[ intensity - 1 ] : 0; }; - temp_mod += tile_strength_mod( location, fd_hot_air1, 2, 6, 10 ); - temp_mod += tile_strength_mod( location, fd_hot_air2, 6, 16, 20 ); - temp_mod += tile_strength_mod( location, fd_hot_air3, 16, 40, 70 ); - temp_mod += tile_strength_mod( location, fd_hot_air4, 70, 100, 160 ); - temp_mod -= tile_strength_mod( location, fd_cold_air1, 2, 6, 10 ); - temp_mod -= tile_strength_mod( location, fd_cold_air2, 6, 16, 20 ); - temp_mod -= tile_strength_mod( location, fd_cold_air3, 16, 40, 70 ); - temp_mod -= tile_strength_mod( location, fd_cold_air4, 70, 100, 160 ); + temp_mod += tile_intensity_mod( location, fd_hot_air1, 2, 6, 10 ); + temp_mod += tile_intensity_mod( location, fd_hot_air2, 6, 16, 20 ); + temp_mod += tile_intensity_mod( location, fd_hot_air3, 16, 40, 70 ); + temp_mod += tile_intensity_mod( location, fd_hot_air4, 70, 100, 160 ); + temp_mod -= tile_intensity_mod( location, fd_cold_air1, 2, 6, 10 ); + temp_mod -= tile_intensity_mod( location, fd_cold_air2, 6, 16, 20 ); + temp_mod -= tile_intensity_mod( location, fd_cold_air3, 16, 40, 70 ); + temp_mod -= tile_intensity_mod( location, fd_cold_air4, 70, 100, 160 ); return temp_mod; } @@ -2086,7 +2086,7 @@ int game::inventory_item_menu( int pos, int iStartX, int iWidth, u.read( pos ); break; case 'D': - u.disassemble( pos ); + u.disassemble( item_location( u, &u.i_at( pos ) ), false ); break; case 'f': oThisItem.is_favorite = !oThisItem.is_favorite; @@ -2212,7 +2212,6 @@ input_context get_default_mode_input_context() ctxt.register_action( "RIGHTDOWN", translate_marker( "Move Southeast" ) ); ctxt.register_action( "DOWN", translate_marker( "Move South" ) ); ctxt.register_action( "LEFTDOWN", translate_marker( "Move Southwest" ) ); - ctxt.register_action( "LEFTDOWN", translate_marker( "Move Southwest" ) ); ctxt.register_action( "LEFT", translate_marker( "Move West" ) ); ctxt.register_action( "LEFTUP", translate_marker( "Move Northwest" ) ); ctxt.register_action( "pause" ); @@ -4999,11 +4998,11 @@ void game::use_item( int pos ) refresh_all(); if( use_loc ) { - update_lum( loc.clone(), false ); - u.use( loc.clone() ); - update_lum( loc.clone(), true ); + update_lum( loc, false ); + u.use( loc ); + update_lum( loc, true ); - make_active( loc.clone() ); + make_active( loc ); } else { u.use( pos ); } @@ -5119,23 +5118,23 @@ bool game::forced_door_closing( const tripoint &p, const ter_id &door_type, int m.ter_set( x, y, door_type ); if( m.has_flag( "NOITEM", x, y ) ) { - auto items = m.i_at( x, y ); - while( !items.empty() ) { - if( items[0].made_of( LIQUID ) ) { - m.i_rem( x, y, 0 ); + map_stack items = m.i_at( x, y ); + for( map_stack::iterator it = items.begin(); it != items.end(); ) { + if( it->made_of( LIQUID ) ) { + it = items.erase( it ); continue; } - if( items[0].made_of( material_id( "glass" ) ) && one_in( 2 ) ) { + if( it->made_of( material_id( "glass" ) ) && one_in( 2 ) ) { if( can_see ) { - add_msg( m_warning, _( "A %s shatters!" ), items[0].tname() ); + add_msg( m_warning, _( "A %s shatters!" ), it->tname() ); } else { add_msg( m_warning, _( "Something shatters!" ) ); } - m.i_rem( x, y, 0 ); + it = items.erase( it ); continue; } - m.add_item_or_charges( kbx, kby, items[0] ); - m.i_rem( x, y, 0 ); + m.add_item_or_charges( kbx, kby, *it ); + it = items.erase( it ); } } return true; @@ -5379,10 +5378,17 @@ static const std::string get_fire_fuel_string( const tripoint &examp ) return ss.str(); } else { fire_age = 30_minutes - fire_age; - fire_age = rng( fire_age - fire_age * mod / 5, fire_age + fire_age * mod / 5 ); - ss << string_format( - _( "Without extra fuel it might burn yet for %s, but might also go out sooner." ), - to_string_approx( fire_age ) ); + if( to_string_approx( fire_age - fire_age * mod / 5 ) == to_string_approx( + fire_age + fire_age * mod / 5 ) ) { + ss << string_format( + _( "Without extra fuel it might burn yet for maybe %s, but might also go out sooner." ), + to_string_approx( fire_age - fire_age * mod / 5 ) ); + } else { + ss << string_format( + _( "Without extra fuel it might burn yet for between %s to %s, but might also go out sooner." ), + to_string_approx( fire_age - fire_age * mod / 5 ), + to_string_approx( fire_age + fire_age * mod / 5 ) ); + } return ss.str(); } } else { @@ -5401,8 +5407,15 @@ static const std::string get_fire_fuel_string( const tripoint &examp ) return ss.str(); } } else { - fire_age = rng( fire_age - fire_age * mod / 5, fire_age + fire_age * mod / 5 ); - ss << string_format( _( "Without extra fuel it will burn for %s." ), to_string_approx( fire_age ) ); + if( to_string_approx( fire_age - fire_age * mod / 5 ) == to_string_approx( + fire_age + fire_age * mod / 5 ) ) { + ss << string_format( _( "Without extra fuel it will burn for about %s." ), + to_string_approx( fire_age - fire_age * mod / 5 ) ); + } else { + ss << string_format( _( "Without extra fuel it will burn for between %s to %s." ), + to_string_approx( fire_age - fire_age * mod / 5 ), + to_string_approx( fire_age + fire_age * mod / 5 ) ); + } return ss.str(); } } @@ -7737,6 +7750,7 @@ void game::drop_in_direction() } } + // Used to set up the first Hotkey in the display set static int get_initial_hotkey( const size_t menu_index ) { @@ -7751,22 +7765,20 @@ static int get_initial_hotkey( const size_t menu_index ) } // Returns a vector of pairs. -// Pair.first is the first items index with a unique tname. +// Pair.first is the iterator to the first item with a unique tname. // Pair.second is the number of equivalent items per unique tname // There are options for optimization here, but the function is hit infrequently // enough that optimizing now is not a useful time expenditure. -static const std::vector> generate_butcher_stack_display( - map_stack &items, const std::vector &indices ) +static std::vector> generate_butcher_stack_display( + std::vector &its ) { - std::vector> result; + std::vector> result; std::vector result_strings; - result.reserve( indices.size() ); - result_strings.reserve( indices.size() ); + result.reserve( its.size() ); + result_strings.reserve( its.size() ); - for( const size_t ndx : indices ) { - const item &it = items[ ndx ]; - - const std::string tname = it.tname(); + for( map_stack::iterator &it : its ) { + const std::string tname = it->tname(); size_t s = 0; // Search for the index with a string equivalent to tname for( ; s < result_strings.size(); ++s ) { @@ -7779,7 +7791,7 @@ static const std::vector> generate_butcher_stack_display( // Has the side effect of making 's' a valid index if( s == result_strings.size() ) { // make a new entry - result.push_back( std::make_pair( static_cast( ndx ), 0 ) ); + result.emplace_back( it, 0 ); // Also push new entry string result_strings.push_back( tname ); } @@ -7792,28 +7804,27 @@ static const std::vector> generate_butcher_stack_display( // Corpses are always individual items // Just add them individually to the menu -static void add_corpses( uilist &menu, map_stack &items, - const std::vector &indices, size_t &menu_index ) +static void add_corpses( uilist &menu, const std::vector &its, + size_t &menu_index ) { int hotkey = get_initial_hotkey( menu_index ); - for( const auto index : indices ) { - const item &it = items[index]; - menu.addentry( menu_index++, true, hotkey, it.get_mtype()->nname() ); + for( const map_stack::iterator &it : its ) { + menu.addentry( menu_index++, true, hotkey, it->get_mtype()->nname() ); hotkey = -1; } } // Salvagables stack so we need to pass in a stack vector rather than an item index vector -static void add_salvagables( uilist &menu, map_stack &items, - const std::vector> &stacks, size_t &menu_index, - const salvage_actor &salvage_iuse ) +static void add_salvagables( uilist &menu, + const std::vector> &stacks, + size_t &menu_index, const salvage_actor &salvage_iuse ) { if( !stacks.empty() ) { int hotkey = get_initial_hotkey( menu_index ); for( const auto &stack : stacks ) { - const item &it = items[ stack.first ]; + const item &it = *stack.first; //~ Name and number of items listed for cutting up const auto &msg = string_format( pgettext( "butchery menu", "Cut up %s (%d)" ), @@ -7826,14 +7837,14 @@ static void add_salvagables( uilist &menu, map_stack &items, } // Disassemblables stack so we need to pass in a stack vector rather than an item index vector -static void add_disassemblables( uilist &menu, map_stack &items, - const std::vector> &stacks, size_t &menu_index ) +static void add_disassemblables( uilist &menu, + const std::vector> &stacks, size_t &menu_index ) { if( !stacks.empty() ) { int hotkey = get_initial_hotkey( menu_index ); for( const auto &stack : stacks ) { - const item &it = items[ stack.first ]; + const item &it = *stack.first; //~ Name, number of items and time to complete disassembling const auto &msg = string_format( pgettext( "butchery menu", "%s (%d)" ), @@ -7847,15 +7858,15 @@ static void add_disassemblables( uilist &menu, map_stack &items, } // Butchery sub-menu and time calculation -static void butcher_submenu( map_stack &items, const std::vector &corpses, int corpse = -1 ) +static void butcher_submenu( const std::vector &corpses, int corpse = -1 ) { auto cut_time = [&]( enum butcher_type bt ) { int time_to_cut = 0; if( corpse != -1 ) { - time_to_cut = butcher_time_to_cut( g->u, items[corpses[corpse]], bt ); + time_to_cut = butcher_time_to_cut( g->u, *corpses[corpse], bt ); } else { - for( int i : corpses ) { - time_to_cut += butcher_time_to_cut( g->u, items[i], bt ); + for( const map_stack::iterator &it : corpses ) { + time_to_cut += butcher_time_to_cut( g->u, *it, bt ); } } return to_string_clipped( time_duration::from_turns( time_to_cut / 100 ) ); @@ -7870,43 +7881,40 @@ static void butcher_submenu( map_stack &items, const std::vector &corpses, smenu.addentry_col( BUTCHER, enough_light, 'B', _( "Quick butchery" ), cut_time( BUTCHER ), _( "This technique is used when you are in a hurry, but still want to harvest something from the corpse. Yields are lower as you don't try to be precise, but it's useful if you don't want to set up a workshop. Prevents zombies from raising." ) ); - smenu.addentry_col( BUTCHER_FULL, enough_light, 'b', _( "Full butchery" ), - cut_time( BUTCHER_FULL ), + smenu.addentry_col( BUTCHER_FULL, enough_light, 'b', _( "Full butchery" ), cut_time( BUTCHER_FULL ), _( "This technique is used to properly butcher a corpse, and requires a rope & a tree or a butchering rack, a flat surface (for ex. a table, a leather tarp, etc.) and good tools. Yields are plentiful and varied, but it is time consuming." ) ); - smenu.addentry_col( F_DRESS, enough_light, 'f', _( "Field dress corpse" ), - cut_time( F_DRESS ), + smenu.addentry_col( F_DRESS, enough_light, 'f', _( "Field dress corpse" ), cut_time( F_DRESS ), _( "Technique that involves removing internal organs and viscera to protect the corpse from rotting from inside. Yields internal organs. Carcass will be lighter and will stay fresh longer. Can be combined with other methods for better effects." ) ); - smenu.addentry_col( SKIN, enough_light, 's', ( "Skin corpse" ), cut_time( SKIN ), + smenu.addentry_col( SKIN, enough_light, 's', _( "Skin corpse" ), cut_time( SKIN ), _( "Skinning a corpse is an involved and careful process that usually takes some time. You need skill and an appropriately sharp and precise knife to do a good job. Some corpses are too small to yield a full-sized hide and will instead produce scraps that can be used in other ways." ) ); smenu.addentry_col( QUARTER, enough_light, 'k', _( "Quarter corpse" ), cut_time( QUARTER ), _( "By quartering a previously field dressed corpse you will acquire four parts with reduced weight and volume. It may help in transporting large game. This action destroys skin, hide, pelt, etc., so don't use it if you want to harvest them later." ) ); smenu.addentry_col( DISMEMBER, true, 'm', _( "Dismember corpse" ), cut_time( DISMEMBER ), _( "If you're aiming to just destroy a body outright, and don't care about harvesting it, dismembering it will hack it apart in a very short amount of time, but yield little to no usable flesh." ) ); - smenu.addentry_col( DISSECT, enough_light, 'd', _( "Dissect corpse" ), - cut_time( DISSECT ), + smenu.addentry_col( DISSECT, enough_light, 'd', _( "Dissect corpse" ), cut_time( DISSECT ), _( "By careful dissection of the corpse, you will examine it for possible bionic implants, or discrete organs and harvest them if possible. Requires scalpel-grade cutting tools, ruins corpse, and consumes a lot of time. Your medical knowledge is most useful here." ) ); smenu.query(); switch( smenu.ret ) { case BUTCHER: - g->u.assign_activity( activity_id( "ACT_BUTCHER" ), 0, -1 ); + g->u.assign_activity( activity_id( "ACT_BUTCHER" ), 0, true ); break; case BUTCHER_FULL: - g->u.assign_activity( activity_id( "ACT_BUTCHER_FULL" ), 0, -1 ); + g->u.assign_activity( activity_id( "ACT_BUTCHER_FULL" ), 0, true ); break; case F_DRESS: - g->u.assign_activity( activity_id( "ACT_FIELD_DRESS" ), 0, -1 ); + g->u.assign_activity( activity_id( "ACT_FIELD_DRESS" ), 0, true ); break; case SKIN: - g->u.assign_activity( activity_id( "ACT_SKIN" ), 0, -1 ); + g->u.assign_activity( activity_id( "ACT_SKIN" ), 0, true ); break; case QUARTER: - g->u.assign_activity( activity_id( "ACT_QUARTER" ), 0, -1 ); + g->u.assign_activity( activity_id( "ACT_QUARTER" ), 0, true ); break; case DISMEMBER: - g->u.assign_activity( activity_id( "ACT_DISMEMBER" ), 0, -1 ); + g->u.assign_activity( activity_id( "ACT_DISMEMBER" ), 0, true ); break; case DISSECT: - g->u.assign_activity( activity_id( "ACT_DISSECT" ), 0, -1 ); + g->u.assign_activity( activity_id( "ACT_DISSECT" ), 0, true ); break; default: return; @@ -7940,10 +7948,10 @@ void game::butcher() const item *first_item_without_tools = nullptr; // Indices of relevant items - std::vector corpses; - std::vector disassembles; - std::vector salvageables; - auto items = m.i_at( u.pos() ); + std::vector corpses; + std::vector disassembles; + std::vector salvageables; + map_stack items = m.i_at( u.pos() ); const inventory &crafting_inv = u.crafting_inventory(); // TODO: Properly handle different material whitelists @@ -7974,17 +7982,17 @@ void game::butcher() // Split into corpses, disassemble-able, and salvageable items // It's not much additional work to just generate a corpse list and // clear it later, but does make the splitting process nicer. - for( size_t i = 0; i < items.size(); ++i ) { - if( items[i].is_corpse() ) { - corpses.push_back( i ); + for( map_stack::iterator it = items.begin(); it != items.end(); ++it ) { + if( it->is_corpse() ) { + corpses.push_back( it ); } else { - if( ( salvage_tool_index != INT_MIN ) && salvage_iuse->valid_to_cut_up( items[i] ) ) { - salvageables.push_back( i ); + if( ( salvage_tool_index != INT_MIN ) && salvage_iuse->valid_to_cut_up( *it ) ) { + salvageables.push_back( it ); } - if( u.can_disassemble( items[i], crafting_inv ).success() ) { - disassembles.push_back( i ); - } else if( first_item_without_tools == nullptr ) { - first_item_without_tools = &items[i]; + if( u.can_disassemble( *it, crafting_inv ).success() ) { + disassembles.push_back( it ); + } else if( !first_item_without_tools ) { + first_item_without_tools = &*it; } } } @@ -8001,7 +8009,7 @@ void game::butcher() add_msg( m_info, no_knife_msg ); } - if( first_item_without_tools != nullptr ) { + if( first_item_without_tools ) { add_msg( m_info, _( "You don't have the necessary tools to disassemble any items here." ) ); // Just for the "You need x to disassemble y" messages const auto ret = u.can_disassemble( *first_item_without_tools, crafting_inv ); @@ -8035,25 +8043,25 @@ void game::butcher() BUTCHER_SALVAGE, BUTCHER_OTHER // For multisalvage etc. } butcher_select = BUTCHER_CORPSE; - // Index to std::vector of indices... + // Index to std::vector of iterators... int indexer_index = 0; // Generate the indexed stacks so we can display them nicely - const auto disassembly_stacks = generate_butcher_stack_display( items, disassembles ); - const auto salvage_stacks = generate_butcher_stack_display( items, salvageables ); + const auto disassembly_stacks = generate_butcher_stack_display( disassembles ); + const auto salvage_stacks = generate_butcher_stack_display( salvageables ); // Always ask before cutting up/disassembly, but not before butchery size_t ret = 0; - if( corpses.size() > 1 || !disassembles.empty() || !salvageables.empty() ) { + if( !corpses.empty() || !disassembles.empty() || !salvageables.empty() ) { uilist kmenu; kmenu.text = _( "Choose corpse to butcher / item to disassemble" ); size_t i = 0; // Add corpses, disassembleables, and salvagables to the UI - add_corpses( kmenu, items, corpses, i ); - add_disassemblables( kmenu, items, disassembly_stacks, i ); + add_corpses( kmenu, corpses, i ); + add_disassemblables( kmenu, disassembly_stacks, i ); if( !salvageables.empty() ) { assert( salvage_iuse ); // To appease static analysis - add_salvagables( kmenu, items, salvage_stacks, i, *salvage_iuse ); + add_salvagables( kmenu, salvage_stacks, i, *salvage_iuse ); } if( corpses.size() > 1 ) { @@ -8063,8 +8071,7 @@ void game::butcher() int time_to_disassemble = 0; int time_to_disassemble_all = 0; for( const auto &stack : disassembly_stacks ) { - const item &it = items[ stack.first ]; - const int time = recipe_dictionary::get_uncraft( it.typeId() ).time; + const int time = recipe_dictionary::get_uncraft( stack.first->typeId() ).time; time_to_disassemble += time; time_to_disassemble_all += time * stack.second; } @@ -8078,8 +8085,7 @@ void game::butcher() assert( salvage_iuse ); // To appease static analysis int time_to_salvage = 0; for( const auto &stack : salvage_stacks ) { - const item &it = items[ stack.first ]; - time_to_salvage += salvage_iuse->time_to_cut_up( it ) * stack.second; + time_to_salvage += salvage_iuse->time_to_cut_up( *stack.first ) * stack.second; } kmenu.addentry_col( MULTISALVAGE, true, 'z', _( "Cut up everything" ), @@ -8133,9 +8139,9 @@ void game::butcher() u.assign_activity( activity_id( "ACT_LONGSALVAGE" ), 0, salvage_tool_index ); break; case MULTIBUTCHER: - butcher_submenu( items, corpses ); - for( int i : corpses ) { - u.activity.values.push_back( i ); + butcher_submenu( corpses ); + for( map_stack::iterator &it : corpses ) { + u.activity.targets.emplace_back( map_cursor( u.pos() ), &*it ); } break; case MULTIDISASSEMBLE_ONE: @@ -8150,23 +8156,23 @@ void game::butcher() } break; case BUTCHER_CORPSE: { - butcher_submenu( items, corpses, indexer_index ); + butcher_submenu( corpses, indexer_index ); draw_ter(); wrefresh( w_terrain ); draw_panels( true ); - u.activity.values.push_back( corpses[indexer_index] ); + u.activity.targets.emplace_back( map_cursor( u.pos() ), &*corpses[indexer_index] ); } break; case BUTCHER_DISASSEMBLE: { // Pick index of first item in the disassembly stack - size_t index = disassembly_stacks[indexer_index].first; - u.disassemble( items[index], index, true ); + item *const target = &*disassembly_stacks[indexer_index].first; + u.disassemble( item_location( map_cursor( u.pos() ), target ), true ); } break; case BUTCHER_SALVAGE: { // Pick index of first item in the salvage stack - size_t index = salvage_stacks[indexer_index].first; - item_location item_loc( map_cursor( u.pos() ), &items[index] ); + item *const target = &*salvage_stacks[indexer_index].first; + item_location item_loc( map_cursor( u.pos() ), target ); salvage_iuse->cut_up( u, *salvage_tool, item_loc ); } break; @@ -8302,7 +8308,7 @@ void game::reload( item_location &loc, bool prompt, bool empty ) } else if( u.ammo_location && opt.ammo == u.ammo_location ) { u.ammo_location = item_location(); } else { - u.ammo_location = opt.ammo.clone(); + u.ammo_location = opt.ammo; } return; } @@ -8351,13 +8357,13 @@ void game::reload( item_location &loc, bool prompt, bool empty ) } item::reload_option opt = u.ammo_location && it->can_reload_with( u.ammo_location->typeId() ) ? - item::reload_option( &u, it, it, u.ammo_location.clone() ) : + item::reload_option( &u, it, it, u.ammo_location ) : u.select_ammo( *it, prompt, empty ); if( opt ) { u.assign_activity( activity_id( "ACT_RELOAD" ), opt.moves(), opt.qty() ); if( use_loc ) { - u.activity.targets.emplace_back( loc.clone() ); + u.activity.targets.emplace_back( loc ); } else { u.activity.targets.emplace_back( u, const_cast( opt.target ) ); } @@ -8544,6 +8550,11 @@ void game::wield( item_location &loc ) tripoint pos = loc.position(); int worn_index = INT_MIN; if( u.is_worn( *loc.get_item() ) ) { + auto ret = u.can_takeoff( *loc.get_item() ); + if( !ret.success() ) { + add_msg( m_info, "%s", ret.c_str() ); + return; + } int item_pos = u.get_item_position( loc.get_item() ); if( item_pos != INT_MIN ) { worn_index = Character::worn_position_to_index( item_pos ); @@ -8947,27 +8958,7 @@ bool game::walk_move( const tripoint &dest_loc ) "misc", "rattling" ); } } - if( u.is_hauling() ) { - u.assign_activity( activity_id( "ACT_MOVE_ITEMS" ) ); - // Whether the source is inside a vehicle (not supported) - u.activity.values.push_back( 0 ); - // Whether the destination is inside a vehicle (not supported) - u.activity.values.push_back( 0 ); - // Source relative to the player - u.activity.placement = u.pos() - dest_loc; - // Destination relative to the player - u.activity.coords.push_back( tripoint_zero ); - map_stack items = m.i_at( u.pos() ); - if( items.empty() ) { - u.stop_hauling(); - } - int index = 0; - for( auto it = items.begin(); it != items.end(); ++index, ++it ) { - int amount = it->count(); - u.activity.values.push_back( index ); - u.activity.values.push_back( amount ); - } - } + if( m.has_flag_ter_or_furn( TFLAG_HIDE_PLACE, dest_loc ) ) { add_msg( m_good, _( "You are hiding in the %s." ), m.name( dest_loc ) ); } @@ -8976,7 +8967,9 @@ bool game::walk_move( const tripoint &dest_loc ) u.lifetime_stats.squares_walked++; } + tripoint oldpos = u.pos(); point submap_shift = place_player( dest_loc ); + oldpos = tripoint( oldpos.x - submap_shift.x * SEEX, oldpos.y - submap_shift.y * SEEX, oldpos.z ); if( pulling ) { const tripoint shifted_furn_pos = tripoint( furn_pos.x - submap_shift.x * SEEX, @@ -8984,12 +8977,29 @@ bool game::walk_move( const tripoint &dest_loc ) const tripoint shifted_furn_dest = tripoint( furn_dest.x - submap_shift.x * SEEX, furn_dest.y - submap_shift.y * SEEY, furn_dest.z ); const time_duration fire_age = m.get_field_age( shifted_furn_pos, fd_fire ); - const int fire_str = m.get_field_strength( shifted_furn_pos, fd_fire ); + const int fire_intensity = m.get_field_intensity( shifted_furn_pos, fd_fire ); m.remove_field( shifted_furn_pos, fd_fire ); - m.set_field_strength( shifted_furn_dest, fd_fire, fire_str ); + m.set_field_intensity( shifted_furn_dest, fd_fire, fire_intensity ); m.set_field_age( shifted_furn_dest, fd_fire, fire_age ); } + if( u.is_hauling() ) { + u.assign_activity( activity_id( "ACT_MOVE_ITEMS" ) ); + // Whether the destination is inside a vehicle (not supported) + u.activity.values.push_back( 0 ); + // Destination relative to the player + u.activity.coords.push_back( tripoint_zero ); + map_stack items = m.i_at( oldpos ); + if( items.empty() ) { + u.stop_hauling(); + } + for( item &it : items ) { + u.activity.targets.emplace_back( map_cursor( oldpos ), &it ); + // Quantity of 0 means move all + u.activity.values.push_back( 0 ); + } + } + on_move_effects(); return true; @@ -9169,19 +9179,16 @@ point game::place_player( const tripoint &dest_loc ) const std::string pulp_butcher = get_option( "AUTO_PULP_BUTCHER" ); if( pulp_butcher == "butcher" && u.max_quality( quality_id( "BUTCHER" ) ) > INT_MIN ) { - std::vector corpses; - auto items = m.i_at( u.pos() ); + std::vector corpses; - for( size_t i = 0; i < items.size(); i++ ) { - if( items[i].is_corpse() ) { - corpses.push_back( i ); - } + for( item &it : m.i_at( u.pos() ) ) { + corpses.push_back( &it ); } if( !corpses.empty() ) { - u.assign_activity( activity_id( "ACT_BUTCHER" ), 0, -1 ); - for( int i : corpses ) { - u.activity.values.push_back( i ); + u.assign_activity( activity_id( "ACT_BUTCHER" ), 0, true ); + for( item *it : corpses ) { + u.activity.targets.emplace_back( map_cursor( u.pos() ), it ); } } } else if( pulp_butcher == "pulp" || pulp_butcher == "pulp_adjacent" ) { @@ -9467,7 +9474,7 @@ bool game::grabbed_furn_move( const tripoint &dp ) m.furn( fpos ).obj().has_flag( "FIRE_CONTAINER" ) || m.furn( fpos ).obj().has_flag( "SEALED" ); - const int fire_str = m.get_field_strength( fpos, fd_fire ); + const int fire_intensity = m.get_field_intensity( fpos, fd_fire ); time_duration fire_age = m.get_field_age( fpos, fd_fire ); int str_req = furntype.move_str_req; @@ -9527,9 +9534,9 @@ bool game::grabbed_furn_move( const tripoint &dp ) m.furn_set( fdest, m.furn( fpos ) ); m.furn_set( fpos, f_null ); - if( fire_str == 1 && !pulling_furniture ) { + if( fire_intensity == 1 && !pulling_furniture ) { m.remove_field( fpos, fd_fire ); - m.set_field_strength( fdest, fd_fire, fire_str ); + m.set_field_intensity( fdest, fd_fire, fire_intensity ); m.set_field_age( fdest, fd_fire, fire_age ); } @@ -9547,11 +9554,11 @@ bool game::grabbed_furn_move( const tripoint &dp ) m.i_clear( fpos ); for( auto item_iter = m.i_at( fdest ).begin(); item_iter != m.i_at( fdest ).end(); ++item_iter ) { - m.i_at( fpos ).push_back( *item_iter ); + m.i_at( fpos ).insert( *item_iter ); } m.i_clear( fdest ); for( auto &cur_item : temp ) { - m.i_at( fdest ).push_back( cur_item ); + m.i_at( fdest ).insert( cur_item ); } } else { add_msg( _( "Stuff spills from the %s!" ), furntype.name() ); @@ -10088,23 +10095,18 @@ void game::vertical_move( int movez, bool force ) if( u.is_hauling() ) { u.assign_activity( activity_id( "ACT_MOVE_ITEMS" ) ); - // Whether the source is inside a vehicle (not supported) - u.activity.values.push_back( 0 ); // Whether the destination is inside a vehicle (not supported) u.activity.values.push_back( 0 ); - // Source relative to the player - u.activity.placement = adjusted_pos - u.pos(); // Destination relative to the player u.activity.coords.push_back( tripoint_zero ); map_stack items = m.i_at( adjusted_pos ); if( items.empty() ) { u.stop_hauling(); } - int index = 0; - for( auto it = items.begin(); it != items.end(); ++index, ++it ) { - int amount = it->count(); - u.activity.values.push_back( index ); - u.activity.values.push_back( amount ); + for( item &it : items ) { + u.activity.targets.emplace_back( map_cursor( adjusted_pos ), &it ); + // Quantitu of 0 means move all + u.activity.values.push_back( 0 ); } } @@ -10276,7 +10278,8 @@ void game::vertical_shift( const int z_after ) void game::vertical_notes( int z_before, int z_after ) { - if( z_before == z_after || !get_option( "AUTO_NOTES" ) ) { + if( z_before == z_after || !get_option( "AUTO_NOTES" ) || + !get_option( "AUTO_NOTES_STAIRS" ) ) { return; } diff --git a/src/game_constants.h b/src/game_constants.h index b33607af4f0d8..966c27fd4bed5 100644 --- a/src/game_constants.h +++ b/src/game_constants.h @@ -96,7 +96,7 @@ constexpr int freezer = 23; // -5 Celsius /** Temperature in which water freezes in Fahrenheit */ constexpr int freezing = 32; // 0 Celsius -} +} // namespace temperatures // Shelf life of corpse. This should be kept same as raw flesh. constexpr time_duration CORPSE_ROT_TIME = 24_hours; @@ -107,8 +107,8 @@ constexpr time_duration CORPSE_ROT_TIME = 24_hours; /** Cap JACK requirements to support arbitrarily large vehicles */ #define JACK_LIMIT 8500_kilogram // 8500kg ( 8.5 metric tonnes ) -/** Maximum density of a map field */ -#define MAX_FIELD_DENSITY 3 +/** Maximum intensity of a map field */ +#define MAX_FIELD_INTENSITY 3 /** Slowest speed at which a gun can be aimed */ #define MAX_AIM_COST 10 diff --git a/src/game_inventory.cpp b/src/game_inventory.cpp index ce2dbaf8588ad..b5f6b7018ffe6 100644 --- a/src/game_inventory.cpp +++ b/src/game_inventory.cpp @@ -44,6 +44,8 @@ #include "units.h" #include "type_id.h" +const efftype_id effect_assisted( "assisted" ); + const skill_id skill_computer( "computer" ); const skill_id skill_electronics( "electronics" ); const skill_id skill_firstaid( "firstaid" ); @@ -78,7 +80,7 @@ std::string highlight_good_bad_none( int value ) return string_format( "%d", value ); } -} +} // namespace inventory_filter_preset::inventory_filter_preset( const item_location_filter &filter ) : filter( filter ) @@ -550,10 +552,11 @@ class comestible_inventory_preset : public inventory_selector_preset } bool sort_compare( const inventory_entry &lhs, const inventory_entry &rhs ) const override { - const auto &a = get_consumable_item( lhs.location ); - const auto &b = get_consumable_item( rhs.location ); + const auto &a = get_consumable_item( lhs.any_item() ); + const auto &b = get_consumable_item( rhs.any_item() ); - const int freshness = rate_freshness( a, *lhs.location ) - rate_freshness( b, *rhs.location ); + const int freshness = rate_freshness( a, *lhs.any_item() ) - + rate_freshness( b, *rhs.any_item() ); if( freshness != 0 ) { return freshness > 0; } @@ -821,8 +824,8 @@ class gunmod_inventory_preset : public inventory_selector_preset } bool sort_compare( const inventory_entry &lhs, const inventory_entry &rhs ) const override { - const auto a = get_odds( lhs.location ); - const auto b = get_odds( rhs.location ); + const auto a = get_odds( lhs.any_item() ); + const auto b = get_odds( rhs.any_item() ); if( a.first > b.first || ( a.first == b.first && a.second < b.second ) ) { return true; @@ -948,11 +951,11 @@ class read_inventory_preset: public pickup_inventory_preset return true; } - if( !is_known( e.location ) ) { + if( !is_known( e.any_item() ) ) { return false; } - const auto &book = get_book( e.location ); + const auto &book = get_book( e.any_item() ); if( book.skill && p.get_skill_level_object( book.skill ).can_train() ) { return lcmatch( book.skill->name(), filter ); } @@ -1412,7 +1415,7 @@ void game_menus::inv::swap_letters( player &p ) static item_location autodoc_internal( player &u, player &patient, const inventory_selector_preset &preset, - int radius ) + int radius, bool uninstall = false ) { inventory_pick_selector inv_s( u, preset ); std::string hint; @@ -1434,11 +1437,21 @@ static item_location autodoc_internal( player &u, player &patient, drug_count += anesthesia_item->ammo_remaining(); } } - drug_count += b_filter.size(); // legacy - hint = string_format( _( "Available anesthesia: %i" ), drug_count ); + + if( b_filter.size() > 0 ) { + hint = string_format( _( "Available kit: %i" ), b_filter.size() );// legacy + } else { + hint = string_format( _( "Available anesthetic: %i mL" ), drug_count ); + } + + } + + if( uninstall ) { + inv_s.set_title( string_format( _( "Bionic removal patient: %s" ), patient.get_name() ) ); + } else { + inv_s.set_title( string_format( _( "Bionic installation patient: %s" ), patient.get_name() ) ); } - inv_s.set_title( string_format( _( "Bionic installation patient: %s" ), patient.get_name() ) ); inv_s.set_hint( hint ); inv_s.set_display_stats( false ); @@ -1516,6 +1529,8 @@ class bionic_install_preset: public inventory_selector_preset return _( "Superior version installed" ); } else if( pa.is_npc() && !bid->npc_usable ) { return _( "CBM not compatible with patient" ); + } else if( !p.has_enough_anesth( itemtype ) ) { + return string_format( _( "%i mL" ), itemtype->bionic->difficulty * 40 ); } return std::string(); @@ -1528,9 +1543,8 @@ class bionic_install_preset: public inventory_selector_preset private: // Returns a formatted string of how long the operation will take. std::string get_operation_duration( const item_location &loc ) { - const item *it = loc.get_item(); - const itype *itemtype = it->type; - const int difficulty = itemtype->bionic->difficulty; + + const int difficulty = loc.get_item()->type->bionic->difficulty; // 20 minutes per bionic difficulty. int hours = difficulty / 3; @@ -1556,11 +1570,11 @@ class bionic_install_preset: public inventory_selector_preset // Failure chance for bionic install. Combines multiple other functions together. std::string get_failure_chance( const item_location &loc ) { - const item *it = loc.get_item(); - const itype *itemtype = it->type; - const int difficulty = itemtype->bionic->difficulty; + + const int difficulty = loc.get_item()->type->bionic->difficulty; int chance_of_failure = 100; player &installer = p; + const int assist_bonus = installer.get_effect_int( effect_assisted ); const int adjusted_skill = installer.bionics_adjusted_skill( skill_firstaid, skill_computer, @@ -1571,7 +1585,7 @@ class bionic_install_preset: public inventory_selector_preset g->u.has_trait( trait_id( "DEBUG_BIONICS" ) ) ) { chance_of_failure = 0; } else { - float skill_difficulty_parameter = static_cast( adjusted_skill / + float skill_difficulty_parameter = static_cast( ( adjusted_skill + assist_bonus ) / ( 4.0 * difficulty ) ); chance_of_failure = 100 - static_cast( ( 100 * skill_difficulty_parameter ) / ( skill_difficulty_parameter + sqrt( 1 / skill_difficulty_parameter ) ) ); @@ -1581,12 +1595,18 @@ class bionic_install_preset: public inventory_selector_preset } std::string get_anesth_amount( const item_location &loc ) { - const item *it = loc.get_item(); - const itype *itemtype = it->type; - const int difficulty = itemtype->bionic->difficulty; - int amount = difficulty * 40; - return string_format( _( "%i mL" ), amount ); + const int amount = loc.get_item()->type->bionic->difficulty * 40; + + std::vector b_filter = p.crafting_inventory().items_with( []( const item & it ) { + return it.has_flag( "ANESTHESIA" ); // legacy + } ); + + if( b_filter.size() > 0 ) { + return string_format( _( "kit available" ) );// legacy + } else { + return string_format( _( "%i mL" ), amount ); + } } }; @@ -1594,3 +1614,117 @@ item_location game_menus::inv::install_bionic( player &p, player &patient ) { return autodoc_internal( p, patient, bionic_install_preset( p, patient ), 5 ); } + +// Menu used by autodoc when uninstalling a bionic +class bionic_uninstall_preset : public inventory_selector_preset +{ + public: + bionic_uninstall_preset( player &pl, player &patient ) : + p( pl ), pa( patient ) { + append_cell( [this]( const item_location & loc ) { + return get_failure_chance( loc ); + }, _( "FAILURE CHANCE" ) ); + + append_cell( [this]( const item_location & loc ) { + return get_operation_duration( loc ); + }, _( "OPERATION DURATION" ) ); + + append_cell( [this]( const item_location & loc ) { + return get_anesth_amount( loc ); + }, _( "ANESTHETIC REQUIRED" ) ); + } + + bool is_shown( const item_location &loc ) const override { + return loc->has_flag( "IN_CBM" ); + } + + std::string get_denial( const item_location &loc ) const override { + const itype *itemtype = loc.get_item()->type; + + if( !p.has_enough_anesth( itemtype ) ) { + return string_format( _( "%i mL" ), itemtype->bionic->difficulty * 40 ); + } + + return std::string(); + } + + protected: + player &p; + player &pa; + + private: + // Returns a formatted string of how long the operation will take. + std::string get_operation_duration( const item_location &loc ) { + + const int difficulty = loc.get_item()->type->bionic->difficulty; + + // 20 minutes per bionic difficulty. + int hours = difficulty / 3; + int minutes = ( difficulty % 3 ) * 20; + std::string minutes_string = minutes > 0 + ? string_format( _( "%i minutes" ), minutes ) + : std::string(); + + if( hours > 0 ) { + std::string hours_string = hours >= 2 + ? string_format( _( "%i hours" ), hours ) + : string_format( _( "%i hour" ), hours ); + + if( minutes > 0 ) { + return string_format( _( "%s, %s" ), hours_string, minutes_string ); + } else { + return hours_string; + } + } else { + return minutes_string; + } + } + + // Failure chance for bionic uninstall. Combines multiple other functions together. + std::string get_failure_chance( const item_location &loc ) { + + // Uninstall difficulty gets a +2 + const int difficulty = loc.get_item()->type->bionic->difficulty + 2; + int chance_of_failure = 100; + player &installer = p; + const int assist_bonus = installer.get_effect_int( effect_assisted ); + + const int adjusted_skill = installer.bionics_adjusted_skill( skill_firstaid, + skill_computer, + skill_electronics, + -1 ); + + if( ( get_option < bool >( "SAFE_AUTODOC" ) ) || + g->u.has_trait( trait_id( "DEBUG_BIONICS" ) ) ) { + chance_of_failure = 0; + } else { + float skill_difficulty_parameter = static_cast( ( adjusted_skill + assist_bonus ) / + ( 4.0 * difficulty ) ); + chance_of_failure = 100 - static_cast( ( 100 * skill_difficulty_parameter ) / + ( skill_difficulty_parameter + sqrt( 1 / skill_difficulty_parameter ) ) ); + } + + return string_format( _( "%i%%" ), chance_of_failure ); + } + + std::string get_anesth_amount( const item_location &loc ) { + + const int amount = loc.get_item()->type->bionic->difficulty * 40; + + std::vector b_filter = p.crafting_inventory().items_with( []( const item & it ) { + return it.has_flag( "ANESTHESIA" ); // legacy + } ); + + if( b_filter.size() > 0 ) { + return string_format( _( "kit available" ) ); // legacy + } else { + return string_format( _( "%i mL" ), amount ); + } + } +}; + +item_location game_menus::inv::uninstall_bionic( player &p, player &patient ) +{ + return autodoc_internal( p, patient, bionic_uninstall_preset( p, patient ), 0, true ); +} + diff --git a/src/game_inventory.h b/src/game_inventory.h index 654fca54ea75b..0945e7171ad99 100644 --- a/src/game_inventory.h +++ b/src/game_inventory.h @@ -98,10 +98,12 @@ item_location salvage( player &p, const salvage_actor *actor ); item_location repair( player &p, const repair_item_actor *actor, const item *main_tool ); /** Bionic install menu. */ item_location install_bionic( player &p, player &patient ); +/** Bionic uninstall menu. */ +item_location uninstall_bionic( player &p, player &patient ); /*@}*/ -} +} // namespace inv -} +} // namespace game_menus #endif // GAME_INVENTORY_H diff --git a/src/game_ui.h b/src/game_ui.h index 72c7a81f1a233..a61f6508905ee 100644 --- a/src/game_ui.h +++ b/src/game_ui.h @@ -5,7 +5,7 @@ namespace game_ui { void init_ui(); -} +} // namespace game_ui // defined in sdltiles.cpp void to_map_font_dim_width( int &w ); diff --git a/src/gamemode.h b/src/gamemode.h index e7aff9bd536b1..8d34cdec23e6d 100644 --- a/src/gamemode.h +++ b/src/gamemode.h @@ -163,9 +163,9 @@ struct defense_game : public special_game { time_duration time_between_waves; // Cooldown / building / healing time int waves_between_caravans; // How many waves until we get to trade? - signed long initial_cash; // How much cash do we start with? - signed long cash_per_wave; // How much cash do we get per wave? - signed long cash_increase; // How much does the above increase per wave? + int initial_cash; // How much cash do we start with? + int cash_per_wave; // How much cash do we get per wave? + int cash_increase; // How much does the above increase per wave? bool zombies; bool specials; diff --git a/src/gates.cpp b/src/gates.cpp index 9cf8dee2d626b..5fd82764dcaf7 100644 --- a/src/gates.cpp +++ b/src/gates.cpp @@ -316,7 +316,7 @@ void doors::close_door( map &m, Character &who, const tripoint &closep ) m.close_door( closep, inside, false ); didit = true; who.add_msg_if_player( m_info, _( "You push the %s out of the way." ), - items_in_way.size() == 1 ? items_in_way[0].tname() : _( "stuff" ) ); + items_in_way.size() == 1 ? items_in_way.only_item().tname() : _( "stuff" ) ); who.mod_moves( -std::min( items_in_way.stored_volume() / ( max_nudge / 50 ), 100 ) ); if( m.has_flag( "NOITEM", closep ) ) { diff --git a/src/gates.h b/src/gates.h index 31fc9b5461ac3..c65138fade679 100644 --- a/src/gates.h +++ b/src/gates.h @@ -22,7 +22,7 @@ void open_gate( const tripoint &pos, player &p ); /** opens the gate immediately */ void open_gate( const tripoint &pos ); -} +} // namespace gates namespace doors { @@ -33,6 +33,6 @@ namespace doors */ void close_door( map &m, Character &who, const tripoint &closep ); -} +} // namespace doors #endif diff --git a/src/handle_action.cpp b/src/handle_action.cpp index 95e5af2161f7a..7df348a14833d 100644 --- a/src/handle_action.cpp +++ b/src/handle_action.cpp @@ -673,7 +673,7 @@ static void smash() if( vol > 20 ) { // Hurt left arm too, if it was big u.deal_damage( nullptr, bp_hand_l, damage_instance( DT_CUT, rng( 0, - static_cast( vol * .5 ) ) ) ); + static_cast( vol * .5 ) ) ) ); } u.remove_weapon(); u.check_dead_state(); @@ -835,7 +835,8 @@ static void sleep() // List all active items, bionics or mutations so player can deactivate them std::vector active; for( auto &it : u.inv_dump() ) { - if( it->active && it->charges > 0 && it->is_tool_reversible() ) { + if( it->active && ( it->charges > 0 || it->ammo_remaining() > 0 ) && + it->is_transformable() ) { active.push_back( it->tname() ); } } @@ -936,6 +937,7 @@ static void loot() PlantPlots = 8, FertilizePlots = 16, HarvestPlots = 32, + ConstructPlots = 64, }; auto just_one = []( int flags ) { @@ -963,6 +965,9 @@ static void loot() flags |= FertilizePlots; flags |= HarvestPlots; } + flags |= g->check_near_zone( zone_type_id( "CONSTRUCTION_BLUEPRINT" ), + u.pos() ) ? ConstructPlots : 0; + if( flags == 0 ) { add_msg( m_info, _( "There is no compatible zone nearby." ) ); @@ -1004,6 +1009,10 @@ static void loot() menu.addentry_desc( HarvestPlots, true, 'h', _( "Harvest plots" ), _( "Harvest any full-grown plants from nearby Farm: Plot zones" ) ); } + if( flags & ConstructPlots ) { + menu.addentry_desc( ConstructPlots, true, 'c', _( "Construct Plots" ), + _( "Work on any nearby Blueprint: construction zones" ) ); + } menu.query(); flags = ( menu.ret >= 0 ) ? menu.ret : None; @@ -1038,6 +1047,9 @@ static void loot() case HarvestPlots: u.assign_activity( activity_id( "ACT_HARVEST_PLOT" ) ); break; + case ConstructPlots: + u.assign_activity( activity_id( "ACT_BLUEPRINT_CONSTRUCTION" ) ); + break; default: debugmsg( "Unsupported flag" ); break; @@ -1479,6 +1491,9 @@ bool game::handle_action() const std::string &&name = inp_mngr.get_keyname( ch, evt.type, true ); if( !get_option( "NO_UNKNOWN_COMMAND_MSG" ) ) { add_msg( m_info, _( "Unknown command: \"%s\" (%ld)" ), name, ch ); + add_msg( m_info, _( "%s at any time to see and edit keybindings relevant to " + "the current context." ), + press_x( ACTION_KEYBINDINGS ) ); } } return false; @@ -1849,7 +1864,7 @@ bool game::handle_action() } else if( u.ammo_location && opt.ammo == u.ammo_location ) { u.ammo_location = item_location(); } else { - u.ammo_location = opt.ammo.clone(); + u.ammo_location = opt.ammo; } } } @@ -1933,10 +1948,8 @@ bool game::handle_action() add_msg( m_info, _( "You can't construct while you're in your shell." ) ); } else if( u.has_effect( effect_riding ) ) { add_msg( m_info, _( "You can't construct while you're riding." ) ); - } else 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." ) ); } else { - construction_menu(); + construction_menu( false ); } break; diff --git a/src/handle_liquid.cpp b/src/handle_liquid.cpp index f53adb2adf30e..10dd5b44296bb 100644 --- a/src/handle_liquid.cpp +++ b/src/handle_liquid.cpp @@ -91,7 +91,7 @@ bool consume_liquid( item &liquid, const int radius ) return original_charges != liquid.charges; } -bool handle_liquid_from_ground( std::list::iterator on_ground, +bool handle_liquid_from_ground( map_stack::iterator on_ground, const tripoint &pos, const int radius ) { @@ -381,4 +381,4 @@ bool handle_liquid( item &liquid, item *const source, const int radius, } return false; } -} +} // namespace liquid_handler diff --git a/src/handle_liquid.h b/src/handle_liquid.h index 91cc2bfcdbb7f..fa907f0e1019e 100644 --- a/src/handle_liquid.h +++ b/src/handle_liquid.h @@ -2,10 +2,11 @@ #ifndef HANDLE_LIQUID_H #define HANDLE_LIQUID_H -#include "item_location.h" - #include +#include "item_location.h" +#include "map.h" + class item; class monster; class vehicle; @@ -68,7 +69,7 @@ bool consume_liquid( item &liquid, int radius = 0 ); * The iterator is invalidated in that case. Otherwise the item remains but may have * fewer charges. */ -bool handle_liquid_from_ground( std::list::iterator on_ground, const tripoint &pos, +bool handle_liquid_from_ground( map_stack::iterator on_ground, const tripoint &pos, int radius = 0 ); /** @@ -111,6 +112,6 @@ bool handle_liquid( item &liquid, item *source = nullptr, int radius = 0, const tripoint *source_pos = nullptr, const vehicle *source_veh = nullptr, const int part_num = -1, const monster *source_mon = nullptr ); -} +} // namespace liquid_handler #endif diff --git a/src/iexamine.cpp b/src/iexamine.cpp index c907479c5f615..ef21fc8b6e694 100644 --- a/src/iexamine.cpp +++ b/src/iexamine.cpp @@ -815,6 +815,52 @@ void iexamine::cardreader_robofac( player &p, const tripoint &examp ) } } +void iexamine::cardreader_foodplace( player &p, const tripoint &examp ) +{ + bool open = false; + if( ( p.is_wearing( itype_id( "foodperson_mask" ) ) || + p.is_wearing( itype_id( "foodperson_mask_on" ) ) ) && + query_yn( _( "Press mask on the reader?" ) ) ) { + p.mod_moves( -100 ); + for( const tripoint &tmp : g->m.points_in_radius( examp, 3 ) ) { + if( g->m.ter( tmp ) == t_door_metal_locked ) { + g->m.ter_set( tmp, t_door_metal_c ); + open = true; + } + } + if( open ) { + add_msg( _( "You press your face on the reader." ) ); + add_msg( m_good, _( "The nearby doors are unlocked." ) ); + sounds::sound( examp, 6, sounds::sound_t::speech, _( "\"Hello Foodperson. Welcome home.\"" ), true, + "speech", "welcome" ); + } else { + add_msg( _( "The nearby doors are already unlocked." ) ); + if( query_yn( _( "Lock doors?" ) ) ) { + for( const tripoint &tmp : g->m.points_in_radius( examp, 3 ) ) { + if( g->m.ter( tmp ) == t_door_metal_o || g->m.ter( tmp ) == t_door_metal_c ) { + if( p.pos() == tmp ) { + p.add_msg_if_player( m_bad, _( "You are in the way of the door, move before trying again." ) ); + } else { + g->m.ter_set( tmp, t_door_metal_locked ); + } + } + } + } + } + } else if( p.has_amount( itype_id( "foodperson_mask" ), 1 ) || + p.has_amount( itype_id( "foodperson_mask_on" ), 1 ) ) { + sounds::sound( examp, 6, sounds::sound_t::speech, + _( "\"FOODPERSON DETECTED. Please make yourself presentable.\"" ), true, + "speech", "welcome" ); + } else { + sounds::sound( examp, 6, sounds::sound_t::speech, + _( "\"Your face is inadequate. Please go away.\"" ), true, + "speech", "welcome" ); + p.assign_activity( activity_id( "ACT_HACK_DOOR" ), to_moves( 5_minutes ) ); + p.activity.placement = examp; + } +} + void iexamine::intercom( player &p, const tripoint &examp ) { const std::vector intercom_npcs = g->get_npcs_if( [examp]( const npc & guy ) { @@ -1295,9 +1341,8 @@ void iexamine::pedestal_wyrm( player &p, const tripoint &examp ) */ void iexamine::pedestal_temple( player &p, const tripoint &examp ) { - - if( g->m.i_at( examp ).size() == 1 && - g->m.i_at( examp )[0].typeId() == "petrified_eye" ) { + map_stack items = g->m.i_at( examp ); + if( !items.empty() && items.only_item().typeId() == "petrified_eye" ) { add_msg( _( "The pedestal sinks into the ground..." ) ); g->m.ter_set( examp, t_dirt ); g->m.i_clear( examp ); @@ -1959,19 +2004,20 @@ std::list iexamine::get_harvest_items( const itype &type, const int plant_ */ void iexamine::harvest_plant( player &p, const tripoint &examp ) { - if( g->m.i_at( examp ).empty() ) { + // Can't use item_stack::only_item() since there might be fertilizer + map_stack items = g->m.i_at( examp ); + const map_stack::iterator seed = std::find_if( items.begin(), items.end(), []( const item & it ) { + return it.is_seed(); + } ); + + if( seed == items.end() ) { + debugmsg( "Missing seed for plant at (%d, %d, %d)", examp.x, examp.y, examp.z ); g->m.i_clear( examp ); g->m.furn_set( examp, f_null ); - debugmsg( "Missing seed in plant furniture!" ); - return; - } - const item &seed = g->m.i_at( examp ).front(); - if( !seed.is_seed() ) { - debugmsg( "The seed item %s is not a seed!", seed.tname() ); return; } - const std::string &seedType = seed.typeId(); + const std::string &seedType = seed->typeId(); if( seedType == "fungal_seeds" ) { fungus( p, examp ); g->m.i_clear( examp ); @@ -1995,7 +2041,7 @@ void iexamine::harvest_plant( player &p, const tripoint &examp ) add_msg( m_info, _( "The seed blossoms into a flower-looking fungus." ) ); } } else { // Generic seed, use the seed item data - const itype &type = *seed.type; + const itype &type = *seed->type; g->m.i_clear( examp ); int skillLevel = p.get_skill_level( skill_survival ); @@ -2049,9 +2095,20 @@ void iexamine::fertilize_plant( player &p, const tripoint &tile, const itype_id // 20% of a seasons length. (default 2.8 days). const time_duration fertilizerEpoch = calendar::season_length() * 0.2; - item &seed = g->m.i_at( tile ).front(); + // Can't use item_stack::only_item() since there might be fertilizer + map_stack items = g->m.i_at( tile ); + const map_stack::iterator seed = std::find_if( items.begin(), items.end(), []( const item & it ) { + return it.is_seed(); + } ); + if( seed == items.end() ) { + debugmsg( "Missing seed for plant at (%d, %d, %d)", tile.x, tile.y, tile.z ); + g->m.i_clear( tile ); + g->m.furn_set( tile, f_null ); + return; + } + // TODO: item should probably clamp the value on its own - seed.set_birthday( std::max( calendar::time_of_cataclysm, seed.birthday() - fertilizerEpoch ) ); + seed->set_birthday( std::max( calendar::time_of_cataclysm, seed->birthday() - fertilizerEpoch ) ); // The plant furniture has the NOITEM token which prevents adding items on that square, // spawned items are moved to an adjacent field instead, but the fertilizer token // must be on the square of the plant, therefore this hack: @@ -2061,7 +2118,7 @@ void iexamine::fertilize_plant( player &p, const tripoint &tile, const itype_id g->m.furn_set( tile, old_furn ); p.mod_moves( -to_moves( 10_seconds ) ); - add_msg( m_info, _( "You fertilize the %s with the %s." ), seed.get_plant_name(), + add_msg( m_info, _( "You fertilize the %s with the %s." ), seed->get_plant_name(), planted.front().tname() ); } @@ -2100,19 +2157,20 @@ itype_id iexamine::choose_fertilizer( player &p, const std::string &pname, bool } void iexamine::aggie_plant( player &p, const tripoint &examp ) { - if( g->m.i_at( examp ).empty() ) { + // Can't use item_stack::only_item() since there might be fertilizer + map_stack items = g->m.i_at( examp ); + const map_stack::iterator seed = std::find_if( items.begin(), items.end(), []( const item & it ) { + return it.is_seed(); + } ); + + if( seed == items.end() ) { + debugmsg( "Missing seed for plant at (%d, %d, %d)", examp.x, examp.y, examp.z ); g->m.i_clear( examp ); g->m.furn_set( examp, f_null ); - debugmsg( "Missing seed in plant furniture!" ); - return; - } - const item &seed = g->m.i_at( examp ).front(); - if( !seed.is_seed() ) { - debugmsg( "The seed item %s is not a seed!", seed.tname() ); return; } - const std::string pname = seed.get_plant_name(); + const std::string pname = seed->get_plant_name(); if( g->m.has_flag_furn( "GROWTH_HARVEST", examp ) && query_yn( _( "Harvest the %s?" ), pname ) ) { harvest_plant( p, examp ); @@ -2218,7 +2276,7 @@ void iexamine::kiln_full( player &, const tripoint &examp ) return; } - auto items = g->m.i_at( examp ); + map_stack items = g->m.i_at( examp ); if( items.empty() ) { add_msg( _( "This kiln is empty..." ) ); g->m.furn_set( examp, next_kiln_type ); @@ -2227,7 +2285,7 @@ void iexamine::kiln_full( player &, const tripoint &examp ) auto char_type = item::find_type( "charcoal" ); add_msg( _( "There's a charcoal kiln there." ) ); const time_duration firing_time = 6_hours; // 5 days in real life - const time_duration time_left = firing_time - items[0].age(); + const time_duration time_left = firing_time - items.only_item().age(); if( time_left > 0_turns ) { int hours = to_hours( time_left ); int minutes = to_minutes( time_left ) + 1; @@ -2372,7 +2430,7 @@ void iexamine::fvat_empty( player &p, const tripoint &examp ) if( !item_it->is_brewable() || brew_present ) { // This isn't a brew or there was already another kind of brew inside, // so this has to be moved. - items.push_back( *item_it ); + items.insert( *item_it ); // This will add items to a space near the vat, because it's flagged as NOITEM. item_it = items.erase( item_it ); } else { @@ -2416,7 +2474,7 @@ void iexamine::fvat_empty( player &p, const tripoint &examp ) brew_type = b_types[b_index]; brew_nname = item::nname( brew_type ); } else { - item &brew = g->m.i_at( examp ).front(); + item &brew = g->m.i_at( examp ).only_item(); brew_type = brew.typeId(); brew_nname = item::nname( brew_type ); charges_on_ground = brew.charges; @@ -2472,7 +2530,7 @@ void iexamine::fvat_empty( player &p, const tripoint &examp ) } } if( vat_full || ferment ) { - g->m.i_at( examp ).front().set_age( 0_turns ); + g->m.i_at( examp ).only_item().set_age( 0_turns ); g->m.furn_set( examp, f_fvat_full ); if( vat_full ) { add_msg( _( "The vat is full, so you close the lid and start the fermenting cycle." ) ); @@ -2484,20 +2542,18 @@ void iexamine::fvat_empty( player &p, const tripoint &examp ) void iexamine::fvat_full( player &p, const tripoint &examp ) { - auto items_here = g->m.i_at( examp ); + map_stack items_here = g->m.i_at( examp ); if( items_here.empty() ) { debugmsg( "fvat_full was empty!" ); g->m.furn_set( examp, f_fvat_empty ); return; } - for( size_t i = 0; i < items_here.size(); i++ ) { - auto &it = items_here[i]; + for( item &it : items_here ) { if( !it.made_of_from_type( LIQUID ) ) { add_msg( _( "You remove %s from the vat." ), it.tname() ); g->m.add_item_or_charges( p.pos(), it ); - g->m.i_rem( examp, i ); - i--; + g->m.i_rem( examp, &it ); } } @@ -2506,7 +2562,7 @@ void iexamine::fvat_full( player &p, const tripoint &examp ) return; } - item &brew_i = items_here.front(); + item &brew_i = *items_here.begin(); // Does the vat contain unfermented brew, or already fermented booze? // TODO: Allow "recursive brewing" to continue without player having to check on it if( brew_i.is_brewable() ) { @@ -2549,7 +2605,7 @@ void iexamine::fvat_full( player &p, const tripoint &examp ) add_msg( _( "There's a vat of fermented %s there." ), brew_i.tname() ); } - const std::string booze_name = items_here.front().tname(); + const std::string booze_name = brew_i.tname(); if( liquid_handler::handle_liquid_from_ground( items_here.begin(), examp ) ) { g->m.furn_set( examp, f_fvat_empty ); add_msg( _( "You squeeze the last drops of %s from the vat." ), booze_name ); @@ -2570,21 +2626,41 @@ bool iexamine::has_keg( const tripoint &pos ) return get_keg_capacity( pos ) > 0_ml; } -void iexamine::keg( player &p, const tripoint &examp ) +static void displace_items_except_one_liquid( const tripoint &examp ) { - none( p, examp ); - const auto keg_name = g->m.name( examp ); - units::volume keg_cap = get_keg_capacity( examp ); + // Temporarily replace the real furniture with a fake furniture with NOITEM + const furn_id previous_furn = g->m.furn( examp ); + g->m.furn_set( examp, furn_id( "f_no_item" ) ); + bool liquid_present = false; - for( int i = 0; i < static_cast( g->m.i_at( examp ).size() ); i++ ) { - if( !g->m.i_at( examp )[i].made_of_from_type( LIQUID ) || liquid_present ) { - g->m.add_item_or_charges( examp, g->m.i_at( examp )[i] ); - g->m.i_rem( examp, i ); - i--; + map_stack items = g->m.i_at( examp ); + for( map_stack::iterator it = items.begin(); it != items.end(); ) { + if( !it->made_of_from_type( LIQUID ) || liquid_present ) { + // This isn't a liquid or there was already another kind of liquid inside, + // so this has to be moved. + // This will add items to a space near the vat, because it's flagged as NOITEM. + items.insert( *it ); + it = items.erase( it ); } else { + it++; liquid_present = true; } } + + // Replace the real furniture + g->m.furn_set( examp, previous_furn ); +} + +void iexamine::keg( player &p, const tripoint &examp ) +{ + none( p, examp ); + const auto keg_name = g->m.name( examp ); + units::volume keg_cap = get_keg_capacity( examp ); + + const bool liquid_present = map_cursor( examp ).has_item_with( []( const item & it ) { + return it.made_of_from_type( LIQUID ); + } ); + if( !liquid_present ) { add_msg( m_info, _( "It is empty." ) ); // Get list of all drinks @@ -2627,6 +2703,10 @@ void iexamine::keg( player &p, const tripoint &examp ) if( drink_index < 0 ) { return; } + + // First empty the keg of foreign objects + displace_items_except_one_liquid( examp ); + //Store liquid chosen in the keg itype_id drink_type = drink_types[ drink_index ]; int charges_held = p.charges_of( drink_type ); @@ -2651,9 +2731,13 @@ void iexamine::keg( player &p, const tripoint &examp ) g->m.add_item( examp, drink ); return; } else { - auto drink = g->m.i_at( examp ).begin(); - const auto drink_tname = drink->tname(); - const auto drink_nname = item::nname( drink->typeId() ); + // First empty the keg of foreign objects + displace_items_except_one_liquid( examp ); + + map_stack items = g->m.i_at( examp ); + item &drink = items.only_item(); + const std::string drink_tname = drink.tname(); + const std::string drink_nname = item::nname( drink.typeId() ); enum options { DISPENSE, HAVE_A_DRINK, @@ -2661,9 +2745,9 @@ void iexamine::keg( player &p, const tripoint &examp ) EXAMINE, }; uilist selectmenu; - selectmenu.addentry( DISPENSE, drink->made_of( LIQUID ), MENU_AUTOASSIGN, + selectmenu.addentry( DISPENSE, drink.made_of( LIQUID ), MENU_AUTOASSIGN, _( "Dispense or dump %s" ), drink_tname ); - selectmenu.addentry( HAVE_A_DRINK, drink->is_food() && drink->made_of( LIQUID ), + selectmenu.addentry( HAVE_A_DRINK, drink.is_food() && drink.made_of( LIQUID ), MENU_AUTOASSIGN, _( "Have a drink" ) ); selectmenu.addentry( REFILL, true, MENU_AUTOASSIGN, _( "Refill" ) ); selectmenu.addentry( EXAMINE, true, MENU_AUTOASSIGN, _( "Examine" ) ); @@ -2673,18 +2757,18 @@ void iexamine::keg( player &p, const tripoint &examp ) switch( selectmenu.ret ) { case DISPENSE: - if( liquid_handler::handle_liquid_from_ground( drink, examp ) ) { + if( liquid_handler::handle_liquid_from_ground( items.begin(), examp ) ) { add_msg( _( "You squeeze the last drops of %1$s from the %2$s." ), drink_tname, keg_name ); } return; case HAVE_A_DRINK: - if( !p.eat( *drink ) ) { + if( !p.eat( drink ) ) { return; // They didn't actually drink } - if( drink->charges == 0 ) { + if( drink.charges == 0 ) { add_msg( _( "You squeeze the last drops of %1$s from the %2$s." ), drink_tname, keg_name ); g->m.i_clear( examp ); @@ -2693,19 +2777,19 @@ void iexamine::keg( player &p, const tripoint &examp ) return; case REFILL: { - if( drink->volume() >= keg_cap ) { + if( drink.volume() >= keg_cap ) { add_msg( _( "The %s is completely full." ), keg_name ); return; } - int charges_held = p.charges_of( drink->typeId() ); + int charges_held = p.charges_of( drink.typeId() ); if( charges_held < 1 ) { add_msg( m_info, _( "You don't have any %1$s to fill the %2$s with." ), drink_nname, keg_name ); return; } - item tmp( drink->typeId(), calendar::turn, charges_held ); + item tmp( drink.typeId(), calendar::turn, charges_held ); pour_into_keg( examp, tmp ); - p.use_charges( drink->typeId(), charges_held - tmp.charges ); + p.use_charges( drink.typeId(), charges_held - tmp.charges ); add_msg( _( "You fill the %1$s with %2$s." ), keg_name, drink_nname ); p.moves -= to_moves( 10_seconds ); return; @@ -2713,7 +2797,7 @@ void iexamine::keg( player &p, const tripoint &examp ) case EXAMINE: { add_msg( m_info, _( "It contains %s (%d), %0.f%% full." ), - drink_tname, drink->charges, drink->volume() * 100.0 / keg_cap ); + drink_tname, drink.charges, drink.volume() * 100.0 / keg_cap ); return; } @@ -2739,14 +2823,14 @@ bool iexamine::pour_into_keg( const tripoint &pos, item &liquid ) map_stack stack = g->m.i_at( pos ); if( stack.empty() ) { g->m.add_item( pos, liquid ); - g->m.i_at( pos ).front().charges = 0; // Will be set later - } else if( stack.front().typeId() != liquid.typeId() ) { + g->m.i_at( pos ).only_item().charges = 0; // Will be set later + } else if( stack.only_item().typeId() != liquid.typeId() ) { add_msg( _( "The %s already contains some %s, you can't add a different liquid to it." ), - keg_name, item::nname( stack.front().typeId() ) ); + keg_name, item::nname( stack.only_item().typeId() ) ); return false; } - item &drink = stack.front(); + item &drink = stack.only_item(); if( drink.volume() >= keg_cap ) { add_msg( _( "The %s is full." ), keg_name ); return false; @@ -2862,15 +2946,16 @@ void iexamine::tree_maple( player &p, const tripoint &examp ) void iexamine::tree_maple_tapped( player &p, const tripoint &examp ) { bool has_sap = false; - bool has_container = false; + item *container = nullptr; int charges = 0; const std::string maple_sap_name = item::nname( "maple_sap" ); - auto items = g->m.i_at( examp ); - for( auto &it : items ) { + map_stack items = g->m.i_at( examp ); + if( !items.empty() ) { + item &it = items.only_item(); if( it.is_bucket() || it.is_watertight_container() ) { - has_container = true; + container = ⁢ if( !it.is_container_empty() && it.contents.front().typeId() == "maple_sap" ) { has_sap = true; @@ -2887,11 +2972,11 @@ void iexamine::tree_maple_tapped( player &p, const tripoint &examp ) }; uilist selectmenu; selectmenu.addentry( REMOVE_TAP, true, MENU_AUTOASSIGN, _( "Remove tap" ) ); - selectmenu.addentry( ADD_CONTAINER, !has_container, MENU_AUTOASSIGN, + selectmenu.addentry( ADD_CONTAINER, !container, MENU_AUTOASSIGN, _( "Add a container to receive the %s" ), maple_sap_name ); selectmenu.addentry( HARVEST_SAP, has_sap, MENU_AUTOASSIGN, _( "Harvest current %s (%d)" ), maple_sap_name, charges ); - selectmenu.addentry( REMOVE_CONTAINER, has_container, MENU_AUTOASSIGN, _( "Remove container" ) ); + selectmenu.addentry( REMOVE_CONTAINER, container, MENU_AUTOASSIGN, _( "Remove container" ) ); selectmenu.text = _( "Select an action" ); selectmenu.query(); @@ -2907,8 +2992,8 @@ void iexamine::tree_maple_tapped( player &p, const tripoint &examp ) add_msg( _( "You remove the %s." ), tree_spile.tname( 1 ) ); g->m.add_item_or_charges( p.pos(), tree_spile ); - for( auto &it : items ) { - g->m.add_item_or_charges( p.pos(), it ); + if( container ) { + g->m.add_item_or_charges( p.pos(), *container ); } g->m.i_clear( examp ); @@ -2921,7 +3006,7 @@ void iexamine::tree_maple_tapped( player &p, const tripoint &examp ) case ADD_CONTAINER: { auto cont_loc = maple_tree_sap_container(); - item *container = cont_loc.get_item(); + container = cont_loc.get_item(); if( container ) { g->m.add_item_or_charges( examp, *container, false ); @@ -2933,23 +3018,14 @@ void iexamine::tree_maple_tapped( player &p, const tripoint &examp ) return; } - case HARVEST_SAP: - for( auto &it : items ) { - if( ( it.is_bucket() || it.is_watertight_container() ) && !it.is_container_empty() ) { - auto &liquid = it.contents.front(); - if( liquid.typeId() == "maple_sap" ) { - liquid_handler::handle_liquid_from_container( it, PICKUP_RANGE ); - } - } - } - + case HARVEST_SAP: { + liquid_handler::handle_liquid_from_container( *container, PICKUP_RANGE ); return; + } case REMOVE_CONTAINER: { g->u.assign_activity( activity_id( "ACT_PICKUP" ) ); - g->u.activity.placement = examp - p.pos(); - g->u.activity.values.push_back( false ); - g->u.activity.values.push_back( 0 ); + g->u.activity.targets.emplace_back( map_cursor( examp ), container ); g->u.activity.values.push_back( 0 ); return; } @@ -3230,9 +3306,7 @@ void iexamine::reload_furniture( player &p, const tripoint &examp ) if( p.query_yn( _( "The %1$s contains %2$d %3$s. Unload?" ), f.name(), amount_in_furn, ammo->nname( amount_in_furn ) ) ) { p.assign_activity( activity_id( "ACT_PICKUP" ) ); - p.activity.placement = examp - p.pos(); - p.activity.values.push_back( false ); - p.activity.values.push_back( 0 ); + p.activity.targets.emplace_back( map_cursor( examp ), &g->m.i_at( examp ).only_item() ); p.activity.values.push_back( 0 ); return; } @@ -3910,10 +3984,10 @@ static player &best_installer( player &p, player &null_player, int difficulty ) skill_computer, skill_electronics ); - std::vector< std::pair> ally_skills; + std::vector< std::pair> ally_skills; ally_skills.reserve( g->allies().size() ); for( size_t i = 0; i < g->allies().size() ; i ++ ) { - std::pair ally_skill; + std::pair ally_skill; const npc *e = g->allies()[ i ]; player &ally = *g->critter_by_id( e->getID() ); @@ -3923,8 +3997,8 @@ static player &best_installer( player &p, player &null_player, int difficulty ) skill_electronics ); ally_skills.push_back( ally_skill ); } - std::sort( ally_skills.begin(), ally_skills.end(), [&]( const std::pair &lhs, - const std::pair &rhs ) { + std::sort( ally_skills.begin(), ally_skills.end(), [&]( const std::pair &lhs, + const std::pair &rhs ) { return rhs.first < lhs.first; } ); int player_cos = bionic_manip_cos( player_skill, true, difficulty ); @@ -4054,10 +4128,6 @@ void iexamine::autodoc( player &p, const tripoint &examp ) for( const item *anesthesia_item : b_filter ) { acomps.push_back( item_comp( anesthesia_item->typeId(), 1 ) ); // legacy } - if( anesth_kit.empty() && acomps.empty() ) { - popup( _( "You need an anesthesia kit with at least one charge for autodoc to perform any bionic manipulation." ) ); - return; - } } switch( amenu.ret ) { @@ -4070,37 +4140,7 @@ void iexamine::autodoc( player &p, const tripoint &examp ) const item *it = bionic.get_item(); const itype *itemtype = it->type; - const bionic_id &bid = itemtype->bionic->id; - - if( patient.is_npc() && !bid->npc_usable ) { - //~ %1$s is the bionic CBM display name, %2$s is the patient name - popup( _( "%1$s cannot be installed on %2$s." ), it->display_name(), patient.name ); - return; - } - if( patient.has_bionic( bid ) ) { - //~ %1$s is patient name - popup_player_or_npc( patient, _( "You have already installed this bionic." ), - _( "%1$s has already installed this bionic." ) ); - return; - } else if( bid->upgraded_bionic && !patient.has_bionic( bid->upgraded_bionic ) && - it->is_upgrade() ) { - //~ %1$s is patient name - popup_player_or_npc( patient, _( "You have no base version of this bionic to upgrade." ), - _( "%1$s has no base version of this bionic to upgrade." ) ); - return; - } else { - const bool downgrade = std::any_of( bid->available_upgrades.begin(), - bid->available_upgrades.end(), - std::bind( &player::has_bionic, &patient, - std::placeholders::_1 ) ); - if( downgrade ) { - //~ %1$s is patient name - popup_player_or_npc( patient, _( "You have already installed a superior version of this bionic." ), - _( "%1$s has installed a superior version of this bionic." ) ); - return; - } - } player &installer = best_installer( p, null_player, itemtype->bionic->difficulty ); if( &installer == &null_player ) { return; @@ -4108,12 +4148,8 @@ void iexamine::autodoc( player &p, const tripoint &examp ) const time_duration duration = itemtype->bionic->difficulty * 20_minutes; const float volume_anesth = itemtype->bionic->difficulty * 20 * 2; // 2ml/min - if( needs_anesthesia && volume_anesth > drug_count && acomps.empty() ) { - add_msg( m_bad, "You don't have enough anesthetic for this operation." ); - return; - } - if( patient.install_bionics( ( *itemtype ), installer, true ) ) { + if( patient.can_install_bionics( ( *itemtype ), installer, true ) ) { patient.introduce_into_anesthesia( duration, installer, needs_anesthesia ); std::vector comps; comps.push_back( item_comp( it->typeId(), 1 ) ); @@ -4128,6 +4164,7 @@ void iexamine::autodoc( player &p, const tripoint &examp ) } } + patient.install_bionics( ( *itemtype ), installer, true ); installer.mod_moves( -to_moves( 1_minutes ) ); } break; @@ -4142,45 +4179,43 @@ void iexamine::autodoc( player &p, const tripoint &examp ) return; } - item bionic_to_uninstall; - std::vector bionic_types; - std::vector bionic_names; - for( auto &bio : installed_bionics ) { - if( std::find( bionic_types.begin(), bionic_types.end(), bio.id.str() ) == bionic_types.end() ) { - if( bio.id != bionic_id( "bio_power_storage" ) || - bio.id != bionic_id( "bio_power_storage_mkII" ) ) { - const auto &bio_data = bio.info(); - bionic_names.push_back( bio_data.name ); - bionic_types.push_back( bio.id.str() ); - if( item::type_is_defined( bio.id.str() ) ) { - bionic_to_uninstall = item( bio.id.str(), 0 ); - } + if( bio.id != bionic_id( "bio_power_storage" ) || + bio.id != bionic_id( "bio_power_storage_mkII" ) ) { + if( item::type_is_defined( bio.id.str() ) ) {// put cbm items in your inventory + item bionic_to_uninstall( bio.id.str(), calendar::turn ); + bionic_to_uninstall.set_flag( "IN_CBM" ); + g->u.i_add( bionic_to_uninstall ); } } } - int bionic_index = uilist( _( "Choose bionic to uninstall" ), bionic_names ); - if( bionic_index < 0 ) { + const item_location bionic = game_menus::inv::uninstall_bionic( p, patient ); + if( !bionic ) { + g->u.remove_items_with( []( const item & it ) {// remove cbm items from inventory + return it.has_flag( "IN_CBM" ); + } ); return; } + const item *it = bionic.get_item(); + const itype *itemtype = it->type; + const bionic_id &bid = itemtype->bionic->id; - const itype *itemtype = bionic_to_uninstall.type; - // Malfunctioning bionics don't have associated items and get a difficulty of 12 + g->u.remove_items_with( []( const item & it ) {// remove cbm items from inventory + return it.has_flag( "IN_CBM" ); + } ); + + // Malfunctioning bionics that don't have associated items and get a difficulty of 12 const int difficulty = itemtype->bionic ? itemtype->bionic->difficulty : 12; const time_duration duration = difficulty * 20_minutes; const float volume_anesth = difficulty * 20 * 2; // 2ml/min - if( needs_anesthesia && volume_anesth > drug_count && acomps.empty() ) { - add_msg( m_bad, "You don't have enough anesthetic for this operation." ); - return; - } player &installer = best_installer( p, null_player, difficulty ); if( &installer == &null_player ) { return; } - if( patient.uninstall_bionic( bionic_id( bionic_types[bionic_index] ), installer, true ) ) { + if( patient.can_uninstall_bionic( bid, installer, true ) ) { patient.introduce_into_anesthesia( duration, installer, needs_anesthesia ); if( needs_anesthesia ) { if( acomps.empty() ) { // consume obsolete anesthesia first @@ -4190,6 +4225,7 @@ void iexamine::autodoc( player &p, const tripoint &examp ) } } + patient.uninstall_bionic( bid, installer, true ); installer.mod_moves( -to_moves( 1_minutes ) ); } break; @@ -4250,7 +4286,7 @@ const int MIN_CHARCOAL = 100; const int CHARCOAL_PER_LITER = 25; const units::volume MAX_FOOD_VOLUME = units::from_liter( 20 ); const units::volume MAX_FOOD_VOLUME_PORTABLE = units::from_liter( 15 ); -} +} // namespace sm_rack static int get_charcoal_charges( units::volume food ) { @@ -4278,11 +4314,10 @@ static void mill_activate( player &p, const tripoint &examp ) return; } bool food_present = false; - auto items = g->m.i_at( examp ); + map_stack items = g->m.i_at( examp ); units::volume food_volume = 0_ml; - for( size_t i = 0; i < items.size(); i++ ) { - auto &it = items[i]; + for( item &it : items ) { if( it.typeId() == "flour" ) { add_msg( _( "This mill already contains flour." ) ); add_msg( _( "Remove it before starting the mill again." ) ); @@ -4298,7 +4333,7 @@ static void mill_activate( player &p, const tripoint &examp ) false ) ); add_msg( _( "You remove the %s from the mill." ), it.tname() ); g->m.add_item_or_charges( p.pos(), it ); - g->m.i_rem( examp, i ); + g->m.i_rem( examp, &it ); p.mod_moves( -p.item_handling_cost( it ) ); return; } @@ -4347,12 +4382,11 @@ static void smoker_activate( player &p, const tripoint &examp ) } bool food_present = false; bool charcoal_present = false; - auto items = g->m.i_at( examp ); + map_stack items = g->m.i_at( examp ); units::volume food_volume = 0_ml; item *charcoal = nullptr; - for( size_t i = 0; i < items.size(); i++ ) { - auto &it = items[i]; + for( item &it : items ) { if( it.has_flag( "SMOKED" ) && !it.has_flag( "SMOKABLE" ) ) { add_msg( _( "This rack already contains smoked food." ) ); add_msg( _( "Remove it before firing the smoking rack again." ) ); @@ -4372,7 +4406,7 @@ static void smoker_activate( player &p, const tripoint &examp ) false ) ); add_msg( _( "You remove %s from the rack." ), it.tname() ); g->m.add_item_or_charges( p.pos(), it ); - g->m.i_rem( examp, i ); + g->m.i_rem( examp, &it ); p.mod_moves( -p.item_handling_cost( it ) ); return; } @@ -4450,26 +4484,21 @@ void iexamine::mill_finalize( player &, const tripoint &examp, const time_point return; } - auto items = g->m.i_at( examp ); + map_stack items = g->m.i_at( examp ); if( items.empty() ) { g->m.furn_set( examp, next_mill_type ); return; } - for( auto &it : items ) { - if( it.has_flag( "MILLABLE" ) ) { + for( item &it : items ) { + if( it.has_flag( "MILLABLE" ) && it.get_comestible() ) { it.calc_rot_while_processing( 6_hours ); - } - } - for( size_t i = 0; i < items.size(); i++ ) { - auto &item_it = items[i]; - if( item_it.get_comestible() ) { - item result( "flour", start_time + 6_hours, item_it.charges * 15 ); + item result( "flour", start_time + 6_hours, it.charges * 15 ); // Set flag to tell set_relative_rot() to calc from bday not now result.set_flag( "PROCESSING_RESULT" ); - result.set_relative_rot( item_it.get_relative_rot() ); + result.set_relative_rot( it.get_relative_rot() ); result.unset_flag( "PROCESSING_RESULT" ); - item_it = result; + it = result; } } g->m.furn_set( examp, next_mill_type ); @@ -4489,31 +4518,26 @@ static void smoker_finalize( player &, const tripoint &examp, const time_point & return; } - auto items = g->m.i_at( examp ); + map_stack items = g->m.i_at( examp ); if( items.empty() ) { g->m.furn_set( examp, next_smoker_type ); return; } - for( auto &it : items ) { - if( it.has_flag( "SMOKABLE" ) ) { // Don't check charcoal - it.calc_rot_while_processing( 6_hours ); - } - } - - for( size_t i = 0; i < items.size(); i++ ) { - auto &item_it = items[i]; - if( item_it.get_comestible() ) { - if( item_it.get_comestible()->smoking_result.empty() ) { - item_it.unset_flag( "PROCESSING" ); + for( item &it : items ) { + if( it.has_flag( "SMOKABLE" ) && it.get_comestible() ) { + if( it.get_comestible()->smoking_result.empty() ) { + it.unset_flag( "PROCESSING" ); } else { - item result( item_it.get_comestible()->smoking_result, start_time + 6_hours, item_it.charges ); + it.calc_rot_while_processing( 6_hours ); + + item result( it.get_comestible()->smoking_result, start_time + 6_hours, it.charges ); // Set flag to tell set_relative_rot() to calc from bday not now result.set_flag( "SMOKING_RESULT" ); - result.set_relative_rot( item_it.get_relative_rot() ); + result.set_relative_rot( it.get_relative_rot() ); result.unset_flag( "SMOKING_RESULT" ); - item_it = result; + it = result; } } } @@ -4761,7 +4785,7 @@ void iexamine::quern_examine( player &p, const tripoint &examp ) const bool active = g->m.furn( examp ) == furn_str_id( "f_water_mill_active" ) || g->m.furn( examp ) == furn_str_id( "f_wind_mill_active" ); - auto items_here = g->m.i_at( examp ); + map_stack items_here = g->m.i_at( examp ); if( items_here.empty() && active ) { debugmsg( "active mill was empty!" ); @@ -4791,8 +4815,7 @@ void iexamine::quern_examine( player &p, const tripoint &examp ) units::volume f_volume = 0_ml; bool f_check = false; - for( size_t i = 0; i < items_here.size(); i++ ) { - auto &it = items_here[i]; + for( const item &it : items_here ) { if( it.is_food() ) { f_check = true; f_volume += it.volume(); @@ -4861,8 +4884,7 @@ void iexamine::quern_examine( player &p, const tripoint &examp ) if( items_here.empty() ) { pop << _( "... that it is empty." ); } else { - for( size_t i = 0; i < items_here.size(); i++ ) { - auto &it = items_here[i]; + for( const item &it : items_here ) { if( it.typeId() == "fake_milling_item" ) { pop << "\n " << "" << _( "You see some grains that are not yet milled to fine flour." ) << "" << @@ -4887,17 +4909,17 @@ void iexamine::quern_examine( player &p, const tripoint &examp ) mill_load_food( p, examp, remaining_capacity ); break; case 3: // remove food - for( size_t i = 0; i < items_here.size(); i++ ) { - auto &it = items_here[i]; - if( it.is_food() ) { + for( map_stack::iterator it = items_here.begin(); it != items_here.end(); ) { + if( it->is_food() ) { // get handling cost before the item reference is invalidated - const int handling_cost = -p.item_handling_cost( it ); + const int handling_cost = -p.item_handling_cost( *it ); - add_msg( _( "You remove %s from the mill." ), it.tname() ); - g->m.add_item_or_charges( p.pos(), it ); - g->m.i_rem( examp, i ); + add_msg( _( "You remove %s from the mill." ), it->tname() ); + g->m.add_item_or_charges( p.pos(), *it ); + it = items_here.erase( it ); p.mod_moves( handling_cost ); - i--; + } else { + ++it; } } if( active ) { @@ -4929,7 +4951,7 @@ void iexamine::smoker_options( player &p, const tripoint &examp ) g->m.furn( examp ) == furn_str_id( "f_metal_smoking_rack_active" ); const bool portable = g->m.furn( examp ) == furn_str_id( "f_metal_smoking_rack" ) || g->m.furn( examp ) == furn_str_id( "f_metal_smoking_rack_active" ); - auto items_here = g->m.i_at( examp ); + map_stack items_here = g->m.i_at( examp ); if( portable && items_here.empty() && active ) { debugmsg( "f_metal_smoking_rack_active was empty!" ); @@ -4960,8 +4982,7 @@ void iexamine::smoker_options( player &p, const tripoint &examp ) units::volume f_volume = 0_ml; bool f_check = false; - for( size_t i = 0; i < items_here.size(); i++ ) { - auto &it = items_here[i]; + for( const item &it : items_here ) { if( it.is_food() ) { f_check = true; f_volume += it.volume(); @@ -5068,8 +5089,7 @@ void iexamine::smoker_options( player &p, const tripoint &examp ) if( items_here.empty() ) { pop << _( "... that it is empty." ); } else { - for( size_t i = 0; i < items_here.size(); i++ ) { - auto &it = items_here[i]; + for( const item &it : items_here ) { if( it.typeId() == "fake_smoke_plume" ) { pop << "\n " << "" << _( "You see some smoldering embers there." ) << "" << "\n "; @@ -5103,17 +5123,17 @@ void iexamine::smoker_options( player &p, const tripoint &examp ) rem_f_opt = true; /* fallthrough */ case 5: { //remove charcoal - for( size_t i = 0; i < items_here.size(); i++ ) { - auto &it = items_here[i]; - if( ( rem_f_opt && it.is_food() ) || ( !rem_f_opt && ( it.typeId() == "charcoal" ) ) ) { + for( map_stack::iterator it = items_here.begin(); it != items_here.end(); ) { + if( ( rem_f_opt && it->is_food() ) || ( !rem_f_opt && ( it->typeId() == "charcoal" ) ) ) { // get handling cost before the item reference is invalidated - const int handling_cost = -p.item_handling_cost( it ); + const int handling_cost = -p.item_handling_cost( *it ); - add_msg( _( "You remove %s from the rack." ), it.tname() ); - g->m.add_item_or_charges( p.pos(), it ); - g->m.i_rem( examp, i ); + add_msg( _( "You remove %s from the rack." ), it->tname() ); + g->m.add_item_or_charges( p.pos(), *it ); + it = items_here.erase( it ); p.mod_moves( handling_cost ); - i--; + } else { + ++it; } } if( portable && active && rem_f_opt ) { @@ -5266,7 +5286,7 @@ void iexamine::workbench_internal( player &p, const tripoint &examp, string_format( pgettext( "in progress craft", " starts working on the %s." ), selected_craft->tname() ) ); p.assign_activity( activity_id( "ACT_CRAFT" ) ); - p.activity.targets.push_back( crafts[amenu2.ret].clone() ); + p.activity.targets.push_back( crafts[amenu2.ret] ); p.activity.values.push_back( 0 ); // Not a long craft break; } @@ -5299,6 +5319,7 @@ iexamine_function iexamine_function_from_string( const std::string &function_nam { "controls_gate", &iexamine::controls_gate }, { "cardreader", &iexamine::cardreader }, { "cardreader_robofac", &iexamine::cardreader_robofac }, + { "cardreader_fp", &iexamine::cardreader_foodplace }, { "intercom", &iexamine::intercom }, { "rubble", &iexamine::rubble }, { "chainfence", &iexamine::chainfence }, diff --git a/src/iexamine.h b/src/iexamine.h index c824cdaa1d7b4..cadb33a266586 100644 --- a/src/iexamine.h +++ b/src/iexamine.h @@ -43,6 +43,7 @@ void nanofab( player &p, const tripoint &examp ); void controls_gate( player &p, const tripoint &examp ); void cardreader( player &p, const tripoint &examp ); void cardreader_robofac( player &p, const tripoint &examp ); +void cardreader_foodplace( player &p, const tripoint &examp ); void intercom( player &p, const tripoint &examp ); void cvdmachine( player &p, const tripoint &examp ); void rubble( player &p, const tripoint &examp ); diff --git a/src/init.cpp b/src/init.cpp index bf1ecd8350ed3..99b75f64b524b 100644 --- a/src/init.cpp +++ b/src/init.cpp @@ -34,6 +34,7 @@ #include "json.h" #include "loading_ui.h" #include "mapdata.h" +#include "map_extras.h" #include "mapgen.h" #include "martialarts.h" #include "material.h" @@ -308,6 +309,7 @@ void DynamicDataLoader::initialize() add( "effect_type", &load_effect_type ); add( "tutorial_messages", &load_tutorial_messages ); add( "overmap_terrain", &overmap_terrains::load ); + add( "construction_category", &construction_categories::load ); add( "construction", &load_construction ); add( "mapgen", &load_mapgen ); add( "overmap_land_use_code", &overmap_land_use_codes::load ); @@ -315,6 +317,7 @@ void DynamicDataLoader::initialize() add( "overmap_location", &overmap_locations::load ); add( "overmap_special", &overmap_specials::load ); add( "city_building", &city_buildings::load ); + add( "map_extra", &MapExtras::load ); add( "region_settings", &load_region_settings ); add( "region_overlay", &load_region_overlay ); @@ -478,6 +481,7 @@ void DynamicDataLoader::unload_data() faction_template::reset(); quality::reset(); trap::reset(); + construction_categories::reset(); reset_constructions(); overmap_terrains::reset(); reset_region_settings(); diff --git a/src/int_id.h b/src/int_id.h index 5d9b07dc3c2b0..1f9cefa8a6aa5 100644 --- a/src/int_id.h +++ b/src/int_id.h @@ -115,6 +115,6 @@ struct hash< int_id > { return hash()( v.to_i() ); } }; -} +} // namespace std #endif diff --git a/src/inventory_ui.cpp b/src/inventory_ui.cpp index 31b2e20775df9..8a387eef38c5a 100644 --- a/src/inventory_ui.cpp +++ b/src/inventory_ui.cpp @@ -78,7 +78,7 @@ struct inventory_input { bool inventory_entry::operator==( const inventory_entry &other ) const { - return get_category_ptr() == other.get_category_ptr() && location == other.location; + return get_category_ptr() == other.get_category_ptr() && locations == other.locations; } class selection_column_preset: public inventory_selector_preset @@ -89,46 +89,70 @@ class selection_column_preset: public inventory_selector_preset std::string get_caption( const inventory_entry &entry ) const override { std::ostringstream res; const size_t available_count = entry.get_available_count(); + const item_location &item = entry.any_item(); + if( entry.chosen_count > 0 && entry.chosen_count < available_count ) { res << string_format( _( "%d of %d" ), entry.chosen_count, available_count ) << ' '; } else if( available_count != 1 ) { res << available_count << ' '; } - if( entry.location->ammo_types().count( ammotype( "money" ) ) ) { + if( item->is_money() ) { + assert( available_count == entry.get_stack_size() ); if( entry.chosen_count > 0 && entry.chosen_count < available_count ) { //~ In the following string, the %s is the amount of money on the selected cards as passed by the display money function, out of the total amount of money on the cards, which is specified by the format_money function") - res << string_format( _( "%s of %s" ), entry.location->display_money( entry.chosen_count, - entry.location.charges_in_stack( entry.chosen_count ) ), - format_money( entry.location.charges_in_stack( available_count ) ) ); + res << string_format( + _( "%s of %s" ), + item->display_money( available_count, entry.get_selected_charges() ), + format_money( entry.get_total_charges() ) ); } else { - res << entry.location->display_money( available_count, - entry.location.charges_in_stack( available_count ) ); + res << item->display_money( available_count, entry.get_total_charges() ); } } else { - res << entry.location->display_name( available_count ); + res << item->display_name( available_count ); } return res.str(); } nc_color get_color( const inventory_entry &entry ) const override { - if( &*entry.location == &g->u.weapon ) { - return c_light_blue; - } else if( g->u.is_worn( *entry.location ) ) { - return c_cyan; - } else { - return inventory_selector_preset::get_color( entry ); + if( entry.is_item() ) { + if( &*entry.any_item() == &g->u.weapon ) { + return c_light_blue; + } else if( g->u.is_worn( *entry.any_item() ) ) { + return c_cyan; + } } + return inventory_selector_preset::get_color( entry ); } }; static const selection_column_preset selection_preset; +int inventory_entry::get_total_charges() const +{ + int result = 0; + for( const item_location &location : locations ) { + result += location->charges; + } + return result; +} + +int inventory_entry::get_selected_charges() const +{ + assert( chosen_count <= locations.size() ); + int result = 0; + for( size_t i = 0; i < chosen_count; ++i ) { + const item_location &location = locations[i]; + result += location->charges; + } + return result; +} + size_t inventory_entry::get_available_count() const { - if( location && stack_size == 1 ) { - return location->count(); + if( locations.size() == 1 ) { + return any_item()->count(); } else { - return stack_size; + return locations.size(); } } @@ -137,7 +161,10 @@ int inventory_entry::get_invlet() const if( custom_invlet != INT_MIN ) { return custom_invlet; } - return location ? location->invlet : '\0'; + if( !is_item() ) { + return '\0'; + } + return any_item()->invlet; } nc_color inventory_entry::get_invlet_color() const @@ -153,7 +180,7 @@ nc_color inventory_entry::get_invlet_color() const void inventory_entry::update_cache() { - cached_name = location->tname( 1 ); + cached_name = any_item()->tname( 1 ); } const item_category *inventory_entry::get_category_ptr() const @@ -161,7 +188,10 @@ const item_category *inventory_entry::get_category_ptr() const if( custom_category != nullptr ) { return custom_category; } - return location ? &location->get_category() : nullptr; + if( !is_item() ) { + return nullptr; + } + return &any_item()->get_category(); } bool inventory_column::activatable() const @@ -203,8 +233,8 @@ bool inventory_selector_preset::sort_compare( const inventory_entry &lhs, const inventory_entry &rhs ) const { // 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.location->invlet ); - const bool right_fav = g->u.inv.assigned_invlet.count( rhs.location->invlet ); + 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 ); if( left_fav == right_fav ) { return lhs.cached_name.compare( rhs.cached_name ) < 0; // Simple alphabetic order } else if( left_fav ) { @@ -215,7 +245,7 @@ bool inventory_selector_preset::sort_compare( const inventory_entry &lhs, nc_color inventory_selector_preset::get_color( const inventory_entry &entry ) const { - return entry.is_item() ? entry.location->color_in_inventory() : c_magenta; + return entry.is_item() ? entry.any_item()->color_in_inventory() : c_magenta; } std::function inventory_selector_preset::get_filter( @@ -224,24 +254,26 @@ std::function inventory_selector_preset::get_fi auto item_filter = basic_item_filter( filter ); return [item_filter]( const inventory_entry & e ) { - return item_filter( *e.location ); + return item_filter( *e.any_item() ); }; } std::string inventory_selector_preset::get_caption( const inventory_entry &entry ) const { const size_t count = entry.get_stack_size(); - const std::string disp_name = - ( entry.location->ammo_types().count( ammotype( "money" ) ) ) ? - entry.location->display_money( count, - entry.location.charges_in_stack( count ) ) : entry.location->display_name( count ); + std::string disp_name; + if( entry.any_item()->is_money() ) { + disp_name = entry.any_item()->display_money( count, entry.get_total_charges() ); + } else { + disp_name = entry.any_item()->display_name( count ); + } return ( count > 1 ) ? string_format( "%d %s", count, disp_name ) : disp_name; } std::string inventory_selector_preset::get_denial( const inventory_entry &entry ) const { - return entry.is_item() ? get_denial( entry.location ) : std::string(); + return entry.is_item() ? get_denial( entry.any_item() ) : std::string(); } std::string inventory_selector_preset::get_cell_text( const inventory_entry &entry, @@ -279,7 +311,7 @@ void inventory_selector_preset::append_cell( const // Don't capture by reference here. The func should be able to die earlier than the object itself append_cell( std::function( [ func ]( const inventory_entry & entry ) { - return func( entry.location ); + return func( entry.any_item() ); } ), title, stub ); } @@ -562,7 +594,8 @@ bool inventory_column::is_selected_by_category( const inventory_entry &entry ) c const inventory_entry &inventory_column::get_selected() const { if( selected_index >= entries.size() || !entries[selected_index].is_item() ) { - static const inventory_entry dummy; + // clang complains if we use the default constructor here + static const inventory_entry dummy( nullptr ); return dummy; } return entries[selected_index]; @@ -653,7 +686,8 @@ void inventory_column::on_input( const inventory_input &input ) } else if( input.action == "END" ) { select( entries.size() - 1, scroll_direction::BACKWARD ); } else if( input.action == "TOGGLE_FAVORITE" ) { - set_stack_favorite( get_selected().location, !get_selected().location.get_item()->is_favorite ); + const item_location &loc = get_selected().any_item(); + set_stack_favorite( loc, !loc->is_favorite ); } } @@ -770,7 +804,7 @@ void inventory_column::clear() bool inventory_column::select( const item_location &loc ) { for( size_t index = 0; index < entries.size(); ++index ) { - if( entries[index].is_selectable() && entries[index].location == loc ) { + if( entries[index].is_selectable() && entries[index].any_item() == loc ) { select( index, scroll_direction::FORWARD ); return true; } @@ -799,7 +833,7 @@ int inventory_column::reassign_custom_invlets( const player &p, int min_invlet, int cur_invlet = min_invlet; for( auto &elem : entries ) { // Only items on map/in vehicles: those that the player does not possess. - if( elem.is_selectable() && !p.has_item( *elem.location ) ) { + if( elem.is_selectable() && !p.has_item( *elem.any_item() ) ) { elem.custom_invlet = cur_invlet <= max_invlet ? cur_invlet++ : '\0'; } } @@ -902,8 +936,8 @@ void inventory_column::draw( const catacurses::window &win, size_t x, size_t y ) } xx += 2; if( get_option( "ITEM_SYMBOLS" ) ) { - const nc_color color = entry.location->color(); - mvwputch( win, yy, xx, color, entry.location->symbol() ); + const nc_color color = entry.any_item()->color(); + mvwputch( win, yy, xx, color, entry.any_item()->symbol() ); xx += 2; } if( allows_selecting() && multiselect ) { @@ -1003,6 +1037,28 @@ static std::vector> restack_items( const std::list::cons return res; } +// TODO: Move it into some 'item_stack' class. +static std::vector> restack_items( const item_stack::const_iterator &from, + const item_stack::const_iterator &to, bool check_components = false ) +{ + std::vector> res; + + for( auto it = from; it != to; ++it ) { + auto match = std::find_if( res.begin(), res.end(), + [ &it, check_components ]( const std::list &e ) { + return it->stacks_with( *const_cast( e.back() ), check_components ); + } ); + + if( match != res.end() ) { + match->push_back( const_cast( &*it ) ); + } else { + res.emplace_back( 1, const_cast( &*it ) ); + } + } + + return res; +} + const item_category *inventory_selector::naturalize_category( const item_category &category, const tripoint &pos ) { @@ -1042,17 +1098,17 @@ const item_category *inventory_selector::naturalize_category( const item_categor return &categories.back(); } -void inventory_selector::add_item( inventory_column &target_column, - const item_location &location, - size_t stack_size, const item_category *custom_category ) +void inventory_selector::add_entry( inventory_column &target_column, + std::vector &&locations, + const item_category *custom_category ) { - if( !preset.is_shown( location ) ) { + if( !preset.is_shown( locations.front() ) ) { return; } - items.push_back( location.clone() ); - inventory_entry entry( items.back(), stack_size, custom_category, - preset.get_denial( location ).empty() ); + is_empty = false; + inventory_entry entry( locations, custom_category, + preset.get_denial( locations.front() ).empty() ); target_column.add_entry( entry ); on_entry_add( entry ); @@ -1060,6 +1116,15 @@ void inventory_selector::add_item( inventory_column &target_column, layout_is_valid = false; } +void inventory_selector::add_item( inventory_column &target_column, + item_location &&location, + const item_category *custom_category ) +{ + add_entry( target_column, + std::vector( 1, location ), + custom_category ); +} + void inventory_selector::add_items( inventory_column &target_column, const std::function &locator, const std::vector> &stacks, @@ -1068,7 +1133,9 @@ void inventory_selector::add_items( inventory_column &target_column, const item_category *nat_category = nullptr; for( const auto &elem : stacks ) { - auto loc = locator( elem.front() ); + std::vector locations; + std::transform( elem.begin(), elem.end(), std::back_inserter( locations ), locator ); + item_location const &loc = locations.front(); if( custom_category == nullptr ) { nat_category = &loc->get_category(); @@ -1076,7 +1143,7 @@ void inventory_selector::add_items( inventory_column &target_column, nat_category = naturalize_category( *custom_category, loc.position() ); } - add_item( target_column, loc, elem.size(), nat_category ); + add_entry( target_column, std::move( locations ), nat_category ); } } @@ -1087,21 +1154,17 @@ void inventory_selector::add_character_items( Character &character ) -200 ); character.visit_items( [ this, &character ]( item * it ) { if( it == &character.weapon ) { - add_item( own_gear_column, item_location( character, it ), 1, &weapon_held_category ); + add_item( own_gear_column, item_location( character, it ), &weapon_held_category ); } else if( character.is_worn( *it ) ) { - add_item( own_gear_column, item_location( character, it ), 1, &items_worn_category ); + add_item( own_gear_column, item_location( character, it ), &items_worn_category ); } return VisitResponse::NEXT; } ); // Visitable interface does not support stacks so it has to be here for( const auto &elem : character.inv.slice() ) { - if( ( &elem->front() )->ammo_types().count( ammotype( "money" ) ) ) { - add_item( own_inv_column, item_location( character, elem ), elem->size() ); - } else { - add_items( own_inv_column, [&character]( item * it ) { - return item_location( character, it ); - }, restack_items( ( *elem ).begin(), ( *elem ).end(), preset.get_checking_components() ) ); - } + add_items( own_inv_column, [&character]( item * it ) { + return item_location( character, it ); + }, restack_items( ( *elem ).begin(), ( *elem ).end(), preset.get_checking_components() ) ); } } @@ -1153,7 +1216,7 @@ void inventory_selector::add_nearby_items( int radius ) void inventory_selector::clear_items() { - items.clear(); + is_empty = true; for( auto &column : columns ) { column->clear(); } @@ -1591,7 +1654,7 @@ inventory_selector::~inventory_selector() = default; bool inventory_selector::empty() const { - return items.empty(); + return is_empty; } bool inventory_selector::has_available_choices() const @@ -1757,14 +1820,14 @@ item_location inventory_pick_selector::execute() const inventory_input input = get_input(); if( input.entry != nullptr ) { - if( select( input.entry->location ) ) { + if( select( input.entry->any_item() ) ) { refresh_window(); } - return input.entry->location.clone(); + return input.entry->any_item(); } else if( input.action == "QUIT" ) { return item_location(); } else if( input.action == "CONFIRM" ) { - return get_active_column().get_selected().location.clone(); + return get_active_column().get_selected().any_item(); } else if( input.action == "INVENTORY_FILTER" ) { set_filter(); } else { @@ -1823,7 +1886,7 @@ std::pair inventory_compare_selector::execute() const inventory_input input = get_input(); if( input.entry != nullptr ) { - select( input.entry->location ); + select( input.entry->any_item() ); toggle_entry( input.entry ); } else if( input.action == "RIGHT" ) { const auto selection( get_active_column().get_all_selected() ); @@ -1850,7 +1913,8 @@ std::pair inventory_compare_selector::execute() } if( compared.size() == 2 ) { - const auto res = std::make_pair( &*compared.back()->location, &*compared.front()->location ); + const auto res = std::make_pair( &*compared.back()->any_item(), + &*compared.front()->any_item() ); toggle_entry( compared.back() ); return res; } @@ -1896,7 +1960,7 @@ std::list> inventory_iuse_selector::execute() count *= 10; count += input.ch - '0'; } else if( input.entry != nullptr ) { - select( input.entry->location ); + select( input.entry->any_item() ); if( count == 0 && input.entry->chosen_count == 0 ) { count = max_chosen_count; } @@ -1949,7 +2013,7 @@ std::list> inventory_iuse_selector::execute() void inventory_iuse_selector::set_chosen_count( inventory_entry &entry, size_t count ) { - const item *it = &*entry.location; + const item *it = &*entry.any_item(); if( count == 0 ) { entry.chosen_count = 0; @@ -2017,7 +2081,7 @@ std::list> inventory_drop_selector::execute() count *= 10; count += input.ch - '0'; } else if( input.entry != nullptr ) { - select( input.entry->location ); + select( input.entry->any_item() ); if( count == 0 && input.entry->chosen_count == 0 ) { count = max_chosen_count; } @@ -2026,8 +2090,8 @@ std::list> inventory_drop_selector::execute() } else if( input.action == "DROP_NON_FAVORITE" ) { const auto filter_to_nonfavorite_and_nonworn = []( const inventory_entry & entry ) { return entry.is_item() && - !entry.location->is_favorite && - !g->u.is_worn( *entry.location ); + !entry.any_item()->is_favorite && + !g->u.is_worn( *entry.any_item() ); }; const auto selected( get_active_column().get_entries( filter_to_nonfavorite_and_nonworn ) ); @@ -2042,17 +2106,17 @@ std::list> inventory_drop_selector::execute() // Any non favorite item to select? const bool select_nonfav = std::any_of( selected.begin(), selected.end(), []( const inventory_entry * elem ) { - return ( !elem->location.get_item()->is_favorite ) && elem->chosen_count == 0; + return ( !elem->any_item()->is_favorite ) && elem->chosen_count == 0; } ); // Otherwise, any favorite item to select? const bool select_fav = !select_nonfav && std::any_of( selected.begin(), selected.end(), []( const inventory_entry * elem ) { - return elem->location.get_item()->is_favorite && elem->chosen_count == 0; + return elem->any_item()->is_favorite && elem->chosen_count == 0; } ); for( const auto &elem : selected ) { - const bool is_favorite = elem->location.get_item()->is_favorite; + const bool is_favorite = elem->any_item()->is_favorite; if( ( select_nonfav && !is_favorite ) || ( select_fav && is_favorite ) ) { set_chosen_count( *elem, count ); } else if( !select_nonfav && !select_fav ) { @@ -2099,7 +2163,7 @@ std::list> inventory_drop_selector::execute() void inventory_drop_selector::set_chosen_count( inventory_entry &entry, size_t count ) { - const item *it = &*entry.location; + const item *it = &*entry.any_item(); if( count == 0 ) { entry.chosen_count = 0; diff --git a/src/inventory_ui.h b/src/inventory_ui.h index fb73ce1f3a430..f9764abdade46 100644 --- a/src/inventory_ui.h +++ b/src/inventory_ui.h @@ -43,51 +43,33 @@ struct inventory_input; class inventory_entry { public: - item_location location; + std::vector locations; size_t chosen_count = 0; int custom_invlet = INT_MIN; std::string cached_name; - inventory_entry( const item_location &location, size_t stack_size, - const item_category *custom_category = nullptr, bool enabled = true ) : - location( location.clone() ), - stack_size( stack_size ), - custom_category( custom_category ), - enabled( enabled ) {} - - inventory_entry( const inventory_entry &entry ) : - location( entry.location.clone() ), - chosen_count( entry.chosen_count ), - custom_invlet( entry.custom_invlet ), - cached_name( entry.cached_name ), - stack_size( entry.stack_size ), - custom_category( entry.custom_category ), - enabled( entry.enabled ) {} - - inventory_entry operator=( const inventory_entry &rhs ) { - location = rhs.location.clone(); - chosen_count = rhs.chosen_count; - custom_invlet = rhs.custom_invlet; - stack_size = rhs.stack_size; - custom_category = rhs.custom_category; - enabled = rhs.enabled; - cached_name = rhs.cached_name; - return *this; - } - - inventory_entry( const item_location &location, const item_category *custom_category = nullptr, - bool enabled = true ) : - inventory_entry( location, location ? 1 : 0, custom_category, enabled ) {} + inventory_entry() = default; - inventory_entry( const item_category *custom_category = nullptr ) : - inventory_entry( item_location(), custom_category ) {} + inventory_entry( const item_category *custom_category ) : + custom_category( custom_category ) + {} + // Copy with new category. Used to copy entries into the "selected" + // category when they are selected. inventory_entry( const inventory_entry &entry, const item_category *custom_category ) : inventory_entry( entry ) { this->custom_category = custom_category; } + inventory_entry( const std::vector &locations, + const item_category *custom_category = nullptr, + bool enabled = true ) : + locations( locations ), + custom_category( custom_category ), + enabled( enabled ) + {} + bool operator==( const inventory_entry &other ) const; bool operator!=( const inventory_entry &other ) const { return !( *this == other ); @@ -102,10 +84,9 @@ class inventory_entry } /** * Whether the entry is an item. - * item_location::valid() is way too expensive for mundane routines. */ bool is_item() const { - return location != item_location::nowhere; + return !locations.empty(); } /** Whether the entry is a category */ bool is_category() const { @@ -116,10 +97,18 @@ class inventory_entry return is_item() && enabled; } + const item_location &any_item() const { + assert( !locations.empty() ); + return locations.front(); + } + size_t get_stack_size() const { - return stack_size; + return locations.size(); } + int get_total_charges() const; + int get_selected_charges() const; + size_t get_available_count() const; const item_category *get_category_ptr() const; int get_invlet() const; @@ -127,8 +116,7 @@ class inventory_entry void update_cache(); private: - size_t stack_size; - const item_category *custom_category; + const item_category *custom_category = nullptr; bool enabled = true; }; @@ -475,9 +463,12 @@ class inventory_selector const item_category *naturalize_category( const item_category &category, const tripoint &pos ); + void add_entry( inventory_column &target_column, + std::vector &&locations, + const item_category *custom_category = nullptr ); + void add_item( inventory_column &target_column, - const item_location &location, - size_t stack_size = 1, + item_location &&location, const item_category *custom_category = nullptr ); void add_items( inventory_column &target_column, @@ -545,7 +536,7 @@ class inventory_selector */ bool select( const item_location &loc ); - inventory_entry get_selected() { + const inventory_entry &get_selected() { return get_active_column().get_selected(); } @@ -604,7 +595,6 @@ class inventory_selector private: catacurses::window w_inv; - std::list items; std::vector columns; std::string title; @@ -620,6 +610,7 @@ class inventory_selector const int border = 1; // Width of the window border std::string filter; + bool is_empty = true; bool display_stats = true; bool layout_is_valid = false; }; diff --git a/src/io_tags.h b/src/io_tags.h index 8808f54a3aa63..e278089c262df 100644 --- a/src/io_tags.h +++ b/src/io_tags.h @@ -26,6 +26,6 @@ struct object_archive_tag { using OutputArchive = JsonObjectOutputArchive; }; -} +} // namespace io #endif // CATA_IO_TAGS_H diff --git a/src/item.cpp b/src/item.cpp index dfd19d5dce1c6..35df49278dbf3 100644 --- a/src/item.cpp +++ b/src/item.cpp @@ -366,7 +366,7 @@ item &item::ammo_set( const itype_id &ammo, int qty ) } // handle reloadable tools and guns with no specific ammo type as special case - if( ( ammo == "null" && ammo_types().empty() ) || ammo_types().count( ammotype( "money" ) ) ) { + if( ( ammo == "null" && ammo_types().empty() ) || is_money() ) { if( ( is_tool() || is_gun() ) && magazine_integral() ) { curammo = nullptr; charges = std::min( qty, ammo_capacity() ); @@ -405,7 +405,12 @@ item &item::ammo_set( const itype_id &ammo, int qty ) // if default magazine too small fetch instead closest available match if( mag->magazine->capacity < qty ) { // as above call to magazine_default successful can infer minimum one option exists - auto iter = type->magazines.find( ammotype( ammo ) ); + auto iter = type->magazines.find( atype->ammo->type ); + if( iter == type->magazines.end() ) { + debugmsg( "%s doesn't have a magazine for %s", + tname(), ammo ); + return *this; + } std::vector opts( iter->second.begin(), iter->second.end() ); std::sort( opts.begin(), opts.end(), []( const itype_id & lhs, const itype_id & rhs ) { return find_type( lhs )->magazine->capacity < find_type( rhs )->magazine->capacity; @@ -628,7 +633,7 @@ bool item::stacks_with( const item &rhs, bool check_components ) const if( type != rhs.type ) { return false; } - if( charges != 0 && rhs.charges != 0 && ammo_current() == "money" ) { + if( charges != 0 && rhs.charges != 0 && is_money() ) { // Dealing with nonempty cash cards return true; } @@ -737,6 +742,7 @@ void item::set_var( const std::string &name, const int value ) item_vars[name] = tmpstream.str(); } +// NOLINTNEXTLINE(cata-no-long) void item::set_var( const std::string &name, const long value ) { std::ostringstream tmpstream; @@ -1441,6 +1447,12 @@ std::string item::info( std::vector &info, const iteminfo_query *parts at->name() ); info.emplace_back( "GUN", _( "Capacity: " ), fmt, iteminfo::no_flags, mod->ammo_capacity() ); + } else { + auto fmt = string_format( + ngettext( " round of %s", " rounds of %s", mod->ammo_capacity() ), + at->name() ); + info.emplace_back( "GUN", _( "Capacity: " ), fmt, iteminfo::no_flags, + mod->ammo_capacity() ); } } } @@ -3404,7 +3416,7 @@ std::string item::display_name( unsigned int quantity ) const } if( amount || show_amt ) { - if( ammo_current() == "money" ) { + if( is_money() ) { amt = string_format( " $%.2f", amount / 100.0 ); } else { if( max_amount != 0 ) { @@ -3525,7 +3537,7 @@ units::mass item::weight( bool include_contents, bool integral ) const } } else if( magazine_integral() && !is_magazine() ) { - if( ammo_current() == "plutonium" ) { + if( ammo_current() == "plut_cell" ) { ret += ammo_remaining() * find_type( ammotype( *ammo_types().begin() )->default_ammotype() )->weight / PLUTONIUM_CHARGES; } else if( ammo_data() ) { @@ -3858,12 +3870,12 @@ std::string item::get_property_string( const std::string &prop, const std::strin return it != type->properties.end() ? it->second : def; } -long item::get_property_long( const std::string &prop, long def ) const +int64_t item::get_property_int64_t( const std::string &prop, int64_t def ) const { const auto it = type->properties.find( prop ); if( it != type->properties.end() ) { char *e = nullptr; - long r = std::strtol( it->second.c_str(), &e, 10 ); + int64_t r = std::strtoll( it->second.c_str(), &e, 10 ); if( !it->second.empty() && *e == '\0' ) { return r; } @@ -4404,6 +4416,11 @@ bool item::ready_to_revive( const tripoint &pos ) const return false; } +bool item::is_money() const +{ + return ammo_types().count( ammotype( "money" ) ); +} + bool item::count_by_charges() const { return type->count_by_charges(); @@ -5338,15 +5355,9 @@ bool item::is_tool() const return type->tool.has_value(); } -bool item::is_tool_reversible() const +bool item::is_transformable() const { - if( is_tool() && type->tool->revert_to ) { - item revert( *type->tool->revert_to ); - npc n; - revert.type->invoke( n, revert, tripoint( -999, -999, -999 ) ); - return revert.is_tool() && typeId() == revert.typeId(); - } - return false; + return type->use_methods.find( "transform" ) != type->use_methods.end(); } bool item::is_artifact() const @@ -5510,7 +5521,7 @@ bool item::operator<( const item &other ) const !other.contents.empty() ? &other.contents.front() : &other; if( me->typeId() == rhs->typeId() ) { - if( me->ammo_current() == "money" ) { + if( me->is_money() ) { return me->charges > rhs->charges; } return me->charges < rhs->charges; @@ -6334,14 +6345,14 @@ bool item::units_sufficient( const Character &ch, int qty ) const } item::reload_option::reload_option( const reload_option &rhs ) : - who( rhs.who ), target( rhs.target ), ammo( rhs.ammo.clone() ), + who( rhs.who ), target( rhs.target ), ammo( rhs.ammo ), qty_( rhs.qty_ ), max_qty( rhs.max_qty ), parent( rhs.parent ) {} item::reload_option &item::reload_option::operator=( const reload_option &rhs ) { who = rhs.who; target = rhs.target; - ammo = rhs.ammo.clone(); + ammo = rhs.ammo; qty_ = rhs.qty_; max_qty = rhs.max_qty; parent = rhs.parent; @@ -6350,8 +6361,8 @@ item::reload_option &item::reload_option::operator=( const reload_option &rhs ) } item::reload_option::reload_option( const player *who, const item *target, const item *parent, - item_location &&ammo ) : - who( who ), target( target ), ammo( std::move( ammo ) ), parent( parent ) + const item_location &ammo ) : + who( who ), target( target ), ammo( ammo ), parent( parent ) { if( this->target->is_ammo_belt() && this->target->type->magazine->linkage ) { max_qty = this->who->charges_of( * this->target->type->magazine->linkage ); diff --git a/src/item.h b/src/item.h index 8b2e2df213b9d..4789333adcaea 100644 --- a/src/item.h +++ b/src/item.h @@ -280,6 +280,8 @@ class item : public visitable */ bool ready_to_revive( const tripoint &pos ) const; + bool is_money() const; + /** * Returns the default color of the item (e.g. @ref itype::color). */ @@ -375,7 +377,8 @@ class item : public visitable reload_option( const reload_option & ); reload_option &operator=( const reload_option & ); - reload_option( const player *who, const item *target, const item *parent, item_location &&ammo ); + reload_option( const player *who, const item *target, const item *parent, + const item_location &ammo ); const player *who = nullptr; const item *target = nullptr; @@ -1037,7 +1040,7 @@ class item : public visitable bool is_deployable() const; bool is_tool() const; - bool is_tool_reversible() const; + bool is_transformable() const; bool is_artifact() const; bool is_bucket() const; bool is_bucket_nonempty() const; @@ -1226,7 +1229,6 @@ class item : public visitable * All numeric values are returned as doubles and may be cast to the desired type. * * int v = itm.get_var("v", 0); // v will be an int - * long l = itm.get_var("v", 0l); // l will be a long * double d = itm.get_var("v", 0.0); // d will be a double * std::string s = itm.get_var("v", ""); // s will be a std::string * // no default means empty string as default: @@ -1235,6 +1237,8 @@ class item : public visitable */ /*@{*/ void set_var( const std::string &name, int value ); + // Acceptable to use long as part of overload set + // NOLINTNEXTLINE(cata-no-long) void set_var( const std::string &name, long value ); void set_var( const std::string &name, double value ); double get_var( const std::string &name, double default_value ) const; @@ -1292,7 +1296,7 @@ class item : public visitable * Return same type as the passed default value, or string where no default provided */ std::string get_property_string( const std::string &prop, const std::string &def = "" ) const; - long get_property_long( const std::string &prop, long def = 0 ) const; + int64_t get_property_int64_t( const std::string &prop, int64_t def = 0 ) const; /*@}*/ /** diff --git a/src/item_factory.cpp b/src/item_factory.cpp index a858e7db34f48..3eea006d7c4f2 100644 --- a/src/item_factory.cpp +++ b/src/item_factory.cpp @@ -53,7 +53,7 @@ static std::set repair_actions; static DynamicDataLoader::deferred_json deferred; -std::unique_ptr item_controller( new Item_factory() ); +std::unique_ptr item_controller = std::make_unique(); static const std::string calc_category( const itype &obj ); static void set_allergy_flags( itype &item_template ); @@ -361,6 +361,13 @@ void Item_factory::finalize_pre( itype &obj ) } else { obj.layer = REGULAR_LAYER; } + + if( obj.can_use( "MA_MANUAL" ) && obj.book && obj.book->martial_art.is_null() && + string_starts_with( obj.get_id(), "manual_" ) ) { + // Legacy martial arts books rely on a hack whereby the name of the + // martial art is derived from the item id + obj.book->martial_art = matype_id( "style_" + obj.get_id().substr( 7 ) ); + } } void Item_factory::register_cached_uses( const itype &obj ) @@ -648,6 +655,7 @@ void Item_factory::init() add_iuse( "FLUMED", &iuse::flumed ); add_iuse( "FLUSLEEP", &iuse::flusleep ); add_iuse( "FLU_VACCINE", &iuse::flu_vaccine ); + add_iuse( "FOODPERSON", &iuse::foodperson ); add_iuse( "FUNGICIDE", &iuse::fungicide ); add_iuse( "GASMASK", &iuse::gasmask, translate_marker( "Can be activated to increase environmental " @@ -823,7 +831,7 @@ void Item_factory::check_definitions() const { for( const auto &elem : m_templates ) { std::ostringstream msg; - const itype *type = &elem.second; // avoid huge number of line changes + const itype *type = &elem.second; if( !type->category ) { msg << "undefined category " << type->category_force << "\n"; @@ -930,6 +938,16 @@ void Item_factory::check_definitions() const if( type->book->skill && !type->book->skill.is_valid() ) { msg << string_format( "uses invalid book skill." ) << "\n"; } + if( type->book->martial_art && !type->book->martial_art.is_valid() ) { + msg << string_format( "trains invalid martial art '%s'.", + type->book->martial_art.str() ) << "\n"; + } + if( type->can_use( "MA_MANUAL" ) && !type->book->martial_art ) { + msg << "has use_action MA_MANUAL but does not specify a martial art\n"; + } + } + if( type->can_use( "MA_MANUAL" ) && !type->book ) { + msg << "has use_action MA_MANUAL but is not a book\n"; } if( type->ammo ) { if( !type->ammo->type && type->ammo->type != ammotype( "NULL" ) ) { @@ -1306,7 +1324,7 @@ void Item_factory::load( islot_ammo &slot, JsonObject &jo, const std::string &sr assign( jo, "range", slot.range, strict, 0 ); assign( jo, "dispersion", slot.dispersion, strict, 0 ); assign( jo, "recoil", slot.recoil, strict, 0 ); - assign( jo, "count", slot.def_charges, strict, 1L ); + assign( jo, "count", slot.def_charges, strict, 1 ); assign( jo, "loudness", slot.loudness, strict, 0 ); assign( jo, "effects", slot.ammo_effects, strict ); assign( jo, "prop_damage", slot.prop_damage, strict ); @@ -1611,6 +1629,7 @@ void Item_factory::load( islot_book &slot, JsonObject &jo, const std::string &sr slot.time = to_minutes( time_duration::read_from_json_string( *jo.get_raw( "time" ) ) ); } assign( jo, "skill", slot.skill, strict ); + assign( jo, "martial_art", slot.martial_art, strict ); assign( jo, "chapters", slot.chapters, strict, 0 ); } @@ -1629,7 +1648,7 @@ void Item_factory::load( islot_comestible &slot, JsonObject &jo, const std::stri assign( jo, "comestible_type", slot.comesttype, strict ); assign( jo, "tool", slot.tool, strict ); - assign( jo, "charges", slot.def_charges, strict, 1L ); + assign( jo, "charges", slot.def_charges, strict, 1 ); assign( jo, "quench", slot.quench, strict ); assign( jo, "fun", slot.fun, strict ); assign( jo, "stim", slot.stim, strict ); diff --git a/src/item_group.cpp b/src/item_group.cpp index bc41b350414db..656a4f28f2aac 100644 --- a/src/item_group.cpp +++ b/src/item_group.cpp @@ -348,16 +348,14 @@ Item_group::Item_group( Type t, int probability, int ammo_chance, int magazine_c void Item_group::add_item_entry( const Item_tag &itemid, int probability ) { - std::unique_ptr ptr( new Single_item_creator( itemid, Single_item_creator::S_ITEM, - probability ) ); - add_entry( std::move( ptr ) ); + add_entry( std::make_unique( + itemid, Single_item_creator::S_ITEM, probability ) ); } void Item_group::add_group_entry( const Group_tag &groupid, int probability ) { - std::unique_ptr ptr( new Single_item_creator( groupid, - Single_item_creator::S_ITEM_GROUP, probability ) ); - add_entry( std::move( ptr ) ); + add_entry( std::make_unique( + groupid, Single_item_creator::S_ITEM_GROUP, probability ) ); } void Item_group::add_entry( std::unique_ptr ptr ) diff --git a/src/item_group.h b/src/item_group.h index 67ecc5b055194..854d0ec8c8365 100644 --- a/src/item_group.h +++ b/src/item_group.h @@ -92,7 +92,7 @@ void load_item_group( JsonObject &jsobj, const Group_tag &group_id, const std::s * @throw std::string as usual for JSON errors, including invalid input values. */ Group_tag load_item_group( JsonIn &stream, const std::string &default_subtype ); -} +} // namespace item_group /** * Base interface for item spawn. @@ -152,7 +152,7 @@ class Item_modifier * Charges to spawn the item with, if this turns out to * be negative, the default charges are used. */ - std::pair charges; + std::pair charges; /** * Ammo for guns. If NULL the gun spawns without ammo. * This takes @ref charges and @ref with_ammo into account. diff --git a/src/item_location.cpp b/src/item_location.cpp index c9d730402f058..fbc7de8e7b69a 100644 --- a/src/item_location.cpp +++ b/src/item_location.cpp @@ -67,7 +67,6 @@ class item_location::impl class item_on_vehicle; impl() = default; - impl( std::list *what ) : what( &what->front() ), whatstart( what ) {} impl( item *what ) : what( what ) {} impl( int idx ) : idx( idx ) {} @@ -106,32 +105,16 @@ class item_location::impl } item *target() const { - if( idx >= 0 ) { + if( what == nullptr ) { what = unpack( idx ); - idx = -1; } return what; } - // Add up the total charges of a stack of items - int charges_in_stack( unsigned int countOnly ) const { - int sum = 0; - unsigned int c = countOnly; - // If the list points to a nullpointer, then the target pointer must still be valid - if( whatstart == nullptr ) { - return target()->charges; - } - for( std::list::iterator it = whatstart->begin(); it != whatstart->end() && c; ++it, --c ) { - sum += it->charges; - } - return sum; - } - private: mutable item *what = nullptr; mutable int idx = -1; //Only used for stacked cash card currently, needed to be able to process a stack of different items - mutable std::list *whatstart = nullptr; public: //Flag that controls whether functions like obtain() should stack the obtained item @@ -156,7 +139,6 @@ class item_location::impl::item_on_map : public item_location::impl public: item_on_map( const map_cursor &cur, item *which ) : impl( which ), cur( cur ) {} - item_on_map( const map_cursor &cur, std::list *which ) : impl( which ), cur( cur ) {} item_on_map( const map_cursor &cur, int idx ) : impl( idx ), cur( cur ) {} bool valid() const override { @@ -248,7 +230,6 @@ class item_location::impl::item_on_person : public item_location::impl Character &who; public: - item_on_person( Character &who, std::list *which ) : impl( which ), who( who ) {} item_on_person( Character &who, item *which ) : impl( which ), who( who ) {} item_on_person( Character &who, int idx ) : impl( idx ), who( who ) {} @@ -376,7 +357,6 @@ class item_location::impl::item_on_vehicle : public item_location::impl public: item_on_vehicle( const vehicle_cursor &cur, item *which ) : impl( which ), cur( cur ) {} - item_on_vehicle( const vehicle_cursor &cur, std::list *which ) : impl( which ), cur( cur ) {} item_on_vehicle( const vehicle_cursor &cur, int idx ) : impl( idx ), cur( cur ) {} bool valid() const override { @@ -475,31 +455,17 @@ class item_location::impl::item_on_vehicle : public item_location::impl } }; -// use of std::unique_ptr forces these definitions within the implementation -item_location::item_location( item_location && ) = default; -item_location &item_location::operator=( item_location && ) = default; -item_location::~item_location() = default; - const item_location item_location::nowhere; item_location::item_location() : ptr( new impl::nowhere() ) {} -item_location::item_location( const map_cursor &mc, std::list *which ) - : ptr( new impl::item_on_map( mc, which ) ) {} - item_location::item_location( const map_cursor &mc, item *which ) : ptr( new impl::item_on_map( mc, which ) ) {} -item_location::item_location( Character &ch, std::list *which ) - : ptr( new impl::item_on_person( ch, which ) ) {} - item_location::item_location( Character &ch, item *which ) : ptr( new impl::item_on_person( ch, which ) ) {} -item_location::item_location( const vehicle_cursor &vc, std::list *which ) - : ptr( new impl::item_on_vehicle( vc, which ) ) {} - item_location::item_location( const vehicle_cursor &vc, item *which ) : ptr( new impl::item_on_vehicle( vc, which ) ) {} @@ -569,11 +535,6 @@ void item_location::deserialize( JsonIn &js ) } } -int item_location::charges_in_stack( unsigned int countOnly ) const -{ - return ptr->charges_in_stack( countOnly ); -} - item_location::type item_location::where() const { return ptr->where(); @@ -623,13 +584,6 @@ const item *item_location::get_item() const return ptr->target(); } -item_location item_location::clone() const -{ - item_location res; - res.ptr = ptr; - return res; -} - void item_location::set_should_stack( bool should_stack ) const { ptr->should_stack = should_stack; diff --git a/src/item_location.h b/src/item_location.h index 11eb760741ea8..1ae99a772d6b1 100644 --- a/src/item_location.h +++ b/src/item_location.h @@ -32,30 +32,20 @@ class item_location }; item_location(); - item_location( const item_location & ) = delete; - item_location &operator= ( const item_location & ) = delete; - item_location( item_location && ); - item_location &operator=( item_location && ); - ~item_location(); static const item_location nowhere; item_location( Character &ch, item *which ); - item_location( Character &ch, std::list *which ); item_location( const map_cursor &mc, item *which ); - item_location( const map_cursor &mc, std::list *which ); item_location( const vehicle_cursor &vc, item *which ); - item_location( const vehicle_cursor &vc, std::list *which ); void serialize( JsonOut &js ) const; void deserialize( JsonIn &js ); - int charges_in_stack( unsigned int countOnly ) const; - bool operator==( const item_location &rhs ) const; bool operator!=( const item_location &rhs ) const; - operator bool() const; + explicit operator bool() const; item &operator*(); const item &operator*() const; @@ -94,24 +84,12 @@ class item_location item *get_item(); const item *get_item() const; - /** - * Clones this instance - * @warning usage should be restricted to implementing custom copy-constructors - */ - item_location clone() const; - void set_should_stack( bool should_stack ) const; private: class impl; std::shared_ptr ptr; - - /* Not implemented on purpose. This triggers a compiler / linker - * error when used in any implicit conversion. It prevents the - * implicit conversion to int. */ - template - operator T() const; }; #endif diff --git a/src/item_stack.cpp b/src/item_stack.cpp index 137a21b61db55..d6b59b146bae1 100644 --- a/src/item_stack.cpp +++ b/src/item_stack.cpp @@ -5,16 +5,17 @@ #include #include "item.h" +#include "output.h" #include "units.h" size_t item_stack::size() const { - return mystack->size(); + return items->size(); } bool item_stack::empty() const { - return mystack->empty(); + return items->empty(); } void item_stack::clear() @@ -25,60 +26,80 @@ void item_stack::clear() } } -std::list::iterator item_stack::begin() +item_stack::iterator item_stack::begin() { - return mystack->begin(); + return items->begin(); } -std::list::iterator item_stack::end() +item_stack::iterator item_stack::end() { - return mystack->end(); + return items->end(); } -std::list::const_iterator item_stack::begin() const +item_stack::const_iterator item_stack::begin() const { - return mystack->cbegin(); + return items->cbegin(); } -std::list::const_iterator item_stack::end() const +item_stack::const_iterator item_stack::end() const { - return mystack->cend(); + return items->cend(); } -std::list::reverse_iterator item_stack::rbegin() +item_stack::reverse_iterator item_stack::rbegin() { - return mystack->rbegin(); + return items->rbegin(); } -std::list::reverse_iterator item_stack::rend() +item_stack::reverse_iterator item_stack::rend() { - return mystack->rend(); + return items->rend(); } -std::list::const_reverse_iterator item_stack::rbegin() const +item_stack::const_reverse_iterator item_stack::rbegin() const { - return mystack->crbegin(); + return items->crbegin(); } -std::list::const_reverse_iterator item_stack::rend() const +item_stack::const_reverse_iterator item_stack::rend() const { - return mystack->crend(); + return items->crend(); } -item &item_stack::front() +item_stack::iterator item_stack::get_iterator_from_pointer( item *it ) { - return mystack->front(); + return items->get_iterator_from_pointer( it ); } -item &item_stack::operator[]( size_t index ) +item_stack::iterator item_stack::get_iterator_from_index( size_t idx ) { - return *( std::next( mystack->begin(), index ) ); + return items->get_iterator_from_index( idx ); +} + +size_t item_stack::get_index_from_iterator( const item_stack::const_iterator &it ) +{ + return items->get_index_from_iterator( it ); +} + +item &item_stack::only_item() +{ + if( empty() ) { + debugmsg( "Missing item at target location" ); + return null_item_reference(); + } else if( size() > 1 ) { + debugmsg( "More than one item at target location: %s", enumerate_as_string( begin(), + end(), []( const item & it ) { + return it.typeId(); + } ) ); + return null_item_reference(); + } + return *items->begin(); } units::volume item_stack::stored_volume() const { units::volume ret = 0_ml; - for( const item &it : *mystack ) { + for( const item &it : *items ) { ret += it.volume(); } return ret; @@ -100,7 +121,7 @@ int item_stack::amount_can_fit( const item &it ) const item *item_stack::stacks_with( const item &it ) { - for( item &here : *mystack ) { + for( item &here : *items ) { if( here.stacks_with( it ) ) { return &here; } @@ -110,7 +131,7 @@ item *item_stack::stacks_with( const item &it ) const item *item_stack::stacks_with( const item &it ) const { - for( const item &here : *mystack ) { + for( const item &here : *items ) { if( here.stacks_with( it ) ) { return &here; } diff --git a/src/item_stack.h b/src/item_stack.h index 27d776b03c975..f7eaeaa4e7d4e 100644 --- a/src/item_stack.h +++ b/src/item_stack.h @@ -3,15 +3,15 @@ #define ITEM_STACK_H #include -#include -#include "units.h" +#include "colony.h" #include "item.h" +#include "units.h" // A wrapper class to bundle up the references needed for a caller to safely manipulate // items and obtain information about items at a particular map x/y location. // Note this does not expose the container itself, -// which means you cannot call e.g. vector::erase() directly. +// which means you cannot call e.g. cata::colony::erase() directly. // Pure virtual base class for a collection of items with origin information. // Only a subset of the functionality is callable without casting to the specific @@ -19,28 +19,38 @@ class item_stack { protected: - std::list *mystack; + cata::colony *items; public: - item_stack( std::list *mystack ) : mystack( mystack ) { } + using iterator = cata::colony::iterator; + using const_iterator = cata::colony::const_iterator; + using reverse_iterator = cata::colony::reverse_iterator; + using const_reverse_iterator = cata::colony::const_reverse_iterator; + + item_stack( cata::colony *items ) : items( items ) { } size_t size() const; bool empty() const; - virtual std::list::iterator erase( std::list::iterator it ) = 0; - virtual void push_back( const item &newitem ) = 0; - virtual void insert_at( std::list::iterator, const item &newitem ) = 0; + virtual void insert( const item &newitem ) = 0; + virtual iterator erase( const_iterator it ) = 0; virtual void clear(); - item &front(); - item &operator[]( size_t index ); + // Will cause a debugmsg if there is not exactly one item at the location + item &only_item(); + + // While iterators to colonies are stable, indexes are not. + // These functions should only be used for serialization/deserialization + iterator get_iterator_from_pointer( item *it ); + iterator get_iterator_from_index( size_t idx ); + size_t get_index_from_iterator( const const_iterator &it ); - std::list::iterator begin(); - std::list::iterator end(); - std::list::const_iterator begin() const; - std::list::const_iterator end() const; - std::list::reverse_iterator rbegin(); - std::list::reverse_iterator rend(); - std::list::const_reverse_iterator rbegin() const; - std::list::const_reverse_iterator rend() const; + iterator begin(); + iterator end(); + const_iterator begin() const; + const_iterator end() const; + reverse_iterator rbegin(); + reverse_iterator rend(); + const_reverse_iterator rbegin() const; + const_reverse_iterator rend() const; /** Maximum number of items allowed here */ virtual int count_limit() const = 0; diff --git a/src/itype.h b/src/itype.h index d221b3fc35cfe..810dc5c7875cb 100644 --- a/src/itype.h +++ b/src/itype.h @@ -114,7 +114,7 @@ struct islot_comestible { std::string tool = "null"; /** Defaults # of charges (drugs, loaf of bread? etc) */ - long def_charges = 1; + int def_charges = 1; /** effect on character thirst (may be negative) */ int quench = 0; @@ -294,6 +294,10 @@ struct islot_book { * Which skill it upgrades, if any. Can be @ref skill_id::NULL_ID. */ skill_id skill = skill_id::NULL_ID(); + /** + * Which martial art it teaches. Can be @ref matype_id::NULL_ID. + */ + matype_id martial_art = matype_id::NULL_ID(); /** * The skill level the book provides. */ @@ -638,7 +642,7 @@ struct islot_ammo : common_ranged_data { /** * Default charges. */ - long def_charges = 1; + int def_charges = 1; /** * TODO: document me. diff --git a/src/iuse.cpp b/src/iuse.cpp index d3d999b729f38..fb2bb81d20163 100644 --- a/src/iuse.cpp +++ b/src/iuse.cpp @@ -15,6 +15,8 @@ #include #include #include +#include +#include #include "action.h" #include "artifact.h" @@ -30,7 +32,9 @@ #include "fungal_effects.h" #include "game.h" #include "game_inventory.h" +#include "iexamine.h" #include "inventory.h" +#include "iteminfo_query.h" #include "iuse_actor.h" // For firestarter #include "json.h" #include "line.h" @@ -131,16 +135,21 @@ const efftype_id effect_antibiotic( "antibiotic" ); const efftype_id effect_antibiotic_visible( "antibiotic_visible" ); const efftype_id effect_asthma( "asthma" ); const efftype_id effect_attention( "attention" ); +const efftype_id effect_beartrap( "beartrap" ); const efftype_id effect_bite( "bite" ); const efftype_id effect_bleed( "bleed" ); const efftype_id effect_blind( "blind" ); const efftype_id effect_bloodworms( "bloodworms" ); const efftype_id effect_boomered( "boomered" ); +const efftype_id effect_bouldering( "bouldering" ); const efftype_id effect_brainworms( "brainworms" ); const efftype_id effect_cig( "cig" ); const efftype_id effect_contacts( "contacts" ); +const efftype_id effect_corroding( "corroding" ); +const efftype_id effect_crushed( "crushed" ); const efftype_id effect_cureall( "cureall" ); const efftype_id effect_datura( "datura" ); +const efftype_id effect_dazed( "dazed" ); const efftype_id effect_dermatik( "dermatik" ); const efftype_id effect_docile( "docile" ); const efftype_id effect_downed( "downed" ); @@ -151,19 +160,36 @@ const efftype_id effect_foodpoison( "foodpoison" ); const efftype_id effect_formication( "formication" ); const efftype_id effect_fungus( "fungus" ); const efftype_id effect_glowing( "glowing" ); +const efftype_id effect_glowing_led( "glowy_led" ); const efftype_id effect_hallu( "hallu" ); +const efftype_id effect_happy( "happy" ); +const efftype_id effect_harnessed( "harnessed" ); +const efftype_id effect_has_bag( "has_bag" ); +const efftype_id effect_haslight( "haslight" ); const efftype_id effect_high( "high" ); +const efftype_id effect_in_pit( "in_pit" ); const efftype_id effect_infected( "infected" ); const efftype_id effect_jetinjector( "jetinjector" ); +const efftype_id effect_lack_sleep( "lack_sleep" ); +const efftype_id effect_laserlocked( "laserlocked" ); +const efftype_id effect_lying_down( "lying_down" ); const efftype_id effect_meth( "meth" ); +const efftype_id effect_monster_armor( "monster_armor" ); const efftype_id effect_music( "music" ); +const efftype_id effect_onfire( "onfire" ); const efftype_id effect_paincysts( "paincysts" ); const efftype_id effect_panacea( "panacea" ); const efftype_id effect_pet( "pet" ); const efftype_id effect_poison( "poison" ); const efftype_id effect_recover( "recover" ); +const efftype_id effect_ridden( "ridden" ); +const efftype_id effect_riding( "riding" ); const efftype_id effect_run( "run" ); +const efftype_id effect_sad( "sad" ); +const efftype_id effect_saddled( "monster_saddled" ); +const efftype_id effect_sap( "sap" ); const efftype_id effect_shakes( "shakes" ); +const efftype_id effect_sleep( "sleep" ); const efftype_id effect_slimed( "slimed" ); const efftype_id effect_smoke( "smoke" ); const efftype_id effect_spores( "spores" ); @@ -175,6 +201,7 @@ const efftype_id effect_teargas( "teargas" ); const efftype_id effect_tapeworm( "tapeworm" ); const efftype_id effect_teleglow( "teleglow" ); const efftype_id effect_tetanus( "tetanus" ); +const efftype_id effect_tied( "tied" ); const efftype_id effect_took_anticonvulsant_visible( "took_anticonvulsant_visible" ); const efftype_id effect_took_flumed( "took_flumed" ); const efftype_id effect_took_prozac( "took_prozac" ); @@ -186,6 +213,7 @@ const efftype_id effect_valium( "valium" ); const efftype_id effect_visuals( "visuals" ); const efftype_id effect_weak_antibiotic( "weak_antibiotic" ); const efftype_id effect_weak_antibiotic_visible( "weak_antibiotic_visible" ); +const efftype_id effect_webbed( "webbed" ); const efftype_id effect_weed_high( "weed_high" ); const efftype_id effect_winded( "winded" ); const efftype_id effect_magnesium_supplements( "magnesium" ); @@ -221,6 +249,58 @@ static const trait_id trait_URSINE_EYE( "URSINE_EYE" ); static const quality_id AXE( "AXE" ); static const quality_id DIG( "DIG" ); +struct extended_photo_def; +struct object_names_collection; + +static void item_save_monsters( player &p, item &it, const std::vector &monster_vec, + const int photo_quality ); +static bool show_photo_selection( player &p, item &it, const std::string &var_name ); + +static bool item_read_extended_photos( item &, std::vector &, std::string, + bool = false ); +static void item_write_extended_photos( item &, const std::vector &, + std::string ); + +static std::string format_object_pair( const std::pair &pair, + const std::string &article ); +static std::string format_object_pair_article( const std::pair &pair ); +static std::string format_object_pair_no_article( const std::pair &pair ); + +static std::string colorized_field_description_at( const tripoint &point ); +static std::string colorized_trap_name_at( const tripoint &point ); +static std::string colorized_ter_name_flags_at( const tripoint &point, + const std::vector &flags = {}, const std::vector &ter_whitelist = {} ); +static std::string colorized_feature_description_at( const tripoint center_point, bool &item_found, + const units::volume &min_visible_volume ); + +static std::string colorized_item_name( const item &item ); +static std::string colorized_item_description( const item &item ); +static const item get_top_item_at_point( const tripoint &point, + const units::volume &min_visible_volume ); + +static std::string effects_description_for_creature( Creature *const creature, std::string &pose, + const std::string &pronoun_sex ); + +static object_names_collection enumerate_objects_around_point( const tripoint point, + const int radius, const tripoint bounds_center_point, const int bounds_radius, + const tripoint camera_pos, const units::volume &min_visible_volume, bool create_figure_desc, + std::unordered_set &ignored_points, + std::unordered_set &vehicles_recorded ); +static extended_photo_def photo_def_for_camera_point( const tripoint aim_point, + const tripoint camera_pos, + std::vector &monster_vec, std::vector &player_vec ); + +static const std::vector camera_ter_whitelist_flags = { + "HIDE_PLACE", "FUNGUS", "TREE", "PERMEABLE", "SHRUB", + "PLACE_ITEM", "GROWTH_HARVEST", "GROWTH_MATURE", "GOES_UP", + "GOES_DOWN", "RAMP", "SHARP", "SIGN", "CLIMBABLE" +}; +static const std::vector camera_ter_whitelist_types = { + ter_str_id( "t_pit_covered" ), ter_str_id( "t_grave_new" ), ter_str_id( "t_grave" ), ter_str_id( "t_pit" ), + ter_str_id( "t_pit_shallow" ), ter_str_id( "t_pit_corpsed" ), ter_str_id( "t_pit_spiked" ), + ter_str_id( "t_pit_spiked_covered" ), ter_str_id( "t_pit_glass" ), ter_str_id( "t_pit_glass" ), ter_str_id( "t_utility_light" ) +}; + void remove_radio_mod( item &it, player &p ) { if( !it.has_flag( "RADIO_MOD" ) ) { @@ -1956,7 +2036,7 @@ int iuse::extinguisher( player *p, item *it, bool, const tripoint & ) p->moves -= to_moves( 2_seconds ); // Reduce the strength of fire (if any) in the target tile. - g->m.adjust_field_strength( dest, fd_fire, 0 - rng( 2, 3 ) ); + g->m.adjust_field_intensity( dest, fd_fire, 0 - rng( 2, 3 ) ); // Also spray monsters in that tile. if( monster *const mon_ptr = g->critter_at( dest, true ) ) { @@ -1987,7 +2067,7 @@ int iuse::extinguisher( player *p, item *it, bool, const tripoint & ) dest.x += ( dest.x - p->posx() ); dest.y += ( dest.y - p->posy() ); - g->m.adjust_field_strength( dest, fd_fire, std::min( 0 - rng( 0, 1 ) + rng( 0, 1 ), 0 ) ); + g->m.adjust_field_intensity( dest, fd_fire, std::min( 0 - rng( 0, 1 ) + rng( 0, 1 ), 0 ) ); } return it->type->charges_to_use(); @@ -2118,7 +2198,7 @@ int iuse::water_purifier( player *p, item *it, bool, const tripoint & ) int iuse::radio_off( player *p, item *it, bool, const tripoint & ) { - if( !it->ammo_sufficient() ) { + if( !it->units_sufficient( *p ) ) { p->add_msg_if_player( _( "It's dead." ) ); } else { p->add_msg_if_player( _( "You turn the radio on." ) ); @@ -2241,7 +2321,7 @@ int iuse::radio_on( player *p, item *it, bool t, const tripoint &pos ) int iuse::noise_emitter_off( player *p, item *it, bool, const tripoint & ) { - if( !it->ammo_sufficient() ) { + if( !it->units_sufficient( *p ) ) { p->add_msg_if_player( _( "It's dead." ) ); } else { p->add_msg_if_player( _( "You turn the noise emitter on." ) ); @@ -2269,6 +2349,12 @@ int iuse::ma_manual( player *p, item *it, bool, const tripoint & ) const matype_id style_to_learn = martial_art_learned_from( *it->type ); + const martialart &ma = style_to_learn.obj(); + if( !style_to_learn.is_valid() ) { + // debugmsg will already have been sent by .obj call + return 0; + } + if( p->has_martialart( style_to_learn ) ) { p->add_msg_if_player( m_info, _( "You already know all this book has to teach." ) ); return 0; @@ -2276,7 +2362,6 @@ int iuse::ma_manual( player *p, item *it, bool, const tripoint & ) p->ma_styles.push_back( style_to_learn ); - const martialart &ma = style_to_learn.obj(); p->add_msg_if_player( m_good, _( "You learn the essential elements of %s." ), _( ma.name ) ); p->add_msg_if_player( m_info, _( "%s to select martial arts style." ), @@ -3142,12 +3227,11 @@ int iuse::jackhammer( player *p, item *it, bool, const tripoint &pos ) return 0; } - int turns = 100; + int turns = to_moves( 30_minutes ); if( g->m.move_cost( pnt ) == 2 ) { // We're breaking up some flat surface like pavement, which is much easier turns /= 2; } - turns *= MINUTES( 30 ); const std::vector helpers = g->u.get_crafting_helpers(); const int helpersize = g->u.get_num_crafting_helpers( 3 ); @@ -3196,11 +3280,11 @@ int iuse::pickaxe( player *p, item *it, bool, const tripoint &pos ) } 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 ) { // We're breaking up some flat surface like pavement, which is much easier moves /= 2; } - moves *= ( ( MAX_STAT + 4 ) - std::min( p->str_cur, MAX_STAT ) ) * to_seconds( 5_minutes ); const std::vector helpers = g->u.get_crafting_helpers(); const int helpersize = g->u.get_num_crafting_helpers( 3 ); @@ -3248,11 +3332,11 @@ int iuse::burrow( player *p, item *it, bool, const tripoint &pos ) } 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 ) { // We're breaking up some flat surface like pavement, which is much easier moves /= 2; } - moves *= ( ( MAX_STAT + 3 ) - std::min( p->str_cur, MAX_STAT ) ) * to_seconds( 2_minutes ); p->assign_activity( activity_id( "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." ), @@ -3398,11 +3482,11 @@ int iuse::throwable_extinguisher_act( player *, item *it, bool, const tripoint & } if( g->m.get_field( pos, fd_fire ) != nullptr ) { // Reduce the strength of fire (if any) in the target tile. - g->m.adjust_field_strength( pos, fd_fire, 0 - 1 ); + g->m.adjust_field_intensity( pos, fd_fire, 0 - 1 ); // 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.adjust_field_strength( dest, fd_fire, 0 - rng( 0, 1 ) ); + g->m.adjust_field_intensity( dest, fd_fire, 0 - rng( 0, 1 ) ); } } return 1; @@ -3652,8 +3736,8 @@ int iuse::molotov_lit( player *p, item *it, bool t, const tripoint &pos ) } else { if( !t ) { for( auto &pt : g->m.points_in_radius( pos, 1, 0 ) ) { - const int density = 1 + one_in( 3 ) + one_in( 5 ); - g->m.add_field( pt, fd_fire, density ); + const int intensity = 1 + one_in( 3 ) + one_in( 5 ); + g->m.add_field( pt, fd_fire, intensity ); } } } @@ -3811,7 +3895,7 @@ int iuse::portal( player *p, item *it, bool, const tripoint & ) int iuse::tazer( player *p, item *it, bool, const tripoint &pos ) { - if( !it->ammo_sufficient() ) { + if( !it->units_sufficient( *p ) ) { return 0; } @@ -3904,7 +3988,7 @@ int iuse::shocktonfa_off( player *p, item *it, bool t, const tripoint &pos ) return iuse::tazer2( p, it, t, pos ); } case 1: { - if( !it->ammo_sufficient() ) { + if( !it->units_sufficient( *p ) ) { p->add_msg_if_player( m_info, _( "The batteries are dead." ) ); return 0; } else { @@ -3922,7 +4006,7 @@ int iuse::shocktonfa_on( player *p, item *it, bool t, const tripoint &pos ) if( t ) { // Effects while simply on } else { - if( !it->ammo_sufficient() ) { + if( !it->units_sufficient( *p ) ) { p->add_msg_if_player( m_info, _( "Your tactical tonfa is out of power." ) ); it->convert( "shocktonfa_off" ).active = false; } else { @@ -3946,7 +4030,7 @@ int iuse::shocktonfa_on( player *p, item *it, bool t, const tripoint &pos ) int iuse::mp3( player *p, item *it, bool, const tripoint & ) { - if( !it->ammo_sufficient() ) { + if( !it->units_sufficient( *p ) ) { p->add_msg_if_player( m_info, _( "The device's batteries are dead." ) ); } else if( p->has_active_item( "mp3_on" ) || p->has_active_item( "smartphone_music" ) ) { p->add_msg_if_player( m_info, _( "You are already listening to music!" ) ); @@ -4341,7 +4425,7 @@ int iuse::vibe( player *p, item *it, bool, const tripoint & ) p->add_msg_if_player( m_info, _( "It's waterproof, but oxygen maybe?" ) ); return 0; } - if( !it->ammo_sufficient() ) { + if( !it->units_sufficient( *p ) ) { p->add_msg_if_player( m_info, _( "The %s's batteries are dead." ), it->tname() ); return 0; } @@ -5272,7 +5356,7 @@ int iuse::heat_food( player *p, item *it, bool, const tripoint & ) int iuse::hotplate( player *p, item *it, bool, const tripoint & ) { - if( it->typeId() != "atomic_coffeepot" && ( !it->ammo_sufficient() ) ) { + if( it->typeId() != "atomic_coffeepot" && ( !it->units_sufficient( *p ) ) ) { p->add_msg_if_player( m_info, _( "The %s's batteries are dead." ), it->tname() ); return 0; } @@ -5482,7 +5566,7 @@ int iuse::radglove( player *p, item *it, bool, const tripoint & ) p->add_msg_if_player( m_info, _( "You must wear the radiation biomonitor before you can activate it." ) ); return 0; - } else if( !it->ammo_sufficient() ) { + } else if( !it->units_sufficient( *p ) ) { p->add_msg_if_player( m_info, _( "The radiation biomonitor needs batteries to function." ) ); return 0; } else { @@ -5536,7 +5620,7 @@ int iuse::contacts( player *p, item *it, bool, const tripoint & ) int iuse::talking_doll( player *p, item *it, bool, const tripoint & ) { - if( !it->ammo_sufficient() ) { + if( !it->units_sufficient( *p ) ) { p->add_msg_if_player( m_info, _( "The %s's batteries are dead." ), it->tname() ); return 0; } @@ -5803,7 +5887,7 @@ bool iuse::robotcontrol_can_target( player *p, const monster &m ) int iuse::robotcontrol( player *p, item *it, bool, const tripoint & ) { - if( !it->ammo_sufficient() ) { + if( !it->units_sufficient( *p ) ) { p->add_msg_if_player( _( "The %s's batteries are dead." ), it->tname() ); return 0; @@ -6059,6 +6143,20 @@ static bool einkpc_download_memory_card( player &p, item &eink, item &mc ) } } + if( mc.has_var( "MC_EXTENDED_PHOTOS" ) ) { + std::vector extended_photos; + try { + item_read_extended_photos( mc, extended_photos, "MC_EXTENDED_PHOTOS" ); + item_read_extended_photos( eink, extended_photos, "EIPC_EXTENDED_PHOTOS", true ); + item_write_extended_photos( eink, extended_photos, "EIPC_EXTENDED_PHOTOS" ); + something_downloaded = true; + p.add_msg_if_player( m_good, _( "You have downloaded your photos." ) ); + } catch( const JsonError &e ) { + debugmsg( "Error card reading photos (loaded photos = %i) : %s", extended_photos.size(), + e.c_str() ); + } + } + const auto monster_photos = mc.get_var( "MC_MONSTER_PHOTOS" ); if( !monster_photos.empty() ) { something_downloaded = true; @@ -6150,7 +6248,7 @@ int iuse::einktabletpc( player *p, item *it, bool t, const tripoint &pos ) } else if( !p->is_npc() ) { enum { - ei_invalid, ei_photo, ei_music, ei_recipe, ei_monsters, ei_download, ei_decrypt + ei_invalid, ei_photo, ei_music, ei_recipe, ei_uploaded_photos, ei_monsters, ei_download, ei_decrypt }; if( p->is_underwater() ) { @@ -6173,7 +6271,7 @@ int iuse::einktabletpc( player *p, item *it, bool t, const tripoint &pos ) const int photos = it->get_var( "EIPC_PHOTOS", 0 ); if( photos > 0 ) { - amenu.addentry( ei_photo, true, 'p', _( "Photos [%d]" ), photos ); + amenu.addentry( ei_photo, true, 'p', _( "Unsorted photos [%d]" ), photos ); } else { amenu.addentry( ei_photo, false, 'p', _( "No photos on device" ) ); } @@ -6193,6 +6291,10 @@ int iuse::einktabletpc( player *p, item *it, bool t, const tripoint &pos ) amenu.addentry( ei_recipe, true, 'r', _( "View recipes on E-ink screen" ) ); } + if( !it->get_var( "EIPC_EXTENDED_PHOTOS" ).empty() ) { + amenu.addentry( ei_uploaded_photos, true, 'l', _( "Your photos" ) ); + } + if( !it->get_var( "EINK_MONSTER_PHOTOS" ).empty() ) { amenu.addentry( ei_monsters, true, 'y', _( "Your collection of monsters" ) ); } else { @@ -6312,6 +6414,11 @@ int iuse::einktabletpc( player *p, item *it, bool t, const tripoint &pos ) return it->type->charges_to_use(); } + if( ei_uploaded_photos == choice ) { + show_photo_selection( *p, *it, "EIPC_EXTENDED_PHOTOS" ); + return it->type->charges_to_use(); + } + if( ei_monsters == choice ) { uilist pmenu; @@ -6436,12 +6543,12 @@ int iuse::einktabletpc( player *p, item *it, bool t, const tripoint &pos ) return 0; } -struct npc_photo_def : public JsonDeserializer, public JsonSerializer { +struct extended_photo_def : public JsonDeserializer, public JsonSerializer { int quality; std::string name; std::string description; - npc_photo_def() = default; + extended_photo_def() = default; void deserialize( JsonIn &jsin ) override { JsonObject obj = jsin.get_object(); quality = obj.get_int( "quality" ); @@ -6458,20 +6565,809 @@ struct npc_photo_def : public JsonDeserializer, public JsonSerializer { } }; +static std::string colorized_trap_name_at( const tripoint &point ) +{ + const trap &trap = g->m.tr_at( point ); + std::string name; + if( !trap.is_null() && trap.get_visibility() <= 1 ) { + name = colorize( trap.name(), trap.color ) + _( " on " ); + }; + return name; +} + +static std::string colorized_field_description_at( const tripoint &point ) +{ + static const std::unordered_set> covered_in_affix_ids = { + fd_blood, fd_bile, fd_gibs_flesh, fd_gibs_veggy, fd_web, + fd_slime, fd_acid, fd_sap, fd_sludge, fd_blood_veggy, + fd_blood_insect, fd_blood_invertebrate, fd_gibs_insect, + fd_gibs_invertebrate, fd_rubble + }; + static const std::unordered_set> on_affix_ids = { + fd_fire, fd_flame_burst + }; + static const std::unordered_set> under_affix_ids = { + fd_gas_vent, fd_fire_vent, fd_fatigue + }; + static const std::unordered_set> illuminated_by_affix_ids = { + fd_spotlight, fd_laser, fd_dazzling, fd_spotlight, fd_electricity + }; + static const std::vector>, std::string>> + affixes_vec = { + { covered_in_affix_ids, _( " covered in %s" ) }, + { on_affix_ids, _( " on %s" ) }, + { under_affix_ids, _( " under %s" ) }, + { illuminated_by_affix_ids, _( " illuminated by %s" ) } + }; // anything else is "in %s cloud" + + std::string field_text; + const field &field = g->m.field_at( point ); + const field_entry *entry = field.find_field( field.field_symbol() ); + if( entry ) { + std::string affix; + for( const auto &pair : affixes_vec ) { + if( pair.first.find( entry->get_field_type() ) != pair.first.end() ) { + affix = pair.second; + } + } + if( affix.empty() ) { + field_text = string_format( " in %s cloud", colorize( entry->name(), entry->color() ) ); + } else { + field_text = string_format( affix, colorize( entry->name(), entry->color() ) ); + } + } + return field_text; +} + +static std::string colorized_item_name( const item &item ) +{ + nc_color color = item.color_in_inventory(); + std::string damtext = item.damage() != 0 ? item.durability_indicator() : ""; + return damtext + colorize( item.tname( 1, false ), color ); +} + +static std::string colorized_item_description( const item &item ) +{ + std::vector dummy; + iteminfo_query query = iteminfo_query( + std::vector { + iteminfo_parts::DESCRIPTION, + iteminfo_parts::DESCRIPTION_NOTES, + iteminfo_parts::DESCRIPTION_CONTENTS + } ) ; + return item.info( dummy, &query, 1 ); +} + +static const item get_top_item_at_point( const tripoint &point, + const units::volume &min_visible_volume ) +{ + map_stack items = g->m.i_at( point ); + // iterate from topmost item down to ground + for( const item &it : items ) { + if( it.volume() > min_visible_volume ) { + // return top (or first big enough) item to the list + return it; + } + } + return item(); +} + +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 ); + std::string name = colorize( ter->name(), ter->color() ); + const std::string &graffiti_message = g->m.graffiti_at( point ); + const std::string trap_name = colorized_trap_name_at( point ); + + if( !graffiti_message.empty() ) { + name += string_format( _( " with graffiti \"%s\"" ), graffiti_message ); + return name; + } + if( ter_whitelist.empty() && flags.empty() ) { + return name; + } + if( !ter->open.is_null() || ( ter->examine != iexamine::none && + ter->examine != iexamine::fungus && + ter->examine != iexamine::water_source && + ter->examine != iexamine::dirtmound ) ) { + return name; + } + for( const ter_str_id &ter_good : ter_whitelist ) { + if( ter->id == ter_good ) { + return name; + } + } + for( const std::string &flag : flags ) { + if( ter->has_flag( flag ) ) { + return name; + } + } + + return std::string(); +} + +static std::string colorized_feature_description_at( const tripoint center_point, bool &item_found, + const units::volume &min_visible_volume ) +{ + item_found = false; + const furn_id furn = g->m.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 ); + if( !sign_message.empty() ) { + furn_str += string_format( _( " with message \"%s\"" ), sign_message ); + } + if( !furn->has_flag( "CONTAINER" ) && !furn->has_flag( "SEALED" ) ) { + const item item = get_top_item_at_point( center_point, min_visible_volume ); + if( !item.is_null() ) { + furn_str += string_format( _( " with %s on it" ), colorized_item_name( item ) ); + item_found = true; + } + } + return furn_str; + } + return std::string(); +} + +static std::string format_object_pair( const std::pair &pair, + const std::string &article ) +{ + if( pair.second == 1 ) { + return string_format( "%s%s", article, pair.first ); + } else if( pair.second > 1 ) { + return string_format( "%s%i %s", article, pair.second, pair.first ); + } + return std::string(); +} +static std::string format_object_pair_article( const std::pair &pair ) +{ + return format_object_pair( pair, pgettext( "Article 'a', replace it with empty " + "string if it is not used in language", "a " ) ); +} +static std::string format_object_pair_no_article( const std::pair &pair ) +{ + return format_object_pair( pair, "" ); +} + +static std::string effects_description_for_creature( Creature *const creature, std::string &pose, + const std::string &pronoun_sex ) +{ + struct ef_con { // effect constraint + std::string status; + std::string pose; + int intensity_lower_limit; + ef_con( std::string status, std::string pose, int intensity_lower_limit ) : + status( status ), pose( pose ), intensity_lower_limit( intensity_lower_limit ) {} + ef_con( std::string status, std::string pose ) : + status( status ), pose( pose ), intensity_lower_limit( 0 ) {} + ef_con( std::string status, int intensity_lower_limit ) : + status( status ), pose(), intensity_lower_limit( intensity_lower_limit ) {} + ef_con( std::string status ) : + status( status ), pose(), intensity_lower_limit( 0 ) {} + }; + static const std::unordered_map vec_effect_status = { + { effect_onfire, ef_con( _( " is on fire. " ) ) }, + { effect_bleed, ef_con( _( " is bleeding. " ), 1 ) }, + { effect_happy, ef_con( _( " looks happy. " ), 13 ) }, + { effect_downed, ef_con( "", _( "downed" ) ) }, + { effect_in_pit, ef_con( "", _( "stuck" ) ) }, + { effect_stunned, ef_con( _( " is stunned. " ) ) }, + { effect_dazed, ef_con( _( " is dazed. " ) ) }, + { effect_beartrap, ef_con( _( " is stuck in beartrap. " ) ) }, + { effect_laserlocked, ef_con( _( " have tiny red dot on body. " ) ) }, + { effect_boomered, ef_con( _( " is covered in bile. " ) ) }, + { effect_glowing, ef_con( _( " is covered in glowing goo. " ) ) }, + { effect_slimed, ef_con( _( " is covered in thick goo. " ) ) }, + { effect_corroding, ef_con( _( " is covered in acid. " ) ) }, + { effect_sap, ef_con( _( " is coated in sap. " ) ) }, + { effect_webbed, ef_con( _( " is covered in webs. " ) ) }, + { effect_spores, ef_con( _( " is covered in spores. " ), 1 ) }, + { effect_crushed, ef_con( _( " lies under collapsed debris. " ), _( "lies" ) ) }, + { effect_lack_sleep, ef_con( _( " looks very tired. " ) ) }, + { effect_lying_down, ef_con( _( " is sleeping. " ), _( "lies" ) ) }, + { effect_sleep, ef_con( _( " is sleeping. " ), _( "lies" ) ) }, + { effect_haslight, ef_con( _( " is lit. " ) ) }, + { effect_saddled, ef_con( _( " is saddled. " ) ) }, + { effect_harnessed, ef_con( _( " is being harnessed by a vehicle. " ) ) }, + { effect_monster_armor, ef_con( _( " is wearing armor. " ) ) }, + { effect_has_bag, ef_con( _( " have bag attached. " ) ) }, + { effect_tied, ef_con( _( " is tied. " ) ) }, + { effect_bouldering, ef_con( "", _( "balancing" ) ) } + }; + + std::string figure_effects; + if( creature ) { + for( const auto &pair : vec_effect_status ) { + if( creature->get_effect_int( pair.first ) > pair.second.intensity_lower_limit ) { + if( !pair.second.status.empty() ) { + figure_effects += pronoun_sex + pair.second.status; + } + if( !pair.second.pose.empty() ) { + pose = pair.second.pose; + } + } + } + if( creature->has_effect( effect_sad ) ) { + int intensity = creature->get_effect_int( effect_sad ); + if( intensity > 500 && intensity <= 950 ) { + figure_effects += pronoun_sex + pgettext( "Someone", " looks sad. " ); + } else if( intensity > 950 ) { + figure_effects += pronoun_sex + pgettext( "Someone", " looks depressed. " ); + } + } + float pain = creature->get_pain() / 10.f; + if( pain > 3 ) { + figure_effects += pronoun_sex + pgettext( "Someone", " is writhing in pain. " ); + } + if( creature->has_effect( effect_riding ) ) { + pose = _( "rides" ); + monster *const mon = g->critter_at( creature->pos(), false ); + figure_effects += pronoun_sex + string_format( _( " is riding %s. " ), + colorize( mon->name(), c_light_blue ) ); + } + if( creature->has_effect( effect_glowing_led ) ) { + figure_effects += _( "A bionic LED is glowing softly. " ); + } + } + if( !figure_effects.empty() ) { // remove last space + figure_effects.erase( figure_effects.end() - 1 ); + } + return figure_effects; +} + +struct object_names_collection { + std::unordered_map + furniture, + vehicles, + items, + terrain; + + std::string figure_text; + std::string obj_nearby_text; +}; + +static object_names_collection enumerate_objects_around_point( const tripoint point, + const int radius, const tripoint bounds_center_point, const int bounds_radius, + const tripoint camera_pos, const units::volume &min_visible_volume, bool create_figure_desc, + 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 ); + int dist = rl_dist( camera_pos, point ); + + bool item_found = false; + std::unordered_set local_vehicles_recorded( vehicles_recorded ); + object_names_collection ret_obj; + + std::string description_part_on_figure; + std::string description_furniture_on_figure; + std::string description_terrain_on_figure; + + // 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 ) || + ( ignored_points.find( point_around_figure ) != ignored_points.end() && + !( point_around_figure == point && create_figure_desc ) ) ) { + continue; // disallow photos with not visible objects + } + units::volume volume_to_search = point_around_figure == bounds_center_point ? 0_ml : + min_visible_volume; + + std::string furn_desc = colorized_feature_description_at( point_around_figure, item_found, + volume_to_search ); + + const item item = get_top_item_at_point( point_around_figure, volume_to_search ); + std::string item_name = colorized_item_name( item ); + + const optional_vpart_position veh_part_pos = g->m.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 ); + std::string ter_desc = colorized_ter_name_flags_at( point_around_figure ); + + const std::string trap_name = colorized_trap_name_at( point_around_figure ); + const std::string field_desc = colorized_field_description_at( point_around_figure ); + + if( !furn_desc.empty() ) { + furn_desc = trap_name + furn_desc + field_desc; + if( point == point_around_figure && create_figure_desc ) { + description_furniture_on_figure = furn_desc; + } else { + ret_obj.furniture[ furn_desc ] ++; + } + } else if( veh_part_pos.has_value() ) { + const vehicle veh = veh_part_pos->vehicle(); + const std::string veh_name = colorize( veh.disp_name(), c_light_blue ); + const vehicle *veh_hash = &veh_part_pos->vehicle(); + + if( local_vehicles_recorded.find( veh_hash ) == local_vehicles_recorded.end() && + point != point_around_figure ) { + // new vehicle, point is not center + ret_obj.vehicles[ veh_name ] ++; + } else if( point == point_around_figure ) { + // point is center + description_part_on_figure = string_format( _( "%1$s from %2$s" ), + veh_part_pos.part_displayed()->part().name(), veh_name ); + if( ret_obj.vehicles.find( veh_name ) != ret_obj.vehicles.end() && + local_vehicles_recorded.find( veh_hash ) != local_vehicles_recorded.end() ) { + // remove vehicle name only if we previously added THIS vehicle name (in case of same name) + ret_obj.vehicles[ veh_name ] --; + if( ret_obj.vehicles[ veh_name ] <= 0 ) { + ret_obj.vehicles.erase( veh_name ); + } + } + } + vehicles_recorded.insert( veh_hash ); + local_vehicles_recorded.insert( veh_hash ); + } else if( !item.is_null() ) { + item_name = trap_name + item_name + field_desc; + if( point == point_around_figure && create_figure_desc ) { + description_terrain_on_figure = string_format( _( "%1$s with a %2$s" ), ter_desc, item_name ); + } else { + ret_obj.items[ item_name ] ++; + } + } else if( !unusual_ter_desc.empty() ) { + unusual_ter_desc = trap_name + unusual_ter_desc + field_desc; + if( point == point_around_figure && create_figure_desc ) { + description_furniture_on_figure = unusual_ter_desc; + } else { + ret_obj.furniture[ unusual_ter_desc ] ++; + } + } else if( !ter_desc.empty() && ( !field_desc.empty() || !trap_name.empty() ) ) { + ter_desc = trap_name + ter_desc + field_desc; + if( point == point_around_figure && create_figure_desc ) { + description_terrain_on_figure = ter_desc; + } else { + ret_obj.terrain[ ter_desc ] ++; + } + } else { + ter_desc = trap_name + ter_desc + field_desc; + if( point == point_around_figure && create_figure_desc ) { + description_terrain_on_figure = ter_desc; + } + } + ignored_points.insert( point_around_figure ); + } + + if( create_figure_desc ) { + std::vector objects_combined_desc; + std::unordered_map vecs_to_retrieve[4] = { + ret_obj.furniture, ret_obj.vehicles, ret_obj.items, ret_obj.terrain + }; + + for( int i = 0; i < 4; i++ ) { + for( const auto &p : vecs_to_retrieve[ i ] ) { + objects_combined_desc.push_back( i == 1 ? // vehicle name already includes "the" + format_object_pair_no_article( p ) : format_object_pair_article( p ) ); + } + } + + const char *transl_str = pgettext( "someone stands/sits *on* something", " on a %s." ); + if( !description_part_on_figure.empty() ) { + ret_obj.figure_text = string_format( transl_str, description_part_on_figure ); + } else { + if( !description_furniture_on_figure.empty() ) { + ret_obj.figure_text = string_format( transl_str, description_furniture_on_figure ); + } else { + ret_obj.figure_text = string_format( transl_str, description_terrain_on_figure ); + } + } + if( !objects_combined_desc.empty() ) { + // store objects to description_figures_status + std::string objects_text = enumerate_as_string( objects_combined_desc ); + ret_obj.obj_nearby_text = string_format( ngettext( "Nearby is %s.", "Nearby are %s.", + objects_combined_desc.size() ), objects_text ); + } + } + return ret_obj; +} + +static extended_photo_def photo_def_for_camera_point( const tripoint aim_point, + const tripoint camera_pos, + std::vector &monster_vec, std::vector &player_vec ) +{ + // look for big items on top of stacks in the background for the selfie description + const units::volume min_visible_volume = 490_ml; + + std::unordered_set ignored_points; + std::unordered_set vehicles_recorded; + + std::unordered_map description_figures_appearance; + std::vector> description_figures_status; + + 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 ); + extended_photo_def photo; + bool need_store_weather = false; + int outside_tiles_num = 0; + int total_tiles_num = 0; + + const auto map_deincrement_or_erase = []( std::unordered_map &obj_map, + const std::string & key ) { + if( obj_map.find( key ) != obj_map.end() ) { + obj_map[ key ] --; + if( obj_map[ key ] <= 0 ) { + obj_map.erase( key ); + } + } + }; + + // 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 ) ) { + continue; // disallow photos with non-visible objects + } + monster *const mon = g->critter_at( current, false ); + player *guy = g->critter_at( current ); + + total_tiles_num++; + if( g->m.is_outside( current ) ) { + need_store_weather = true; + outside_tiles_num++; + } + + if( guy || mon ) { + std::string figure_appearance, figure_name, pose, pronoun_sex, figure_effects; + Creature *creature; + if( mon && mon->has_effect( effect_ridden ) ) { + // only player can ride, see monexamine::mount_pet + guy = &g->u; + description_figures_appearance[ mon->name() ] = "\"" + mon->type->get_description() + "\""; + } + + if( guy ) { + if( guy->get_movement_mode() == "crouch" ) { + pose = _( "sits" ); + } else { + pose = _( "stands" ); + } + const std::vector vec = guy->short_description_parts(); + figure_appearance = join( vec, "\n\n" ); + figure_name = guy->name; + pronoun_sex = guy->male ? _( "He" ) : _( "She" ); + creature = guy; + player_vec.push_back( guy ); + } else { + if( mon->is_hallucination() || mon->type->in_species( HALLUCINATION ) ) { + continue; // do not include hallucinations + } + pose = _( "stands" ); + figure_appearance = "\"" + mon->type->get_description() + "\""; + figure_name = mon->name(); + pronoun_sex = pgettext( "Pronoun", "It" ); + creature = mon; + monster_vec.push_back( mon ); + } + + figure_effects = effects_description_for_creature( creature, pose, pronoun_sex ); + description_figures_appearance[ figure_name ] = figure_appearance; + + object_names_collection obj_collection = enumerate_objects_around_point( current, 1, aim_point, 2, + camera_pos, min_visible_volume, true, + ignored_points, vehicles_recorded ); + std::string figure_text = pose + obj_collection.figure_text; + + if( !figure_effects.empty() ) { + figure_text += " " + figure_effects; + } + if( !obj_collection.obj_nearby_text.empty() ) { + figure_text += " " + obj_collection.obj_nearby_text; + } + auto name_text_pair = std::pair( figure_name, figure_text ); + if( current == aim_point ) { + description_figures_status.insert( description_figures_status.begin(), name_text_pair ); + } else { + description_figures_status.push_back( name_text_pair ); + } + } + } + + // scan for everythin NOT near critters + object_names_collection obj_coll = enumerate_objects_around_point( aim_point, 2, aim_point, 2, + camera_pos, min_visible_volume, false, + ignored_points, vehicles_recorded ); + + std::string photo_text = _( "This is a photo of " ); + + bool found_item_aim_point; + std::string furn_desc = colorized_feature_description_at( aim_point, found_item_aim_point, + 0_ml ) ; + const item item = get_top_item_at_point( aim_point, 0_ml ); + const std::string trap_name = colorized_trap_name_at( 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(), + 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 ); + + if( !description_figures_status.empty() ) { + std::string names = enumerate_as_string( description_figures_status.begin(), + description_figures_status.end(), + []( const std::pair &it ) { + return colorize( it.first, c_light_blue ); + } ); + + photo.name = names; + photo_text += names + "."; + + for( const auto &figure_status : description_figures_status ) { + photo_text += "\n\n" + colorize( figure_status.first, c_light_blue ) + + " " + figure_status.second; + } + } else if( found_vehicle_aim_point ) { + const optional_vpart_position veh_part_pos = g->m.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 + "."; + map_deincrement_or_erase( obj_coll.vehicles, veh_name ); + } else if( found_furniture_aim_point || found_item_aim_point ) { + std::string item_name = colorized_item_name( item ); + if( found_furniture_aim_point ) { + furn_desc = trap_name + furn_desc + field_desc; + photo.name = furn_desc; + photo_text += photo.name + "."; + map_deincrement_or_erase( obj_coll.furniture, furn_desc ); + } else if( found_item_aim_point ) { + item_name = trap_name + item_name + field_desc; + photo.name = item_name; + photo_text += item_name + ". " + string_format( _( "It lies on the %s." ), + ter_name ); + map_deincrement_or_erase( obj_coll.items, item_name ); + } + if( found_furniture_aim_point && !furn_aim->description.empty() ) { + photo_text += "\n\n" + colorize( furn_aim->name(), c_yellow ) + ":\n" + furn_aim->description; + } + if( found_item_aim_point ) { + photo_text += "\n\n" + item_name + ":\n" + colorized_item_description( item ); + } + } else { + ter_name = trap_name + ter_name + field_desc; + photo.name = ter_name; + photo_text += photo.name + "."; + map_deincrement_or_erase( obj_coll.terrain, ter_name ); + map_deincrement_or_erase( obj_coll.furniture, ter_name ); + + if( !ter_aim->description.empty() ) { + photo_text += "\n\n" + photo.name + ":\n" + ter_aim->description; + } + } + + if( !obj_coll.items.empty() ) { + std::string obj_list = enumerate_as_string( obj_coll.items.begin(), obj_coll.items.end(), + format_object_pair_article ); + photo_text += "\n\n" + string_format( ngettext( "There is something lying on the ground: %s.", + "There are some things lying on the ground: %s.", obj_coll.items.size() ), + obj_list ); + } + if( !obj_coll.furniture.empty() ) { + std::string obj_list = enumerate_as_string( obj_coll.furniture.begin(), obj_coll.furniture.end(), + format_object_pair_article ); + photo_text += "\n\n" + string_format( ngettext( "Something is visible in the background: %s.", + "Some objects are visible in the background: %s.", obj_coll.furniture.size() ), + obj_list ); + } + if( !obj_coll.vehicles.empty() ) { + std::string obj_list = enumerate_as_string( obj_coll.vehicles.begin(), obj_coll.vehicles.end(), + format_object_pair_no_article ); + photo_text += "\n\n" + string_format( ngettext( "There is %s parked in the background.", + "There are %s parked in the background.", obj_coll.vehicles.size() ), + obj_list ); + } + if( !obj_coll.terrain.empty() ) { + std::string obj_list = enumerate_as_string( obj_coll.terrain.begin(), obj_coll.terrain.end(), + format_object_pair_article ); + photo_text += "\n\n" + string_format( ngettext( "There is %s in the background.", + "There are %s in the background.", obj_coll.terrain.size() ), + obj_list ); + } + + const oter_id &cur_ter = overmap_buffer.ter( ms_to_omt_copy( g->m.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 ) { + photo_text += _( "\n\nThis photo was taken outside." ); + } else if( outside_tiles_num == 0 ) { + photo_text += _( "\n\nThis photo was taken inside." ); + overmap_desc += _( " interior" ); + } else if( outside_tiles_num < total_tiles_num / 2.0 ) { + photo_text += _( "\n\nThis photo was taken mostly inside," + " but outside can be seen." ); + overmap_desc += _( " interior" ); + } else if( outside_tiles_num >= total_tiles_num / 2.0 ) { + photo_text += _( "\n\nThis photo was taken mostly outside," + " but inside can be seen." ); + } + photo_text += "\n" + overmap_desc + "."; + + if( g->get_levz() >= 0 && need_store_weather ) { + photo_text += "\n\n"; + if( calendar::turn.is_sunrise_now() ) { + photo_text += _( "It is sunrise. " ); + } else if( calendar::turn.is_sunset_now() ) { + photo_text += _( "It is sunset. " ); + } else if( calendar::turn.is_night() ) { + photo_text += _( "It is night. " ); + } 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 ) ); + } + + for( const auto &figure : description_figures_appearance ) { + photo_text += "\n\n" + string_format( _( "%s appearance:" ), + colorize( figure.first, c_light_blue ) ) + "\n" + figure.second; + } + + photo_text += "\n\n" + string_format( pgettext( "Date", "The photo was taken on %s." ), + colorize( timestamp, c_light_blue ) ); + + photo.description = photo_text; + + return photo; +} + +static void item_save_monsters( player &p, item &it, const std::vector &monster_vec, + const int photo_quality ) +{ + std::string monster_photos = it.get_var( "CAMERA_MONSTER_PHOTOS" ); + if( monster_photos.empty() ) { + monster_photos = ","; + } + + for( monster * const &monster_p : monster_vec ) { + const std::string mtype = monster_p->type->id.str(); + const std::string name = monster_p->name(); + + // position of + const size_t mon_str_pos = monster_photos.find( "," + mtype + "," ); + + if( mon_str_pos == std::string::npos ) { // new monster + monster_photos += string_format( "%s,%d,", mtype, photo_quality ); + } else { // replace quality character, if new photo is better + const size_t quality_num_pos = mon_str_pos + mtype.size() + 2; + char *quality_char = &monster_photos[ quality_num_pos ]; + const int old_quality = atoi( quality_char ); // get qual number from char + + if( photo_quality > old_quality ) { + monster_photos[ quality_num_pos ] = string_format( "%d", photo_quality )[ 0 ]; + } + if( !p.is_blind() ) { + if( photo_quality > old_quality ) { + p.add_msg_if_player( m_good, _( "The quality of %s image is better than the previous one." ), + colorize( name, c_light_blue ) ); + } else if( old_quality == 5 ) { + p.add_msg_if_player( _( "The quality of stored %s image is already maximally detailed." ), + colorize( name, c_light_blue ) ); + } else { + p.add_msg_if_player( m_bad, _( "But the quality of %s image is worse than the previous one." ), + colorize( name, c_light_blue ) ); + } + } + } + } + it.set_var( "CAMERA_MONSTER_PHOTOS", monster_photos ); +} + +// throws exception +static bool item_read_extended_photos( item &it, std::vector &extended_photos, + std::string var_name, bool insert_at_begin ) +{ + bool result = false; + std::istringstream extended_photos_data( it.get_var( var_name ) ); + JsonIn json( extended_photos_data ); + if( insert_at_begin ) { + std::vector temp_vec; + result = json.read( temp_vec ); + extended_photos.insert( std::begin( extended_photos ), std::begin( temp_vec ), + std::end( temp_vec ) ); + } else { + result = json.read( extended_photos ); + } + return result; +} + +// throws exception +static void item_write_extended_photos( item &it, + const std::vector &extended_photos, + std::string var_name ) +{ + std::ostringstream extended_photos_data; + JsonOut json( extended_photos_data ); + json.write( extended_photos ); + it.set_var( var_name, extended_photos_data.str() ); +} + +static bool show_photo_selection( player &p, item &it, const std::string &var_name ) +{ + if( p.is_blind() ) { + p.add_msg_if_player( _( "You can't see the camera screen, you're blind." ) ); + return false; + } + + uilist pmenu; + pmenu.text = _( "Photos saved on camera:" ); + + std::vector descriptions; + std::vector extended_photos; + + try { + item_read_extended_photos( it, extended_photos, var_name ); + } catch( const JsonError &e ) { + debugmsg( "Error reading photos: %s", e.c_str() ); + } + try { // if there is old photos format, append them; delete old and save new + if( item_read_extended_photos( it, extended_photos, "CAMERA_NPC_PHOTOS", true ) ) { + it.erase_var( "CAMERA_NPC_PHOTOS" ); + item_write_extended_photos( it, extended_photos, var_name ); + } + } catch( const JsonError &e ) { + debugmsg( "Error migrating old photo format: %s", e.c_str() ); + } + + int k = 0; + for( const extended_photo_def &extended_photo : extended_photos ) { + std::string menu_str = extended_photo.name; + + size_t index = menu_str.find( p.name ); + if( index != std::string::npos ) { + menu_str.replace( index, p.name.length(), "You" ); + } + + descriptions.push_back( extended_photo.description ); + menu_str += " [" + photo_quality_name( extended_photo.quality ) + "]"; + + pmenu.addentry( k++, true, -1, menu_str.c_str() ); + } + + int choice; + do { + pmenu.query(); + choice = pmenu.ret; + + if( choice < 0 ) { + break; + } + popup( "%s", descriptions[choice].c_str() ); + + } while( true ); + return true; +} + int iuse::camera( player *p, item *it, bool, const tripoint & ) { - enum {c_shot, c_photos, c_upload}; + enum {c_shot, c_photos, c_monsters, c_upload}; - uilist amenu; + // CAMERA_NPC_PHOTOS is old save variable + bool found_extended_photos = !it->get_var( "CAMERA_NPC_PHOTOS" ).empty() || + !it->get_var( "CAMERA_EXTENDED_PHOTOS" ).empty(); + bool found_monster_photos = !it->get_var( "CAMERA_MONSTER_PHOTOS" ).empty(); + uilist amenu; amenu.text = _( "What to do with camera?" ); - amenu.addentry( c_shot, true, 'p', _( "Take a photo" ) ); - if( !( it->get_var( "CAMERA_MONSTER_PHOTOS" ).empty() && - it->get_var( "CAMERA_NPC_PHOTOS" ).empty() ) ) { - amenu.addentry( c_photos, true, 'l', _( "List photos" ) ); - amenu.addentry( c_upload, true, 'u', _( "Upload photos to memory card" ) ); - } else { + amenu.addentry( c_shot, true, 't', _( "Take a photo" ) ); + if( !found_extended_photos && !found_monster_photos ) { amenu.addentry( c_photos, false, 'l', _( "No photos in memory" ) ); + } else { + if( found_extended_photos ) { + amenu.addentry( c_photos, true, 'l', _( "List photos" ) ); + } + if( found_monster_photos ) { + amenu.addentry( c_monsters, true, 'm', _( "Your collection of monsters" ) ); + } + amenu.addentry( c_upload, true, 'u', _( "Upload photos to memory card" ) ); } amenu.query(); @@ -6482,21 +7378,15 @@ int iuse::camera( player *p, item *it, bool, const tripoint & ) } if( c_shot == choice ) { - const cata::optional aim_point_ = g->look_around(); if( !aim_point_ ) { p->add_msg_if_player( _( "Never mind." ) ); return 0; } - const tripoint aim_point = *aim_point_; - const monster *const sel_mon = g->critter_at( aim_point, true ); - const player *const sel_npc = g->critter_at( aim_point ); - - if( !g->critter_at( aim_point ) ) { - p->add_msg_if_player( _( "There's nothing particularly interesting there." ) ); - return 0; - } + tripoint aim_point = *aim_point_; + bool incorrect_focus = false; + tripoint_range aim_bounds = g->m.points_in_radius( aim_point, 2 ); std::vector trajectory = line_to( p->pos(), aim_point, 0, 0 ); trajectory.push_back( aim_point ); @@ -6505,12 +7395,25 @@ int iuse::camera( player *p, item *it, bool, const tripoint & ) sounds::sound( p->pos(), 8, sounds::sound_t::activity, _( "Click." ), true, "tool", "camera_shutter" ); - for( auto &i : trajectory ) { + for( std::vector::iterator point_it = trajectory.begin(); + point_it != trajectory.end(); + ++point_it ) { + 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 ) ) { + 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 ); + } + } - monster *const mon = g->critter_at( i, true ); - player *const guy = g->critter_at( i ); - if( mon || guy ) { - int dist = rl_dist( p->pos(), i ); + monster *const mon = g->critter_at( trajectory_point, true ); + player *const guy = g->critter_at( trajectory_point ); + if( mon || guy || trajectory_point == aim_point ) { + int dist = rl_dist( p->pos(), trajectory_point ); int camera_bonus = it->has_flag( "CAMERA_PRO" ) ? 10 : 0; int photo_quality = 20 - rng( dist, dist * 2 ) * 2 + rng( camera_bonus / 2, camera_bonus ); @@ -6524,177 +7427,108 @@ int iuse::camera( player *p, item *it, bool, const tripoint & ) photo_quality /= 2; } - const std::string quality_name = photo_quality_name( photo_quality ); - if( mon ) { monster &z = *mon; - if( dist < 4 && one_in( dist + 2 ) && z.has_flag( MF_SEES ) ) { - p->add_msg_if_player( _( "%s looks blinded." ), z.name() ); - z.add_effect( effect_blind, rng( 5_turns, 10_turns ) ); - } - // shoot past small monsters and hallucinations - if( mon != sel_mon && ( z.type->size <= MS_SMALL || z.is_hallucination() || - z.type->in_species( HALLUCINATION ) ) ) { + if( trajectory_point != aim_point && ( z.type->size <= MS_SMALL || z.is_hallucination() || + z.type->in_species( HALLUCINATION ) ) ) { continue; } - - // get an empty photo if the target is a hallucination - if( mon == sel_mon && ( z.is_hallucination() || z.type->in_species( HALLUCINATION ) ) ) { - p->add_msg_if_player( _( "Strange... there's nothing in the picture?" ) ); - return it->type->charges_to_use(); - } - - if( z.mission_id != -1 ) { - //quest processing... - } - - if( mon == sel_mon ) { - // if the loop makes it to the target, take its photo - if( p->is_blind() ) { - p->add_msg_if_player( _( "You took a photo of %s." ), z.name() ); - } else { - p->add_msg_if_player( _( "You took a %1$s photo of %2$s." ), quality_name, - z.name() ); - } - } else { - // or take a photo of the monster that's in the way + if( !aim_bounds.is_point_inside( trajectory_point ) ) { + // take a photo of the monster that's in the way p->add_msg_if_player( m_warning, _( "A %s got in the way of your photo." ), z.name() ); - photo_quality = 0; + incorrect_focus = true; + } else if( trajectory_point != aim_point ) { // shoot past mon that will be in photo anyway + continue; } - - const std::string mtype = z.type->id.str(); - - auto monster_photos = it->get_var( "CAMERA_MONSTER_PHOTOS" ); - if( monster_photos.empty() ) { - monster_photos = "," + mtype + "," + string_format( "%d", - photo_quality ) + ","; - } else { - - const size_t strpos = monster_photos.find( "," + mtype + "," ); - - if( strpos == std::string::npos ) { - monster_photos += mtype + "," + string_format( "%d", photo_quality ) + ","; - } else { - - const size_t strqpos = strpos + mtype.size() + 2; - char *chq = &monster_photos[strqpos]; - const int old_quality = atoi( chq ); - - if( !p->is_blind() ) { - if( photo_quality > old_quality ) { - chq = &string_format( "%d", photo_quality )[0]; - monster_photos[strqpos] = *chq; - - p->add_msg_if_player( _( "This photo is better than the previous one." ) ); - - } - } - } + // get an special message if the target is a hallucination + if( trajectory_point == aim_point && ( z.is_hallucination() || + z.type->in_species( HALLUCINATION ) ) ) { + p->add_msg_if_player( _( "Strange... there's nothing in the center of picture?" ) ); } - it->set_var( "CAMERA_MONSTER_PHOTOS", monster_photos ); - - return it->type->charges_to_use(); - } else if( guy ) { - std::string description_extra; - const bool selfie = guy == p; - if( !selfie && dist < 4 && one_in( dist + 2 ) ) { - p->add_msg_if_player( _( "%s looks blinded." ), guy->name ); - guy->add_effect( effect_blind, rng( 5_turns, 10_turns ) ); + if( !aim_bounds.is_point_inside( trajectory_point ) ) { + // take a photo of the monster that's in the way + p->add_msg_if_player( m_warning, _( "%s got in the way of your photo." ), guy->name ); + incorrect_focus = true; + } else if( trajectory_point != aim_point ) { // shoot past guy that will be in photo anyway + continue; } + } + if( incorrect_focus ) { + photo_quality = photo_quality == 0 ? 0 : photo_quality - 1; + } - if( sel_npc == guy ) { - if( selfie ) { - p->add_msg_if_player( _( "You took a selfie." ) ); - // look for big items on top of stacks in the background for the selfie description - units::volume min_visible_volume = 490_ml; - std::vector visible_items_nearby; - for( const tripoint ¤t : g->m.points_in_radius( p->pos(), 2 ) ) { - if( !g->m.has_items( current ) ) { - continue; - } - map_stack items = g->m.i_at( current ); - // iterate from topmost item down to ground - for( auto it = items.rbegin(); it != items.rend(); ++it ) { - if( it->volume() > min_visible_volume ) { - // add top (or first big enough) item to the list - visible_items_nearby.push_back( *it ); - break; - } - } - } - if( !visible_items_nearby.empty() ) { - description_extra = random_entry( visible_items_nearby ).display_name(); - } - } else if( p->is_blind() ) { - p->add_msg_if_player( _( "You took a photo of %s." ), guy->name ); - } else { - //~ 1s - thing being photographed, 2s - photo quality (adjective). - p->add_msg_if_player( _( "You took a photo of %1$s. It is %2$s." ), guy->name, - quality_name ); - } + std::vector extended_photos; + std::vector monster_vec; + std::vector player_vec; + extended_photo_def photo = photo_def_for_camera_point( trajectory_point, p->pos(), monster_vec, + player_vec ); + photo.quality = photo_quality; + + try { + item_read_extended_photos( *it, extended_photos, "CAMERA_EXTENDED_PHOTOS" ); + extended_photos.push_back( photo ); + item_write_extended_photos( *it, extended_photos, "CAMERA_EXTENDED_PHOTOS" ); + } catch( const JsonError &e ) { + debugmsg( "Error when adding new photo (loaded photos = %i): %s", extended_photos.size(), + e.c_str() ); + } + + const bool selfie = std::find( player_vec.begin(), player_vec.end(), p ) != player_vec.end(); + + if( selfie ) { + p->add_msg_if_player( _( "You took a selfie." ) ); + } else { + if( p->is_blind() ) { + p->add_msg_if_player( _( "You took a photo of %s." ), photo.name ); } else { - p->add_msg_if_player( m_warning, _( "%s got in the way of your photo." ), guy->name ); - photo_quality = 0; + p->add_msg_if_player( _( "You took a photo of %1$s. It is %2$s." ), photo.name, + photo_quality_name( photo_quality ) ); } - std::vector npc_photos; - - try { - std::istringstream npc_photos_data( it->get_var( "CAMERA_NPC_PHOTOS" ) ); - JsonIn json( npc_photos_data ); - json.read( npc_photos ); - } catch( const JsonError &e ) { - debugmsg( "Error loading NPC photos: %s", e.c_str() ); + std::vector blinded_names; + for( monster * const &monster_p : monster_vec ) { + if( dist < 4 && one_in( dist + 2 ) && monster_p->has_flag( MF_SEES ) ) { + monster_p->add_effect( effect_blind, rng( 5_turns, 10_turns ) ); + blinded_names.push_back( monster_p->name() ); + } } - - npc_photo_def npc_photo; - npc_photo.quality = photo_quality; - npc_photo.name = guy->name; - std::string timestamp = to_string( time_point( calendar::turn ) ); - //~ 1s - name of the photographed NPC, 2s - timestamp of the photo, for example Year 1, Spring, day 0 08:01:54. - npc_photo.description = string_format( _( "This is a photo of %1$s." ), - "" + npc_photo.name + "" ); - npc_photo.description += "\n\n" + join( guy->short_description_parts(), "\n\n" ); - if( !description_extra.empty() ) { - npc_photo.description += "\n\n" + string_format( _( "Also in the picture: %1$s." ), - description_extra ); + for( player * const &player_p : player_vec ) { + if( dist < 4 && one_in( dist + 2 ) && !player_p->is_blind() ) { + player_p->add_effect( effect_blind, rng( 5_turns, 10_turns ) ); + blinded_names.push_back( player_p->name ); + } } - npc_photo.description += "\n\n" + string_format( _( "The photo was taken on %1$s." ), - "" + timestamp + "" ); - - npc_photos.push_back( npc_photo ); - try { - std::ostringstream npc_photos_data; - JsonOut json( npc_photos_data ); - json.write( npc_photos ); - it->set_var( "CAMERA_NPC_PHOTOS", npc_photos_data.str() ); - } catch( const JsonError &e ) { - debugmsg( "Error storing NPC photos: %s", e.c_str() ); + if( blinded_names.size() > 0 ) { + p->add_msg_if_player( _( "%s looks blinded." ), enumerate_as_string( blinded_names.begin(), + blinded_names.end(), []( const std::string & it ) { + return colorize( it, c_light_blue ); + } ) ); } - - return it->type->charges_to_use(); } - + if( monster_vec.size() > 0 ) { + item_save_monsters( *p, *it, monster_vec, photo_quality ); + } return it->type->charges_to_use(); } - } - return it->type->charges_to_use(); } if( c_photos == choice ) { + show_photo_selection( *p, *it, "CAMERA_EXTENDED_PHOTOS" ); + return it->type->charges_to_use(); + } + if( c_monsters == choice ) { if( p->is_blind() ) { p->add_msg_if_player( _( "You can't see the camera screen, you're blind." ) ); return 0; } - uilist pmenu; - pmenu.text = _( "Critter photos saved on camera:" ); + pmenu.text = _( "Your collection of monsters:" ); std::vector monster_photos; std::vector descriptions; @@ -6725,29 +7559,6 @@ int iuse::camera( player *p, item *it, bool, const tripoint & ) pmenu.addentry( k++, true, -1, menu_str.c_str() ); } - std::vector npc_photos; - - try { - std::istringstream npc_photos_data( it->get_var( "CAMERA_NPC_PHOTOS" ) ); - JsonIn json( npc_photos_data ); - json.read( npc_photos ); - } catch( const JsonError &e ) { - debugmsg( "Error NPC photos: %s", e.c_str() ); - } - for( const auto &npc_photo : npc_photos ) { - std::string menu_str; - if( npc_photo.name == p->name ) { - menu_str = _( "You" ); - } else { - menu_str = npc_photo.name; - } - descriptions.push_back( npc_photo.description ); - - menu_str += " [" + photo_quality_name( npc_photo.quality ) + "]"; - - pmenu.addentry( k++, true, -1, menu_str.c_str() ); - } - int choice; do { pmenu.query(); @@ -6757,7 +7568,7 @@ int iuse::camera( player *p, item *it, bool, const tripoint & ) break; } - popup( descriptions[choice].c_str() ); + popup( "%s", descriptions[choice].c_str() ); } while( true ); @@ -6804,7 +7615,9 @@ int iuse::camera( player *p, item *it, bool, const tripoint & ) mc.item_tags.insert( "MC_HAS_DATA" ); mc.set_var( "MC_MONSTER_PHOTOS", it->get_var( "CAMERA_MONSTER_PHOTOS" ) ); - p->add_msg_if_player( m_info, _( "You upload monster photos to memory card." ) ); + mc.set_var( "MC_EXTENDED_PHOTOS", it->get_var( "CAMERA_EXTENDED_PHOTOS" ) ); + p->add_msg_if_player( m_info, + _( "You upload your photos and monster collection to memory card." ) ); return it->type->charges_to_use(); } @@ -6907,6 +7720,24 @@ int iuse::ehandcuffs( player *p, item *it, bool t, const tripoint &pos ) return it->type->charges_to_use(); } +int iuse::foodperson( player *, item *it, bool t, const tripoint &pos ) +{ + if( t ) { + if( calendar::once_every( 1_minutes ) ) { + const SpeechBubble &speech = get_speech( "foodperson_mask" ); + sounds::sound( pos, speech.volume, sounds::sound_t::alarm, speech.text, true, "speech", + "foodperson_mask" ); + } + return it->type->charges_to_use(); + } + + time_duration shift = time_duration::from_turns( it->magazine_current()->ammo_remaining() * + it->type->tool->turns_per_charge ); + + add_msg( m_info, _( "Your HUD lights-up: \"Your shift ends in %s\"." ), to_string( shift ) ); + return 0; +} + int iuse::radiocar( player *p, item *it, bool, const tripoint & ) { int choice = -1; @@ -7033,7 +7864,7 @@ static void sendRadioSignal( player &p, const std::string &signal ) int iuse::radiocontrol( player *p, item *it, bool t, const tripoint & ) { if( t ) { - if( !it->ammo_sufficient() ) { + if( !it->units_sufficient( *p ) ) { it->active = false; p->remove_value( "remote_controlling" ); } else if( p->get_value( "remote_controlling" ).empty() ) { @@ -7212,7 +8043,7 @@ int iuse::remoteveh( player *p, item *it, bool t, const tripoint &pos ) vehicle *remote = g->remoteveh(); if( t ) { bool stop = false; - if( !it->ammo_sufficient() ) { + if( !it->units_sufficient( *p ) ) { p->add_msg_if_player( m_bad, _( "The remote control's battery goes dead." ) ); stop = true; } else if( remote == nullptr ) { @@ -7347,7 +8178,7 @@ int iuse::multicooker( player *p, item *it, bool t, const tripoint &pos ) static const int charges_to_start = 50; if( t ) { - if( !it->ammo_sufficient() ) { + if( !it->units_sufficient( *p ) ) { it->active = false; return 0; } @@ -8346,14 +9177,12 @@ int iuse::craft( player *p, item *it, bool, const tripoint & ) int iuse::disassemble( player *p, item *it, bool, const tripoint & ) { - int pos = p->get_item_position( it ); - - // Giving player::disassemble INT_MIN is actually a special case to - // disassemble all, but get_item_position returns INT_MIN if it's not - // actually in our inventory/worn/wielded. Skip this nonsensical case. - if( pos != INT_MIN ) { - p->disassemble( *it, pos, false, false ); + if( !p->has_item( *it ) ) { + return 0; } + + p->disassemble( item_location( *p, it ), false ); + return 0; } diff --git a/src/iuse.h b/src/iuse.h index b8891500c58e3..145d28b95a78a 100644 --- a/src/iuse.h +++ b/src/iuse.h @@ -184,6 +184,7 @@ class iuse int einktabletpc( player *, item *, bool, const tripoint & ); int camera( player *, item *, bool, const tripoint & ); int ehandcuffs( player *, item *, bool, const tripoint & ); + int foodperson( player *, item *, bool, const tripoint & ); int cable_attach( player *, item *, bool, const tripoint & ); int shavekit( player *, item *, bool, const tripoint & ); int hairkit( player *, item *, bool, const tripoint & ); diff --git a/src/iuse_actor.cpp b/src/iuse_actor.cpp index 989c966f4535a..e5a6706c50437 100644 --- a/src/iuse_actor.cpp +++ b/src/iuse_actor.cpp @@ -168,6 +168,8 @@ void iuse_transform::load( JsonObject &obj ) need_fire_msg = obj.has_string( "need_fire_msg" ) ? _( obj.get_string( "need_fire_msg" ) ) : _( "You need a source of fire!" ); + obj.read( "need_worn", need_worn ); + obj.read( "qualities_needed", qualities_needed ); obj.read( "menu_text", menu_text ); @@ -185,7 +187,11 @@ int iuse_transform::use( player &p, item &it, bool t, const tripoint &pos ) cons const bool possess = p.has_item( it ) || ( it.has_flag( "ALLOWS_REMOTE_USE" ) && square_dist( p.pos(), pos ) == 1 ); - if( need_charges && it.ammo_remaining() < need_charges ) { + if( possess && need_worn && !p.is_worn( it ) ) { + p.add_msg_if_player( m_info, _( "You need to wear the %1$s before activating it." ), it.tname() ); + return 0; + } + if( need_charges && it.units_remaining( p ) < need_charges ) { if( possess ) { p.add_msg_if_player( m_info, need_charges_msg, it.tname() ); } @@ -211,6 +217,7 @@ int iuse_transform::use( player &p, item &it, bool t, const tripoint &pos ) cons p.moves -= moves; } + item obj_copy( it ); item *obj; if( container.empty() ) { obj = &it.convert( target ); @@ -237,7 +244,7 @@ int iuse_transform::use( player &p, item &it, bool t, const tripoint &pos ) cons if( p.is_worn( *obj ) ) { p.reset_encumbrance(); p.update_bodytemp(); - p.on_worn_item_transform( *obj ); + p.on_worn_item_transform( obj_copy, *obj ); } obj->item_counter = countdown > 0 ? countdown : obj->type->countdown_interval; obj->active = active || obj->item_counter; @@ -417,8 +424,8 @@ void explosion_iuse::load( JsonObject &obj ) if( obj.has_member( "fields_type" ) || fields_radius > 0 ) { fields_type = field_from_ident( obj.get_string( "fields_type" ) ); } - obj.read( "fields_min_density", fields_min_density ); - obj.read( "fields_max_density", fields_max_density ); + obj.read( "fields_min_intensity", fields_min_intensity ); + obj.read( "fields_max_intensity", fields_max_intensity ); obj.read( "emp_blast_radius", emp_blast_radius ); obj.read( "scrambler_blast_radius", scrambler_blast_radius ); obj.read( "sound_volume", sound_volume ); @@ -460,8 +467,8 @@ int explosion_iuse::use( player &p, item &it, bool t, const tripoint &pos ) cons if( fields_radius >= 0 && fields_type != fd_null ) { std::vector gas_sources = points_for_gas_cloud( pos, fields_radius ); for( auto &gas_source : gas_sources ) { - const int dens = rng( fields_min_density, fields_max_density ); - g->m.add_field( gas_source, fields_type, dens, 1_turns ); + const int intens = rng( fields_min_intensity, fields_max_intensity ); + g->m.add_field( gas_source, fields_type, intens, 1_turns ); } } if( scrambler_blast_radius >= 0 ) { @@ -1094,8 +1101,8 @@ int reveal_map_actor::use( player &p, item &it, bool, const tripoint & ) const p.add_msg_if_player( _( "It's too dark to read." ) ); return 0; } - const tripoint ¢er = omt_to_sm_copy( it.get_var( "reveal_map_center_omt", - p.global_omt_location() ) ); + const tripoint ¢er = it.get_var( "reveal_map_center_omt", + p.global_omt_location() ); for( auto &omt : omt_types ) { for( int z = -OVERMAP_DEPTH; z <= OVERMAP_HEIGHT; z++ ) { reveal_targets( tripoint( center.x, center.y, z ), omt, 0 ); @@ -1711,7 +1718,7 @@ ret_val cauterize_actor::can_use( const player &p, const item &it, bool, _( "You need a source of flame (4 charges worth) before you can cauterize yourself." ) ); } } else { - if( !it.ammo_sufficient() ) { + if( !it.units_sufficient( p ) ) { return ret_val::make_failure( _( "You need at least %d charges to cauterize wounds." ), it.ammo_required() ); } @@ -2187,9 +2194,12 @@ int learn_spell_actor::use( player &p, item &, bool, const tripoint & ) const return 0; } std::vector uilist_initializer; + uilist spellbook_uilist; + spellbook_callback sp_cb; bool know_it_all = true; for( const std::string sp_id_str : spells ) { const spell_id sp_id( sp_id_str ); + sp_cb.add_spell( sp_id ); const std::string sp_nm = sp_id.obj().name; uilist_entry entry( sp_nm ); if( p.magic.knows_spell( sp_id ) ) { @@ -2218,7 +2228,16 @@ int learn_spell_actor::use( player &p, item &, bool, const tripoint & ) const return 0; } - const int action = uilist( _( "Study a spell:" ), uilist_initializer ); + spellbook_uilist.entries = uilist_initializer; + spellbook_uilist.w_height = 24; + spellbook_uilist.w_width = 80; + spellbook_uilist.w_x = ( TERMX - spellbook_uilist.w_width ) / 2; + spellbook_uilist.w_y = ( TERMY - spellbook_uilist.w_height ) / 2; + spellbook_uilist.callback = &sp_cb; + spellbook_uilist.title = _( "Study a spell:" ); + spellbook_uilist.pad_left = 38; + spellbook_uilist.query(); + const int action = spellbook_uilist.ret; if( action < 0 ) { return 0; } @@ -2721,7 +2740,7 @@ bool repair_item_actor::can_use_tool( const player &p, const item &tool, bool pr } return false; } - if( !tool.ammo_sufficient() ) { + if( !tool.units_sufficient( p ) ) { if( print_msg ) { p.add_msg_if_player( m_info, _( "Your tool does not have enough charges to do that." ) ); } diff --git a/src/iuse_actor.h b/src/iuse_actor.h index 0be1741062381..62f7de2da3ed2 100644 --- a/src/iuse_actor.h +++ b/src/iuse_actor.h @@ -72,6 +72,9 @@ class iuse_transform : public iuse_actor /** used to set the active property of the transformed @ref target */ bool active = false; + /**does the item requires to be worn to be activable*/ + bool need_worn = false; + /** subtracted from @ref Creature::moves when transformation is successful */ int moves = 0; @@ -149,8 +152,8 @@ class explosion_iuse : public iuse_actor /** Create fields of this type around the center of the explosion */ int fields_radius = -1; field_id fields_type; - int fields_min_density = 1; - int fields_max_density = MAX_FIELD_DENSITY; + int fields_min_intensity = 1; + int fields_max_intensity = MAX_FIELD_INTENSITY; /** Calls game::emp_blast if >= 0 */ int emp_blast_radius = -1; /** Calls game::scrambler_blast if >= 0 */ diff --git a/src/json.cpp b/src/json.cpp index f620c21514e0a..698078d565b86 100644 --- a/src/json.cpp +++ b/src/json.cpp @@ -80,7 +80,9 @@ JsonObject::JsonObject( JsonIn &j ) while( !jsin->end_object() ) { std::string n = jsin->get_member_name(); int p = jsin->tell(); - if( n != "//" && n != "comment" && positions.count( n ) > 0 ) { + // FIXME: Fix corrupted bionic power data loading (see #31627). Temporary. + if( n != "//" && n != "comment" && n != "power_level" && n != "max_power_level" && + positions.count( n ) > 0 ) { // members with name "//" or "comment" are used for comments and // should be ignored anyway. j.error( "duplicate entry in json object" ); @@ -242,23 +244,6 @@ int JsonObject::get_int( const std::string &name, const int fallback ) return jsin->get_int(); } -long JsonObject::get_long( const std::string &name ) -{ - int pos = verify_position( name ); - jsin->seek( pos ); - return jsin->get_long(); -} - -long JsonObject::get_long( const std::string &name, const long fallback ) -{ - long pos = positions[name]; - if( pos <= start ) { - return fallback; - } - jsin->seek( pos ); - return jsin->get_long(); -} - double JsonObject::get_float( const std::string &name ) { int pos = verify_position( name ); @@ -514,13 +499,6 @@ int JsonArray::next_int() return jsin->get_int(); } -long JsonArray::next_long() -{ - verify_index( index ); - jsin->seek( positions[index++] ); - return jsin->get_long(); -} - double JsonArray::next_float() { verify_index( index ); @@ -571,13 +549,6 @@ int JsonArray::get_int( int i ) return jsin->get_int(); } -long JsonArray::get_long( int i ) -{ - verify_index( i ); - jsin->seek( positions[i] ); - return jsin->get_long(); -} - double JsonArray::get_float( int i ) { verify_index( i ); @@ -1046,13 +1017,6 @@ int JsonIn::get_int() return static_cast( get_float() ); } -long JsonIn::get_long() -{ - // get float value and then convert to int, - // because "1.359e3" is technically a valid integer. - return static_cast( get_float() ); -} - double JsonIn::get_float() { // this could maybe be prettier? @@ -1372,24 +1336,6 @@ bool JsonIn::read( unsigned int &u ) return true; } -bool JsonIn::read( long &l ) -{ - if( !test_number() ) { - return false; - } - l = get_long(); - return true; -} - -bool JsonIn::read( unsigned long &ul ) -{ - if( !test_number() ) { - return false; - } - ul = get_long(); - return true; -} - bool JsonIn::read( float &f ) { if( !test_number() ) { diff --git a/src/json.h b/src/json.h index b319f38080a0a..67d37d478a4d4 100644 --- a/src/json.h +++ b/src/json.h @@ -13,6 +13,8 @@ #include #include +#include "colony.h" + /* Cataclysm-DDA homegrown JSON tools * copyright CC-BY-SA-3.0 2013 CleverRaven * @@ -81,7 +83,7 @@ inline E string_to_enum_look_up( const C &container, const std::string &data ) return iter->second; } /*@}*/ -} +} // namespace io /* JsonIn * ====== @@ -209,7 +211,6 @@ class JsonIn // data parsing std::string get_string(); // get the next value as a string int get_int(); // get the next value as an int - long get_long(); // get the next value as an long bool get_bool(); // get the next value as a bool double get_float(); // get the next value as a double std::string get_member_name(); // also strips the ':' @@ -259,8 +260,6 @@ class JsonIn bool read( short int &s ); bool read( int &i ); bool read( unsigned int &u ); - bool read( long &l ); - bool read( unsigned long &ul ); bool read( float &f ); bool read( double &d ); bool read( std::string &s ); @@ -374,6 +373,31 @@ class JsonIn return true; } + // special case for colony as it uses `insert()` instead of `push_back()` + // and therefore doesn't fit with vector/deque/list + template + bool read( cata::colony &v ) { + if( !test_array() ) { + return false; + } + try { + start_array(); + v.clear(); + while( !end_array() ) { + T element; + if( read( element ) ) { + v.insert( std::move( element ) ); + } else { + skip_value(); + } + } + } catch( const JsonError & ) { + return false; + } + + return true; + } + // object ~> containers with unmatching key_type and value_type // map, unordered_map ~> object template < typename T, typename std::enable_if < @@ -564,6 +588,12 @@ class JsonOut write_as_array( container ); } + // special case for colony, since it doesn't fit in other categories + template + void write( const cata::colony &container ) { + write_as_array( container ); + } + // containers with unmatching key_type and value_type ~> object // map, unordered_map ~> object template < typename T, typename std::enable_if < @@ -686,8 +716,6 @@ class JsonObject bool get_bool( const std::string &name, const bool fallback ); int get_int( const std::string &name ); int get_int( const std::string &name, const int fallback ); - long get_long( const std::string &name ); - long get_long( const std::string &name, const long fallback ); double get_float( const std::string &name ); double get_float( const std::string &name, const double fallback ); std::string get_string( const std::string &name ); @@ -853,7 +881,6 @@ class JsonArray // iterative access bool next_bool(); int next_int(); - long next_long(); double next_float(); std::string next_string(); JsonArray next_array(); @@ -863,7 +890,6 @@ class JsonArray // static access bool get_bool( int index ); int get_int( int index ); - long get_long( int index ); double get_float( int index ); std::string get_string( int index ); JsonArray get_array( int index ); diff --git a/src/lightmap.cpp b/src/lightmap.cpp index 6c6e4b4f67317..054be89de451f 100644 --- a/src/lightmap.cpp +++ b/src/lightmap.cpp @@ -62,8 +62,8 @@ std::string four_quadrants::to_string() const ( *this )[quadrant::SW], ( *this )[quadrant::NW] ); } -void map::add_light_from_items( const tripoint &p, std::list::iterator begin, - std::list::iterator end ) +void map::add_light_from_items( const tripoint &p, item_stack::iterator begin, + item_stack::iterator end ) { for( auto itm_it = begin; itm_it != end; ++itm_it ) { float ilum = 0.0; // brightness @@ -125,9 +125,9 @@ bool map::build_transparency_cache( const int zlev ) for( const auto &fld : cur_submap->fld[sx][sy] ) { const field_entry &cur = fld.second; const field_id type = cur.get_field_type(); - const int density = cur.get_field_intensity(); + const int intensity = cur.get_field_intensity(); - if( all_field_types_enum_list[type].transparent[density - 1] ) { + if( all_field_types_enum_list[type].transparent[intensity - 1] ) { continue; } @@ -144,9 +144,9 @@ bool map::build_transparency_cache( const int zlev ) case fd_incendiary: case fd_toxic_gas: case fd_tear_gas: - if( density == 3 ) { + if( intensity == 3 ) { value = LIGHT_TRANSPARENCY_SOLID; - } else if( density == 2 ) { + } else if( intensity == 2 ) { value *= 10; } break; @@ -154,7 +154,7 @@ bool map::build_transparency_cache( const int zlev ) value *= 10; break; case fd_fire: - value *= 1.0 - ( density * 0.3 ); + value *= 1.0 - ( intensity * 0.3 ); break; default: value = LIGHT_TRANSPARENCY_SOLID; @@ -1440,7 +1440,7 @@ void map::apply_light_arc( const tripoint &p, int angle, float luminance, int wi return; } - // attempt to determine beam density required to cover all squares + // attempt to determine beam intensity required to cover all squares const double wstep = ( wangle / ( wdist * SQRT_2 ) ); // NOLINTNEXTLINE(clang-analyzer-security.FloatLoopCounter) diff --git a/src/magic.cpp b/src/magic.cpp index 5347b4282dfdb..6beb4b5c5102d 100644 --- a/src/magic.cpp +++ b/src/magic.cpp @@ -19,6 +19,7 @@ #include "player.h" #include "projectile.h" #include "rng.h" +#include "sounds.h" #include "translations.h" #include "ui.h" @@ -47,7 +48,20 @@ const std::map bp_map = { { "FOOT_L", body_part::bp_foot_l }, { "FOOT_R", body_part::bp_foot_r } }; -} +const std::map flag_map = { + { "PERMANENT", spell_flag::PERMANENT }, + { "IGNORE_WALLS", spell_flag::IGNORE_WALLS }, + { "HOSTILE_SUMMON", spell_flag::HOSTILE_SUMMON }, + { "HOSTILE_50", spell_flag::HOSTILE_50 }, + { "SILENT", spell_flag::SILENT }, + { "LOUD", spell_flag::LOUD }, + { "VERBAL", spell_flag::VERBAL }, + { "SOMATIC", spell_flag::SOMATIC }, + { "NO_HANDS", spell_flag::NO_HANDS }, + { "NO_LEGS", spell_flag::NO_LEGS }, + { "CONCENTRATE", spell_flag::CONCENTRATE } +}; +} // namespace namespace io { @@ -61,7 +75,12 @@ body_part string_to_enum( const std::string &trigger ) { return string_to_enum_look_up( bp_map, trigger ); } +template<> +spell_flag string_to_enum( const std::string &trigger ) +{ + return string_to_enum_look_up( flag_map, trigger ); } +} // namespace io // LOADING // spell_type @@ -69,7 +88,7 @@ body_part string_to_enum( const std::string &trigger ) namespace { generic_factory spell_factory( "spell" ); -} +} // namespace template<> const spell_type &string_id::obj() const @@ -98,6 +117,8 @@ static energy_type energy_source_from_string( const std::string &str ) return bionic_energy; } else if( str == "STAMINA" ) { return stamina_energy; + } else if( str == "FATIGUE" ) { + return fatigue_energy; } else if( str == "NONE" ) { return none_energy; } else { @@ -144,6 +165,8 @@ void spell_type::load( JsonObject &jo, const std::string & ) const auto bp_reader = enum_flags_reader { "affected_bps" }; optional( jo, was_loaded, "affected_body_parts", affected_bps, bp_reader ); + const auto flag_reader = enum_flags_reader { "flags" }; + optional( jo, was_loaded, "flags", spell_tags, flag_reader ); optional( jo, was_loaded, "effect_str", effect_str, "" ); @@ -175,8 +198,6 @@ void spell_type::load( JsonObject &jo, const std::string & ) optional( jo, was_loaded, "final_energy_cost", final_energy_cost, base_energy_cost ); optional( jo, was_loaded, "energy_increment", energy_increment, 0.0f ); - optional( jo, was_loaded, "flags", spell_tags ); - std::string temp_string; optional( jo, was_loaded, "spell_class", temp_string, "NONE" ); spell_class = trait_id( temp_string ); @@ -320,9 +341,14 @@ int spell::energy_cost() const } } -bool spell::has_flag( const std::string &flag ) const +bool spell::has_flag( const spell_flag &flag ) const +{ + return type->spell_tags[flag]; +} + +bool spell::is_spell_class( const trait_id &mid ) const { - return type->spell_tags.count( flag ); + return mid == type->spell_class; } bool spell::can_cast( const player &p ) const @@ -347,6 +373,8 @@ bool spell::can_cast( const player &p ) const } case bionic_energy: return p.power_level >= energy_cost(); + case fatigue_energy: + return p.get_fatigue() < EXHAUSTED; case none_energy: default: return true; @@ -439,6 +467,8 @@ std::string spell::energy_string() const return _( "stamina" ); case bionic_energy: return _( "bionic power" ); + case fatigue_energy: + return _( "fatigue" ); default: return ""; } @@ -460,6 +490,9 @@ std::string spell::energy_cost_string( const player &p ) const auto pair = get_hp_bar( energy_cost(), p.get_stamina_max() ); return colorize( pair.first, pair.second ); } + if( energy_source() == fatigue_energy ) { + return colorize( to_string( energy_cost() ), c_cyan ); + } debugmsg( "ERROR: Spell %s has invalid energy source.", id().c_str() ); return _( "error: energy_type" ); } @@ -482,6 +515,10 @@ std::string spell::energy_cur_string( const player &p ) const if( energy_source() == hp_energy ) { return ""; } + if( energy_source() == fatigue_energy ) { + const std::pair pair = p.get_fatigue_description(); + return colorize( pair.first, pair.second ); + } debugmsg( "ERROR: Spell %s has invalid energy source.", id().c_str() ); return _( "error: energy_type" ); } @@ -499,6 +536,17 @@ bool spell::bp_is_affected( body_part bp ) const return type->affected_bps[bp]; } +void spell::make_sound( const tripoint &target ) const +{ + if( !has_flag( spell_flag::SILENT ) ) { + int loudness = damage() / 3; + if( has_flag( spell_flag::LOUD ) ) { + loudness += 1 + damage() / 3; + } + sounds::sound( target, loudness, sounds::sound_t::combat, _( "an explosion" ), false ); + } +} + std::string spell::effect() const { return type->effect; @@ -521,11 +569,13 @@ bool spell::is_valid_target( const tripoint &p ) const Creature::Attitude cr_att = cr->attitude_to( g->u ); valid = valid || ( cr_att != Creature::A_FRIENDLY && is_valid_target( target_hostile ) ) || ( cr_att == Creature::A_FRIENDLY && is_valid_target( target_ally ) ); + } else { + valid = is_valid_target( target_ground ); } if( p == g->u.pos() ) { valid = valid || is_valid_target( target_self ); } - return valid || is_valid_target( target_ground ); + return valid; } std::string spell::description() const @@ -785,9 +835,23 @@ void known_magic::learn_spell( const spell_type *sp, player &p, bool force ) } if( !force && sp->spell_class != trait_id( "NONE" ) ) { if( can_learn_spell( p, sp->id ) && !p.has_trait( sp->spell_class ) ) { + std::string trait_cancel; + for( const trait_id &cancel : sp->spell_class->cancels ) { + if( cancel == sp->spell_class->cancels.back() && + sp->spell_class->cancels.back() != sp->spell_class->cancels.front() ) { + trait_cancel = string_format( "%s and %s", trait_cancel, cancel->name() ); + } else if( cancel == sp->spell_class->cancels.front() ) { + trait_cancel = cancel->name(); + } else { + trait_cancel = string_format( "%s, %s", trait_cancel, cancel->name() ); + } + if( cancel == sp->spell_class->cancels.back() ) { + trait_cancel += "."; + } + } if( query_yn( - _( "Learning this spell will make you a %s and lock you out of other unique spells.\nContinue?" ), - sp->spell_class.obj().name() ) ) { + _( "Learning this spell will make you a %s and lock you out of %s\nContinue?" ), + sp->spell_class.obj().name(), trait_cancel ) ) { p.set_mutation( sp->spell_class ); p.add_msg_if_player( sp->spell_class.obj().desc() ); } else { @@ -814,6 +878,7 @@ void known_magic::forget_spell( const spell_id &sp ) debugmsg( "Can't forget a spell you don't know!" ); return; } + add_msg( m_bad, _( "All knowledge of %s leaves you." ), sp->name ); spellbook.erase( sp ); } @@ -901,6 +966,8 @@ bool known_magic::has_enough_energy( const player &p, spell &sp ) const } } return false; + case fatigue_energy: + return p.get_fatigue() < EXHAUSTED; case none_energy: return true; default: @@ -996,30 +1063,32 @@ void spellcasting_callback::draw_spell_info( const spell &sp, const uilist *menu line++; print_colored_text( w_menu, line, h_col1, gray, gray, - _( string_format( "Spell Level: %d %s", sp.get_level(), sp.is_max_level() ? "(MAX)" : "" ) ) ); + string_format( "%s: %d %s", _( "Spell Level" ), sp.get_level(), + sp.is_max_level() ? _( "(MAX)" ) : "" ) ); print_colored_text( w_menu, line++, h_col2, gray, gray, - _( string_format( "Max Level: %d", sp.get_max_level() ) ) ); + string_format( "%s: %d", _( "Max Level" ), sp.get_max_level() ) ); print_colored_text( w_menu, line, h_col1, gray, gray, sp.colorized_fail_percent( g->u ) ); print_colored_text( w_menu, line++, h_col2, gray, gray, - _( string_format( "Difficulty: %d", sp.get_difficulty() ) ) ); + string_format( "%s: %d", _( "Difficulty" ), sp.get_difficulty() ) ); print_colored_text( w_menu, line, h_col1, gray, gray, - _( string_format( "Current Exp: %s", colorize( to_string( sp.xp() ), light_green ) ) ) ); + string_format( "%s: %s", _( "to Next Level" ), colorize( to_string( sp.xp() ), light_green ) ) ); print_colored_text( w_menu, line++, h_col2, gray, gray, - _( string_format( "to Next Level: %s", colorize( to_string( sp.exp_to_next_level() ), - light_green ) ) ) ); + string_format( "%s: %s", _( "to Next Level" ), colorize( to_string( sp.exp_to_next_level() ), + light_green ) ) ); line++; print_colored_text( w_menu, line++, h_col1, gray, gray, - _( string_format( "Casting Cost: %s %s%s", sp.energy_cost_string( g->u ), sp.energy_string(), - sp.energy_source() == hp_energy ? "" : string_format( " ( % s current )", - sp.energy_cur_string( g->u ) ) ) ) ); + string_format( "%s: %s %s%s", _( "Casting Cost" ), sp.energy_cost_string( g->u ), + sp.energy_string(), + sp.energy_source() == hp_energy ? "" : string_format( " ( %s current )", + sp.energy_cur_string( g->u ) ) ) ); print_colored_text( w_menu, line++, h_col1, gray, gray, - _( string_format( "Casting Time: %s", moves_to_string( sp.casting_time() ) ) ) ); + string_format( "%s: %s", _( "Casting Time" ), moves_to_string( sp.casting_time() ) ) ); line++; @@ -1030,7 +1099,7 @@ void spellcasting_callback::draw_spell_info( const spell &sp, const uilist *menu targets = sp.enumerate_targets(); } print_colored_text( w_menu, line++, h_col1, gray, gray, - _( string_format( "Valid Targets: %s", targets ) ) ); + string_format( "%s: %s", _( "Valid Targets" ), _( targets ) ) ); line++; @@ -1041,12 +1110,12 @@ void spellcasting_callback::draw_spell_info( const spell &sp, const uilist *menu if( fx == "target_attack" || fx == "projectile_attack" || fx == "cone_attack" || fx == "line_attack" ) { if( damage >= 0 ) { - damage_string = _( string_format( "Damage: %s %s", colorize( to_string( damage ), - sp.damage_type_color() ), - colorize( sp.damage_type_string(), sp.damage_type_color() ) ) ); + damage_string = string_format( "%s: %s %s", _( "Damage" ), colorize( to_string( damage ), + sp.damage_type_color() ), + colorize( sp.damage_type_string(), sp.damage_type_color() ) ); } else { - damage_string = _( string_format( "Healing: %s", colorize( "+" + to_string( -damage ), - light_green ) ) ); + damage_string = string_format( "%s: %s", _( "Healing" ), colorize( "+" + to_string( -damage ), + light_green ) ); } if( sp.aoe() > 0 ) { std::string aoe_string_temp = "Spell Radius"; @@ -1057,27 +1126,31 @@ void spellcasting_callback::draw_spell_info( const spell &sp, const uilist *menu } else if( fx == "line_attack" ) { aoe_string_temp = "Line Width"; } - aoe_string = _( string_format( "%s: %d %s", aoe_string_temp, sp.aoe(), degree_string ) ); + aoe_string = string_format( "%s: %d %s", _( aoe_string_temp ), sp.aoe(), degree_string ); } } else if( fx == "teleport_random" ) { if( sp.aoe() > 0 ) { - aoe_string = _( string_format( "Variance: %d", sp.aoe() ) ); + aoe_string = string_format( "%s: %d", _( "Variance" ), sp.aoe() ); } } else if( fx == "spawn_item" ) { - damage_string = _( string_format( "Spawn %d %s", sp.damage(), item::nname( sp.effect_data(), - sp.damage() ) ) ); + damage_string = string_format( "%s %d %s", _( "Spawn" ), sp.damage(), item::nname( sp.effect_data(), + sp.damage() ) ); + } else if( fx == "summon" ) { + damage_string = string_format( "%s %d %s", _( "Summon" ), sp.damage(), + _( monster( mtype_id( sp.effect_data() ) ).get_name( ) ) ); + aoe_string = string_format( "%s: %d", _( "Spell Radius" ), sp.aoe() ); } print_colored_text( w_menu, line, h_col1, gray, gray, damage_string ); print_colored_text( w_menu, line++, h_col2, gray, gray, aoe_string ); print_colored_text( w_menu, line++, h_col1, gray, gray, - _( string_format( "Range: %s", sp.range() <= 0 ? "self" : to_string( sp.range() ) ) ) ); + string_format( "%s: %s", _( "Range" ), sp.range() <= 0 ? _( "self" ) : to_string( sp.range() ) ) ); // todo: damage over time here, when it gets implemeted print_colored_text( w_menu, line++, h_col2, gray, gray, sp.duration() <= 0 ? "" : - _( string_format( "Duration: %s", moves_to_string( sp.duration() ) ) ) ); + string_format( "%s: %s", _( "Duration" ), moves_to_string( sp.duration() ) ) ); } int known_magic::get_invlet( const spell_id &sp, std::set &used_invlets ) @@ -1141,402 +1214,150 @@ int known_magic::select_spell( const player &p ) return spell_menu.ret; } -// spell_effect - -namespace spell_effect +void known_magic::on_mutation_gain( const trait_id &mid, player &p ) { - -static tripoint random_point( int min_distance, int max_distance, const tripoint &player_pos ) -{ - const int angle = rng( 0, 360 ); - const int dist = rng( min_distance, max_distance ); - const int x = round( dist * cos( angle ) ); - const int y = round( dist * sin( angle ) ); - return tripoint( x + player_pos.x, y + player_pos.y, player_pos.z ); -} - -void teleport( int min_distance, int max_distance ) -{ - if( min_distance > max_distance || min_distance < 0 || max_distance < 0 ) { - debugmsg( "ERROR: Teleport argument(s) invalid" ); - return; - } - const tripoint player_pos = g->u.pos(); - tripoint target; - // limit the loop just in case it's impossble to find a valid point in the range - int tries = 0; - do { - target = random_point( min_distance, max_distance, player_pos ); - tries++; - } while( g->m.impassable( target ) && tries < 20 ); - if( tries == 20 ) { - add_msg( m_bad, _( "Unable to find a valid target for teleport." ) ); - return; + for( const std::pair &sp : mid->spells_learned ) { + learn_spell( sp.first, p, true ); + spell &temp_sp = get_spell( sp.first ); + for( int level = 0; level <= sp.second; level++ ) { + temp_sp.gain_level(); + } } - g->place_player( target ); } -void pain_split() +void known_magic::on_mutation_loss( const trait_id &mid ) { - player &p = g->u; - add_msg( m_info, _( "Your injuries even out." ) ); - 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; + std::vector spells_to_forget; + for( const spell *sp : get_spells() ) { + if( sp->is_spell_class( mid ) ) { + spells_to_forget.emplace_back( sp->id() ); } } - for( int &part : p.hp_cur ) { - const int hp_each = total_hp / num_limbs; - if( part != 0 ) { - part = hp_each; - } + for( const spell_id &sp_id : spells_to_forget ) { + forget_spell( sp_id ); } } -void move_earth( const tripoint &target ) -{ - ter_id ter_here = g->m.ter( target ); - - std::set empty_air = { t_hole }; - std::set deep_pit = { t_pit, t_slope_down }; - std::set shallow_pit = { t_pit_corpsed, t_pit_covered, t_pit_glass, t_pit_glass_covered, t_pit_shallow, t_pit_spiked, t_pit_spiked_covered, t_rootcellar }; - std::set soft_dirt = { t_grave, t_dirt, t_sand, t_clay, t_dirtmound, t_grass, t_grass_long, t_grass_tall, t_grass_golf, t_grass_dead, t_grass_white, t_dirtfloor, t_fungus_floor_in, t_fungus_floor_sup, t_fungus_floor_out, t_sandbox }; - // rock: can still be dug through with patience, converts to sand upon completion - std::set hard_dirt = { t_pavement, t_pavement_y, t_sidewalk, t_concrete, t_thconc_floor, t_thconc_floor_olight, t_strconc_floor, t_floor, t_floor_waxed, t_carpet_red, t_carpet_yellow, t_carpet_purple, t_carpet_green, t_linoleum_white, t_linoleum_gray, t_slope_up, t_rock_red, t_rock_green, t_rock_blue, t_floor_red, t_floor_green, t_floor_blue, t_pavement_bg_dp, t_pavement_y_bg_dp, t_sidewalk_bg_dp }; - - if( empty_air.count( ter_here ) == 1 ) { - add_msg( m_bad, _( "All the dust in the air here falls to the ground." ) ); - } else if( deep_pit.count( ter_here ) == 1 ) { - g->m.ter_set( target, t_hole ); - add_msg( _( "The pit has deepened further." ) ); - } else if( shallow_pit.count( ter_here ) == 1 ) { - g->m.ter_set( target, t_pit ); - add_msg( _( "More debris shifts out of the pit." ) ); - } else if( soft_dirt.count( ter_here ) == 1 ) { - g->m.ter_set( target, t_pit_shallow ); - add_msg( _( "The earth moves out of the way for you." ) ); - } else if( hard_dirt.count( ter_here ) == 1 ) { - g->m.ter_set( target, t_sand ); - add_msg( _( "The rocks here are ground into sand." ) ); - } else { - add_msg( m_bad, _( "The earth here does not listen to your command to move." ) ); - } +void spellbook_callback::add_spell( const spell_id &sp ) +{ + spells.emplace_back( sp.obj() ); } -static bool in_spell_aoe( const tripoint &target, const tripoint &epicenter, const int &radius, - const bool ignore_walls ) +static std::string color_number( const int num ) { - if( ignore_walls ) { - return rl_dist( epicenter, target ) <= radius; - } - std::vector trajectory = line_to( epicenter, target ); - for( const tripoint &pt : trajectory ) { - if( g->m.impassable( pt ) ) { - return false; - } + if( num > 0 ) { + return colorize( to_string( num ), c_light_green ); + } else if( num < 0 ) { + return colorize( to_string( num ), c_light_red ); + } else { + return colorize( to_string( num ), c_white ); } - return rl_dist( epicenter, target ) <= radius; } -std::set spell_effect_blast( const spell &, const tripoint &, const tripoint &target, - const int aoe_radius, const bool ignore_walls ) +static std::string color_number( const float num ) { - std::set targets; - // TODO: Make this breadth-first - for( int x = target.x - aoe_radius; x <= target.x + aoe_radius; x++ ) { - for( int y = target.y - aoe_radius; y <= target.y + aoe_radius; y++ ) { - for( int z = target.z - aoe_radius; z <= target.z + aoe_radius; z++ ) { - const tripoint potential_target( x, y, z ); - if( in_spell_aoe( potential_target, target, aoe_radius, ignore_walls ) ) { - targets.emplace( potential_target ); - } - } - } - } - return targets; -} - -std::set spell_effect_cone( const spell &sp, const tripoint &source, - const tripoint &target, - const int aoe_radius, const bool ignore_walls ) -{ - std::set targets; - // cones go all the way to end (if they don't hit an obstacle) - const int range = sp.range() + 1; - const int initial_angle = coord_to_angle( source, target ); - std::set end_points; - for( int angle = initial_angle - floor( aoe_radius / 2.0 ); - angle <= initial_angle + ceil( aoe_radius / 2.0 ); angle++ ) { - tripoint potential; - calc_ray_end( angle, range, source, potential ); - end_points.emplace( potential ); - } - for( const tripoint &ep : end_points ) { - std::vector trajectory = line_to( ep, source ); - for( const tripoint &tp : trajectory ) { - if( ignore_walls || g->m.passable( tp ) ) { - targets.emplace( tp ); - } else { - break; - } - } - } - // we don't want to hit ourselves in the blast! - targets.erase( source ); - return targets; -} - -std::set spell_effect_line( const spell &, const tripoint &source, - const tripoint &target, - const int aoe_radius, const bool ignore_walls ) -{ - std::set targets; - const int initial_angle = coord_to_angle( source, target ); - tripoint clockwise_starting_point; - calc_ray_end( initial_angle - 90, floor( aoe_radius / 2.0 ), source, clockwise_starting_point ); - tripoint cclockwise_starting_point; - calc_ray_end( initial_angle + 90, ceil( aoe_radius / 2.0 ), source, cclockwise_starting_point ); - tripoint clockwise_end_point; - calc_ray_end( initial_angle - 90, floor( aoe_radius / 2.0 ), target, clockwise_end_point ); - tripoint cclockwise_end_point; - calc_ray_end( initial_angle + 90, ceil( aoe_radius / 2.0 ), target, cclockwise_end_point ); - - std::vector start_width = line_to( clockwise_starting_point, cclockwise_starting_point ); - start_width.insert( start_width.begin(), clockwise_end_point ); - std::vector end_width = line_to( clockwise_end_point, cclockwise_end_point ); - end_width.insert( end_width.begin(), clockwise_starting_point ); - - std::vector cwise_line = line_to( clockwise_starting_point, cclockwise_starting_point ); - cwise_line.insert( cwise_line.begin(), clockwise_starting_point ); - std::vector ccwise_line = line_to( cclockwise_starting_point, cclockwise_end_point ); - ccwise_line.insert( ccwise_line.begin(), cclockwise_starting_point ); - - for( const tripoint &start_line_pt : start_width ) { - bool passable = true; - for( const tripoint &potential_target : line_to( source, start_line_pt ) ) { - passable = g->m.passable( potential_target ) || ignore_walls; - if( passable ) { - targets.emplace( potential_target ); - } else { - break; - } - } - if( !passable ) { - // leading edge of line attack is very important to the whole - // if the leading edge is blocked, none of the attack spawning - // from that edge can propogate - continue; - } - for( const tripoint &end_line_pt : end_width ) { - std::vector temp_line = line_to( start_line_pt, end_line_pt ); - for( const tripoint &potential_target : temp_line ) { - if( ignore_walls || g->m.passable( potential_target ) ) { - targets.emplace( potential_target ); - } else { - break; - } - } - } - for( const tripoint &cwise_line_pt : cwise_line ) { - std::vector temp_line = line_to( start_line_pt, cwise_line_pt ); - for( const tripoint &potential_target : temp_line ) { - if( ignore_walls || g->m.passable( potential_target ) ) { - targets.emplace( potential_target ); - } else { - break; - } - } - } - for( const tripoint &ccwise_line_pt : ccwise_line ) { - std::vector temp_line = line_to( start_line_pt, ccwise_line_pt ); - for( const tripoint &potential_target : temp_line ) { - if( ignore_walls || g->m.passable( potential_target ) ) { - targets.emplace( potential_target ); - } else { - break; - } - } - } + if( num > 100 ) { + return colorize( string_format( "+%.0f", num ), c_light_green ); + } else if( num < -100 ) { + return colorize( string_format( "%.0f", num ), c_light_red ); + } else if( num > 0 ) { + return colorize( string_format( "+%.2f", num ), c_light_green ); + } else if( num < 0 ) { + return colorize( string_format( "%.2f", num ), c_light_red ); + } else { + return colorize( "0", c_white ); } - - targets.erase( source ); - - return targets; } -// spells do not reduce in damage the further away from the epicenter the targets are -// rather they do their full damage in the entire area of effect -static std::set spell_effect_area( const spell &sp, const tripoint &source, - const tripoint &target, - std::function( const spell &, const tripoint &, const tripoint &, const int, const bool )> - aoe_func, bool ignore_walls = false ) +static void draw_spellbook_info( const spell_type &sp, uilist *menu ) { - std::set targets = { target }; // initialize with epicenter - if( sp.aoe() <= 1 ) { - return targets; - } + const int width = menu->pad_left - 4; + const int start_x = 2; + int line = 1; + const catacurses::window w = menu->window; + nc_color gray = c_light_gray; + nc_color yellow = c_yellow; + const spell fake_spell( &sp ); + + const std::string spell_name = colorize( _( sp.name ), c_light_green ); + const std::string spell_class = sp.spell_class == trait_id( "NONE" ) ? _( "Classless" ) : + sp.spell_class->name(); + print_colored_text( w, line, start_x, gray, gray, spell_name ); + print_colored_text( w, line++, menu->pad_left - spell_class.length() - 1, yellow, yellow, + spell_class ); + line++; + line += fold_and_print( w, line, start_x, width, gray, _( sp.description ) ); + line++; - const int aoe_radius = sp.aoe(); - targets = aoe_func( sp, source, target, aoe_radius, ignore_walls ); + mvwprintz( w, line, start_x, c_light_gray, string_format( "%s: %d", _( "Difficulty" ), + sp.difficulty ) ); + mvwprintz( w, line++, start_x + width / 2, c_light_gray, string_format( "%s: %d", _( "Max Level" ), + sp.max_level ) ); - for( const tripoint &p : targets ) { - if( !sp.is_valid_target( p ) ) { - targets.erase( p ); - } + const std::string fx = sp.effect; + std::string damage_string; + std::string aoe_string; + bool has_damage_type = false; + if( fx == "target_attack" || fx == "projectile_attack" || fx == "cone_attack" || + fx == "line_attack" ) { + damage_string = _( "Damage" ); + aoe_string = _( "AoE" ); + 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 == "recover_energy" ) { + damage_string = _( "Recover" ); + } else if( fx == "teleport_random" ) { + aoe_string = _( "Variance" ); } - // Draw the explosion - std::map explosion_colors; - for( auto &pt : targets ) { - explosion_colors[pt] = sp.damage_type_color(); + if( has_damage_type ) { + print_colored_text( w, line++, start_x, gray, gray, string_format( "%s: %s", _( "Damage Type" ), + colorize( fake_spell.damage_type_string(), fake_spell.damage_type_color() ) ) ); } + line++; - explosion_handler::draw_custom_explosion( g->u.pos(), explosion_colors ); - return targets; -} - -static void add_effect_to_target( const tripoint &target, const spell &sp ) -{ - const int dur_moves = sp.duration(); - const time_duration dur_td = 1_turns * dur_moves / 100; - - Creature *const critter = g->critter_at( target ); - Character *const guy = g->critter_at( target ); - efftype_id spell_effect( sp.effect_data() ); - bool bodypart_effected = false; + print_colored_text( w, line++, start_x, gray, gray, + string_format( "%-10s %-7s %-7s %-7s", _( "Stat Gain" ), _( "lvl 0" ), _( "per lvl" ), + _( "max lvl" ) ) ); + std::vector> rows; - if( guy ) { - for( const body_part bp : all_body_parts ) { - if( sp.bp_is_affected( bp ) ) { - guy->add_effect( spell_effect, dur_td, bp, sp.has_flag( "PERMANENT" ) ); - bodypart_effected = true; - } - } + if( sp.max_damage != 0 && sp.min_damage != 0 && !damage_string.empty() ) { + rows.emplace_back( damage_string, sp.min_damage, sp.damage_increment, sp.max_damage ); } - if( !bodypart_effected ) { - critter->add_effect( spell_effect, dur_td, num_bp ); - } -} - -static void damage_targets( const spell &sp, std::set targets ) -{ - for( const tripoint target : targets ) { - Creature *const cr = g->critter_at( target ); - if( !cr ) { - continue; - } - projectile bolt; - bolt.impact = sp.get_damage_instance(); - bolt.proj_effects.emplace( "magic" ); - - dealt_projectile_attack atk; - atk.end_point = target; - atk.hit_critter = cr; - atk.proj = bolt; - if( !sp.effect_data().empty() ) { - add_effect_to_target( target, sp ); - } - if( sp.damage() > 0 ) { - cr->deal_projectile_attack( &g->u, atk, true ); - } else { - sp.heal( target ); - add_msg( m_good, _( "%s wounds are closing up!" ), cr->disp_name( true ) ); - } + if( sp.max_range != 0 && sp.min_range != 0 ) { + rows.emplace_back( _( "Range" ), sp.min_range, sp.range_increment, sp.max_range ); } -} -void projectile_attack( const spell &sp, const tripoint &source, const tripoint &target ) -{ - std::vector trajectory = line_to( source, target ); - for( const tripoint &pt : trajectory ) { - if( g->m.impassable( pt ) || pt == trajectory.back() ) { - target_attack( sp, source, target ); - } + if( sp.min_aoe != 0 && sp.max_aoe != 0 && !aoe_string.empty() ) { + rows.emplace_back( aoe_string, sp.min_aoe, sp.range_increment, sp.max_aoe ); } -} -void target_attack( const spell &sp, const tripoint &source, const tripoint &epicenter ) -{ - damage_targets( sp, spell_effect_area( sp, source, epicenter, spell_effect_blast, - sp.has_flag( "IGNORE_WALLS" ) ) ); -} - -void cone_attack( const spell &sp, const tripoint &source, const tripoint &target ) -{ - damage_targets( sp, spell_effect_area( sp, source, target, spell_effect_cone, - sp.has_flag( "IGNORE_WALLS" ) ) ); -} + if( sp.min_duration != 0 && sp.max_duration != 0 ) { + rows.emplace_back( _( "Duration" ), sp.min_duration, sp.duration_increment, sp.max_duration ); + } -void line_attack( const spell &sp, const tripoint &source, const tripoint &target ) -{ - damage_targets( sp, spell_effect_area( sp, source, target, spell_effect_line, - sp.has_flag( "IGNORE_WALLS" ) ) ); -} + rows.emplace_back( _( "Cast Cost" ), sp.base_energy_cost, sp.energy_increment, + sp.final_energy_cost ); + rows.emplace_back( _( "Cast Time" ), sp.base_casting_time, sp.casting_time_increment, + sp.final_casting_time ); -void spawn_ethereal_item( spell &sp ) -{ - item granted( sp.effect_data(), calendar::turn ); - if( !granted.is_comestible() && !( sp.has_flag( "PERMANENT" ) && sp.is_max_level() ) ) { - granted.set_var( "ethereal", to_turns( sp.duration_turns() ) ); - granted.set_flag( "ETHEREAL_ITEM" ); - } - if( granted.count_by_charges() && sp.damage() > 0 ) { - granted.charges = sp.damage(); - } - if( g->u.can_wear( granted ).success() ) { - granted.set_flag( "FIT" ); - g->u.wear_item( granted, false ); - } else if( !g->u.is_armed() ) { - g->u.weapon = granted; - } else { - g->u.i_add( granted ); - } - if( !granted.count_by_charges() ) { - for( int i = 1; i < sp.damage(); i++ ) { - g->u.i_add( granted ); - } + for( std::tuple &row : rows ) { + mvwprintz( w, line, start_x, c_light_gray, std::get<0>( row ) ); + print_colored_text( w, line, start_x + 11, gray, gray, color_number( std::get<1>( row ) ) ); + print_colored_text( w, line, start_x + 19, gray, gray, color_number( std::get<2>( row ) ) ); + print_colored_text( w, line, start_x + 27, gray, gray, color_number( std::get<3>( row ) ) ); + line++; } } -void recover_energy( spell &sp, const tripoint &target ) +void spellbook_callback::select( int entnum, uilist *menu ) { - // this spell is not appropriate for healing - const int healing = sp.damage(); - const std::string energy_source = sp.effect_data(); - // TODO: Change to Character - // current limitation is that Character does not have stamina or power_level members - player *p = g->critter_at( target ); - - if( energy_source == "MANA" ) { - p->magic.mod_mana( *p, healing ); - } else if( energy_source == "STAMINA" ) { - if( healing > 0 ) { - p->stamina = std::min( p->get_stamina_max(), p->stamina + healing ); - } else { - p->stamina = std::max( 0, p->stamina + healing ); - } - } else if( energy_source == "FATIGUE" ) { - // fatigue is backwards - p->mod_fatigue( -healing ); - } else if( energy_source == "BIONIC" ) { - if( healing > 0 ) { - p->power_level = std::min( p->max_power_level, p->power_level + healing ); - } else { - p->stamina = std::max( 0, p->stamina + healing ); - } - } else if( energy_source == "PAIN" ) { - // pain is backwards - p->mod_pain_noresist( -healing ); - } else if( energy_source == "HEALTH" ) { - p->mod_healthy( healing ); - } else { - debugmsg( "Invalid effect_str %s for spell %s", energy_source, sp.name() ); + mvwputch( menu->window, 0, menu->pad_left, c_magenta, LINE_OXXX ); + mvwputch( menu->window, menu->w_height - 1, menu->pad_left, c_magenta, LINE_XXOX ); + for( int i = 1; i < menu->w_height - 1; i++ ) { + mvwputch( menu->window, i, menu->pad_left, c_magenta, LINE_XOXO ); } -} - + draw_spellbook_info( spells[entnum], menu ); } diff --git a/src/magic.h b/src/magic.h index 10a77fd0a7a62..256ca5b62cdb5 100644 --- a/src/magic.h +++ b/src/magic.h @@ -9,6 +9,7 @@ #include "damage.h" #include "enum_bitset.h" #include "type_id.h" +#include "ui.h" struct mutation_branch; struct tripoint; @@ -22,11 +23,27 @@ class JsonIn; class time_duration; class nc_color; +enum spell_flag { + PERMANENT, // items or creatures spawned with this spell do not disappear and die as normal + IGNORE_WALLS, // spell's aoe goes through walls + HOSTILE_SUMMON, // summon spell always spawns a hostile monster + HOSTILE_50, // summoned monster spawns friendly 50% of the time + 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 % + SOMATIC, // arm encumbrance affects fail % and casting time (slightly) + NO_HANDS, // hands do not affect spell energy cost + NO_LEGS, // legs do not affect casting time + CONCENTRATE, // focus affects spell fail % + LAST +}; + enum energy_type { hp_energy, mana_energy, stamina_energy, bionic_energy, + fatigue_energy, none_energy }; @@ -44,9 +61,15 @@ struct enum_traits { static constexpr auto last = valid_target::_LAST; }; +template<> +struct enum_traits { + static constexpr auto last = spell_flag::LAST; +}; + class spell_type { public: + spell_type() = default; bool was_loaded = false; @@ -147,7 +170,7 @@ class spell_type // lits of bodyparts this spell applies its effect to enum_bitset affected_bps; - std::set spell_tags; + enum_bitset spell_tags; static void load_spell( JsonObject &jo, const std::string &src ); void load( JsonObject &jo, const std::string & ); @@ -224,7 +247,9 @@ class spell // is the bodypart affected by the effect bool bp_is_affected( body_part bp ) const; // check if the spell has a particular flag - bool has_flag( const std::string &flag ) const; + bool has_flag( const spell_flag &flag ) const; + // check if the spell's class is the same as input + bool is_spell_class( const trait_id &mid ) const; // get spell id (from type) spell_id id() const; @@ -254,6 +279,8 @@ class spell // difficulty of the level int get_difficulty() const; + // makes a spell sound at the location + void make_sound( const tripoint &target ) const; // heals the critter at the location, returns amount healed (player heals each body part) int heal( const tripoint &target ) const; @@ -310,6 +337,9 @@ class known_magic // not specific to mana bool has_enough_energy( const player &p, spell &sp ) const; + void on_mutation_gain( const trait_id &mid, player &p ); + void on_mutation_loss( const trait_id &mid ); + void serialize( JsonOut &json ) const; void deserialize( JsonIn &jsin ); private: @@ -340,6 +370,16 @@ std::set spell_effect_line( const spell &, const tripoint &source, void spawn_ethereal_item( spell &sp ); void recover_energy( spell &sp, const tripoint &target ); -} +void spawn_summoned_monster( spell &sp, const tripoint &source, const tripoint &target ); +} // namespace spell_effect + +class spellbook_callback : public uilist_callback +{ + private: + std::vector spells; + public: + void add_spell( const spell_id &sp ); + void select( int entnum, uilist *menu ) override; +}; #endif diff --git a/src/magic_spell_effect.cpp b/src/magic_spell_effect.cpp new file mode 100644 index 0000000000000..e17762d561fad --- /dev/null +++ b/src/magic_spell_effect.cpp @@ -0,0 +1,473 @@ +#include "magic.h" + +#include + +#include "avatar.h" +#include "calendar.h" +#include "character.h" +#include "color.h" +#include "creature.h" +#include "enums.h" +#include "game.h" +#include "item.h" +#include "line.h" +#include "map.h" +#include "mapdata.h" +#include "messages.h" +#include "monster.h" +#include "player.h" +#include "projectile.h" +#include "type_id.h" + +static tripoint random_point( int min_distance, int max_distance, const tripoint &player_pos ) +{ + const int angle = rng( 0, 360 ); + const int dist = rng( min_distance, max_distance ); + const int x = round( dist * cos( angle ) ); + const int y = round( dist * sin( angle ) ); + return tripoint( x + player_pos.x, y + player_pos.y, player_pos.z ); +} + +void spell_effect::teleport( int min_distance, int max_distance ) +{ + if( min_distance > max_distance || min_distance < 0 || max_distance < 0 ) { + debugmsg( "ERROR: Teleport argument(s) invalid" ); + return; + } + const tripoint player_pos = g->u.pos(); + tripoint target; + // limit the loop just in case it's impossble to find a valid point in the range + int tries = 0; + do { + target = random_point( min_distance, max_distance, player_pos ); + tries++; + } while( g->m.impassable( target ) && tries < 20 ); + if( tries == 20 ) { + add_msg( m_bad, _( "Unable to find a valid target for teleport." ) ); + return; + } + g->place_player( target ); +} + +void spell_effect::pain_split() +{ + player &p = g->u; + add_msg( m_info, _( "Your injuries even out." ) ); + 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; + } + } +} + +void spell_effect::move_earth( const tripoint &target ) +{ + ter_id ter_here = g->m.ter( target ); + + std::set empty_air = { t_hole }; + std::set deep_pit = { t_pit, t_slope_down }; + std::set shallow_pit = { t_pit_corpsed, t_pit_covered, t_pit_glass, t_pit_glass_covered, t_pit_shallow, t_pit_spiked, t_pit_spiked_covered, t_rootcellar }; + std::set soft_dirt = { t_grave, t_dirt, t_sand, t_clay, t_dirtmound, t_grass, t_grass_long, t_grass_tall, t_grass_golf, t_grass_dead, t_grass_white, t_dirtfloor, t_fungus_floor_in, t_fungus_floor_sup, t_fungus_floor_out, t_sandbox }; + // rock: can still be dug through with patience, converts to sand upon completion + std::set hard_dirt = { t_pavement, t_pavement_y, t_sidewalk, t_concrete, t_thconc_floor, t_thconc_floor_olight, t_strconc_floor, t_floor, t_floor_waxed, t_carpet_red, t_carpet_yellow, t_carpet_purple, t_carpet_green, t_linoleum_white, t_linoleum_gray, t_slope_up, t_rock_red, t_rock_green, t_rock_blue, t_floor_red, t_floor_green, t_floor_blue, t_pavement_bg_dp, t_pavement_y_bg_dp, t_sidewalk_bg_dp }; + + if( empty_air.count( ter_here ) == 1 ) { + add_msg( m_bad, _( "All the dust in the air here falls to the ground." ) ); + } else if( deep_pit.count( ter_here ) == 1 ) { + g->m.ter_set( target, t_hole ); + add_msg( _( "The pit has deepened further." ) ); + } else if( shallow_pit.count( ter_here ) == 1 ) { + g->m.ter_set( target, t_pit ); + add_msg( _( "More debris shifts out of the pit." ) ); + } else if( soft_dirt.count( ter_here ) == 1 ) { + g->m.ter_set( target, t_pit_shallow ); + add_msg( _( "The earth moves out of the way for you." ) ); + } else if( hard_dirt.count( ter_here ) == 1 ) { + g->m.ter_set( target, t_sand ); + add_msg( _( "The rocks here are ground into sand." ) ); + } else { + add_msg( m_bad, _( "The earth here does not listen to your command to move." ) ); + } +} + +static bool in_spell_aoe( const tripoint &start, const tripoint &end, const int &radius, + const bool ignore_walls ) +{ + if( rl_dist( start, end ) > radius ) { + return false; + } + if( ignore_walls ) { + return true; + } + const std::vector trajectory = line_to( start, end ); + for( const tripoint &pt : trajectory ) { + if( g->m.impassable( pt ) ) { + return false; + } + } + return true; +} + +std::set spell_effect::spell_effect_blast( const spell &, const tripoint &, + const tripoint &target, const int aoe_radius, const bool ignore_walls ) +{ + std::set targets; + // TODO: Make this breadth-first + for( int x = target.x - aoe_radius; x <= target.x + aoe_radius; x++ ) { + for( int y = target.y - aoe_radius; y <= target.y + aoe_radius; y++ ) { + const tripoint potential_target( x, y, target.z ); + if( in_spell_aoe( target, potential_target, aoe_radius, ignore_walls ) ) { + targets.emplace( potential_target ); + } + } + } + return targets; +} + +std::set spell_effect::spell_effect_cone( const spell &sp, const tripoint &source, + const tripoint &target, const int aoe_radius, const bool ignore_walls ) +{ + std::set targets; + // cones go all the way to end (if they don't hit an obstacle) + const int range = sp.range() + 1; + const int initial_angle = coord_to_angle( source, target ); + std::set end_points; + for( int angle = initial_angle - floor( aoe_radius / 2.0 ); + angle <= initial_angle + ceil( aoe_radius / 2.0 ); angle++ ) { + tripoint potential; + calc_ray_end( angle, range, source, potential ); + end_points.emplace( potential ); + } + 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 ) ) { + targets.emplace( tp ); + } else { + break; + } + } + } + // we don't want to hit ourselves in the blast! + targets.erase( source ); + return targets; +} + +std::set spell_effect::spell_effect_line( const spell &, const tripoint &source, + const tripoint &target, const int aoe_radius, const bool ignore_walls ) +{ + std::set targets; + const int initial_angle = coord_to_angle( source, target ); + tripoint clockwise_starting_point; + calc_ray_end( initial_angle - 90, floor( aoe_radius / 2.0 ), source, clockwise_starting_point ); + tripoint cclockwise_starting_point; + calc_ray_end( initial_angle + 90, ceil( aoe_radius / 2.0 ), source, cclockwise_starting_point ); + tripoint clockwise_end_point; + calc_ray_end( initial_angle - 90, floor( aoe_radius / 2.0 ), target, clockwise_end_point ); + tripoint cclockwise_end_point; + calc_ray_end( initial_angle + 90, ceil( aoe_radius / 2.0 ), target, cclockwise_end_point ); + + std::vector start_width = line_to( clockwise_starting_point, cclockwise_starting_point ); + start_width.insert( start_width.begin(), clockwise_end_point ); + std::vector end_width = line_to( clockwise_end_point, cclockwise_end_point ); + end_width.insert( end_width.begin(), clockwise_starting_point ); + + std::vector cwise_line = line_to( clockwise_starting_point, cclockwise_starting_point ); + cwise_line.insert( cwise_line.begin(), clockwise_starting_point ); + std::vector ccwise_line = line_to( cclockwise_starting_point, cclockwise_end_point ); + ccwise_line.insert( ccwise_line.begin(), cclockwise_starting_point ); + + for( const tripoint &start_line_pt : start_width ) { + bool passable = true; + for( const tripoint &potential_target : line_to( source, start_line_pt ) ) { + passable = g->m.passable( potential_target ) || ignore_walls; + if( passable ) { + targets.emplace( potential_target ); + } else { + break; + } + } + if( !passable ) { + // leading edge of line attack is very important to the whole + // if the leading edge is blocked, none of the attack spawning + // from that edge can propogate + continue; + } + for( const tripoint &end_line_pt : end_width ) { + std::vector temp_line = line_to( start_line_pt, end_line_pt ); + for( const tripoint &potential_target : temp_line ) { + if( ignore_walls || g->m.passable( potential_target ) ) { + targets.emplace( potential_target ); + } else { + break; + } + } + } + for( const tripoint &cwise_line_pt : cwise_line ) { + std::vector temp_line = line_to( start_line_pt, cwise_line_pt ); + for( const tripoint &potential_target : temp_line ) { + if( ignore_walls || g->m.passable( potential_target ) ) { + targets.emplace( potential_target ); + } else { + break; + } + } + } + for( const tripoint &ccwise_line_pt : ccwise_line ) { + std::vector temp_line = line_to( start_line_pt, ccwise_line_pt ); + for( const tripoint &potential_target : temp_line ) { + if( ignore_walls || g->m.passable( potential_target ) ) { + targets.emplace( potential_target ); + } else { + break; + } + } + } + } + + targets.erase( source ); + + return targets; +} + +// spells do not reduce in damage the further away from the epicenter the targets are +// rather they do their full damage in the entire area of effect +static std::set spell_effect_area( const spell &sp, const tripoint &source, + const tripoint &target, + std::function( const spell &, const tripoint &, const tripoint &, const int, const bool )> + aoe_func, bool ignore_walls = false ) +{ + std::set targets = { target }; // initialize with epicenter + if( sp.aoe() <= 1 ) { + return targets; + } + + const int aoe_radius = sp.aoe(); + targets = aoe_func( sp, source, target, aoe_radius, ignore_walls ); + + for( const tripoint &p : targets ) { + if( !sp.is_valid_target( p ) ) { + targets.erase( p ); + } + } + + // Draw the explosion + std::map explosion_colors; + for( auto &pt : targets ) { + explosion_colors[pt] = sp.damage_type_color(); + } + + explosion_handler::draw_custom_explosion( g->u.pos(), explosion_colors ); + return targets; +} + +static void add_effect_to_target( const tripoint &target, const spell &sp ) +{ + const int dur_moves = sp.duration(); + const time_duration dur_td = 1_turns * dur_moves / 100; + + Creature *const critter = g->critter_at( target ); + Character *const guy = g->critter_at( target ); + efftype_id spell_effect( sp.effect_data() ); + bool bodypart_effected = false; + + if( guy ) { + for( const body_part bp : all_body_parts ) { + if( sp.bp_is_affected( bp ) ) { + guy->add_effect( spell_effect, dur_td, bp, sp.has_flag( spell_flag::PERMANENT ) ); + bodypart_effected = true; + } + } + } + if( !bodypart_effected ) { + critter->add_effect( spell_effect, dur_td, num_bp ); + } +} + +static void damage_targets( const spell &sp, std::set targets ) +{ + for( const tripoint target : targets ) { + if( !sp.is_valid_target( target ) ) { + continue; + } + sp.make_sound( target ); + Creature *const cr = g->critter_at( target ); + if( !cr ) { + continue; + } + + projectile bolt; + bolt.impact = sp.get_damage_instance(); + bolt.proj_effects.emplace( "magic" ); + + dealt_projectile_attack atk; + atk.end_point = target; + atk.hit_critter = cr; + atk.proj = bolt; + if( !sp.effect_data().empty() ) { + add_effect_to_target( target, sp ); + } + if( sp.damage() > 0 ) { + cr->deal_projectile_attack( &g->u, atk, true ); + } else { + sp.heal( target ); + add_msg( m_good, _( "%s wounds are closing up!" ), cr->disp_name( true ) ); + } + } +} + +void spell_effect::projectile_attack( const spell &sp, const tripoint &source, + const tripoint &target ) +{ + std::vector trajectory = line_to( source, target ); + for( std::vector::iterator iter = trajectory.begin(); iter != trajectory.end(); iter++ ) { + if( g->m.impassable( *iter ) ) { + if( iter != trajectory.begin() ) { + target_attack( sp, source, *( iter - 1 ) ); + } else { + target_attack( sp, source, *iter ); + } + return; + } + } + target_attack( sp, source, trajectory.back() ); +} + +void spell_effect::target_attack( const spell &sp, const tripoint &source, + const tripoint &epicenter ) +{ + damage_targets( sp, spell_effect_area( sp, source, epicenter, spell_effect_blast, + sp.has_flag( spell_flag::IGNORE_WALLS ) ) ); +} + +void spell_effect::cone_attack( const spell &sp, const tripoint &source, const tripoint &target ) +{ + damage_targets( sp, spell_effect_area( sp, source, target, spell_effect_cone, + sp.has_flag( spell_flag::IGNORE_WALLS ) ) ); +} + +void spell_effect::line_attack( const spell &sp, const tripoint &source, const tripoint &target ) +{ + damage_targets( sp, spell_effect_area( sp, source, target, spell_effect_line, + sp.has_flag( spell_flag::IGNORE_WALLS ) ) ); +} + +void spell_effect::spawn_ethereal_item( spell &sp ) +{ + item granted( sp.effect_data(), calendar::turn ); + if( !granted.is_comestible() && !( sp.has_flag( spell_flag::PERMANENT ) && sp.is_max_level() ) ) { + granted.set_var( "ethereal", to_turns( sp.duration_turns() ) ); + granted.set_flag( "ETHEREAL_ITEM" ); + } + if( granted.count_by_charges() && sp.damage() > 0 ) { + granted.charges = sp.damage(); + } + if( g->u.can_wear( granted ).success() ) { + granted.set_flag( "FIT" ); + g->u.wear_item( granted, false ); + } else if( !g->u.is_armed() ) { + g->u.weapon = granted; + } else { + g->u.i_add( granted ); + } + if( !granted.count_by_charges() ) { + for( int i = 1; i < sp.damage(); i++ ) { + g->u.i_add( granted ); + } + } +} + +void spell_effect::recover_energy( spell &sp, const tripoint &target ) +{ + // this spell is not appropriate for healing + const int healing = sp.damage(); + const std::string energy_source = sp.effect_data(); + // TODO: Change to Character + // current limitation is that Character does not have stamina or power_level members + player *p = g->critter_at( target ); + + if( energy_source == "MANA" ) { + p->magic.mod_mana( *p, healing ); + } else if( energy_source == "STAMINA" ) { + if( healing > 0 ) { + p->stamina = std::min( p->get_stamina_max(), p->stamina + healing ); + } else { + p->stamina = std::max( 0, p->stamina + healing ); + } + } else if( energy_source == "FATIGUE" ) { + // fatigue is backwards + p->mod_fatigue( -healing ); + } else if( energy_source == "BIONIC" ) { + if( healing > 0 ) { + p->power_level = std::min( p->max_power_level, p->power_level + healing ); + } else { + p->stamina = std::max( 0, p->stamina + healing ); + } + } else if( energy_source == "PAIN" ) { + // pain is backwards + p->mod_pain_noresist( -healing ); + } else if( energy_source == "HEALTH" ) { + p->mod_healthy( healing ); + } else { + debugmsg( "Invalid effect_str %s for spell %s", energy_source, sp.name() ); + } +} + +static bool is_summon_friendly( const spell &sp ) +{ + const bool hostile = sp.has_flag( spell_flag::HOSTILE_SUMMON ); + bool friendly = !hostile; + if( sp.has_flag( spell_flag::HOSTILE_50 ) ) { + friendly = friendly && rng( 0, 1000 ) < 500; + } + return friendly; +} + +static bool add_summoned_mon( const mtype_id &id, const tripoint &pos, const time_duration &time, + const spell &sp ) +{ + const bool permanent = sp.has_flag( spell_flag::PERMANENT ); + monster spawned_mon( id, pos ); + if( is_summon_friendly( sp ) ) { + spawned_mon.friendly = INT_MAX; + } else { + spawned_mon.friendly = 0; + } + if( !permanent ) { + spawned_mon.set_summon_time( time ); + } + return g->add_zombie( spawned_mon ); +} + +void spell_effect::spawn_summoned_monster( spell &sp, const tripoint &source, + const tripoint &target ) +{ + const mtype_id mon_id( sp.effect_data() ); + std::set area = spell_effect_area( sp, source, target, spell_effect_blast ); + // this should never be negative, but this'll keep problems from happening + size_t num_mons = abs( sp.damage() ); + const time_duration summon_time = sp.duration_turns(); + while( num_mons > 0 && area.size() > 0 ) { + const size_t mon_spot = rng( 0, area.size() - 1 ); + auto iter = area.begin(); + std::advance( iter, mon_spot ); + if( add_summoned_mon( mon_id, *iter, summon_time, sp ) ) { + num_mons--; + sp.make_sound( *iter ); + } else { + add_msg( m_bad, "failed to place monster" ); + } + // whether or not we succeed in spawning a monster, we don't want to try this tripoint again + area.erase( iter ); + } +} diff --git a/src/main_menu.cpp b/src/main_menu.cpp index 2714c93ad3b8d..4953729236883 100644 --- a/src/main_menu.cpp +++ b/src/main_menu.cpp @@ -730,6 +730,8 @@ bool main_menu::new_character_tab() load_char_templates(); werase( w_background ); wrefresh( w_background ); + MAPBUFFER.reset(); + overmap_buffer.clear(); continue; } @@ -817,6 +819,8 @@ bool main_menu::new_character_tab() load_char_templates(); werase( w_background ); wrefresh( w_background ); + MAPBUFFER.reset(); + overmap_buffer.clear(); continue; } werase( w_background ); diff --git a/src/map.cpp b/src/map.cpp index 6050e03175411..5d7b32e620cd0 100644 --- a/src/map.cpp +++ b/src/map.cpp @@ -17,6 +17,7 @@ #include "artifact.h" #include "avatar.h" #include "calendar.h" +#include "colony.h" #include "coordinate_conversions.h" #include "clzones.h" #include "debug.h" @@ -97,27 +98,21 @@ const efftype_id effect_stunned( "stunned" ); #define dbg(x) DebugLog((x),D_MAP) << __FILE__ << ":" << __LINE__ << ": " -static std::list nulitems; // Returned when &i_at() is asked for an OOB value -static field nulfield; // Returned when &field_at() is asked for an OOB value -static level_cache nullcache; // Dummy cache for z-levels outside bounds +static cata::colony nulitems; // Returned when &i_at() is asked for an OOB value +static field nulfield; // Returned when &field_at() is asked for an OOB value +static level_cache nullcache; // Dummy cache for z-levels outside bounds // Map stack methods. -std::list::iterator map_stack::erase( std::list::iterator it ) +map_stack::iterator map_stack::erase( map_stack::const_iterator it ) { return myorigin->i_rem( location, it ); } -void map_stack::push_back( const item &newitem ) +void map_stack::insert( const item &newitem ) { myorigin->add_item_or_charges( location, newitem ); } -void map_stack::insert_at( std::list::iterator index, - const item &newitem ) -{ - myorigin->add_item_at( location, index, newitem ); -} - units::volume map_stack::max_volume() const { if( !myorigin->inbounds( location ) ) { @@ -1311,9 +1306,17 @@ bool map::can_move_furniture( const tripoint &pos, player *p ) std::string map::furnname( const tripoint &p ) { const furn_t &f = furn( p ).obj(); - if( f.has_flag( "PLANT" ) && !i_at( p ).empty() ) { - const item &seed = i_at( p ).front(); - const std::string &plant = seed.get_plant_name(); + if( f.has_flag( "PLANT" ) ) { + // Can't use item_stack::only_item() since there might be fertilizer + map_stack items = i_at( p ); + const map_stack::iterator seed = std::find_if( items.begin(), items.end(), []( const item & it ) { + return it.is_seed(); + } ); + if( seed == items.end() ) { + debugmsg( "Missing seed for plant at (%d, %d, %d)", p.x, p.y, p.z ); + return "null"; + } + const std::string &plant = seed->get_plant_name(); return string_format( "%s (%s)", f.name(), plant ); } else { return f.name(); @@ -2009,7 +2012,7 @@ void map::drop_furniture( const tripoint &p ) auto old_items = i_at( p ); auto new_items = i_at( current ); for( const auto &it : old_items ) { - new_items.push_back( it ); + new_items.insert( it ); } i_clear( p ); @@ -2670,7 +2673,7 @@ bool map::is_flammable( const tripoint &p ) return true; } - if( get_field_strength( p, fd_web ) > 0 ) { + if( get_field_intensity( p, fd_web ) > 0 ) { return true; } @@ -2702,6 +2705,7 @@ void map::decay_fields_and_scent( const time_duration &amount ) << abs_sub.x + smx << "," << abs_sub.y + smy << "," << abs_sub.z << "has " << to_proc << " field_count"; } + get_cache( smz ).field_cache.reset( smx + ( smy * MAPSIZE ) ); // This submap has no fields continue; } @@ -3180,7 +3184,7 @@ void map::bash_ter_furn( const tripoint &p, bash_params ¶ms ) params.did_bash = true; if( !params.silent ) { - sound = bash->sound_fail.empty() ? _( "Thnk!" ) : _( bash->sound_fail ); + sound = bash->sound_fail; sounds::sound( p, sound_volume, sounds::sound_t::combat, sound, false, "smash_fail", soundfxvariant ); } @@ -3341,7 +3345,7 @@ void map::bash_ter_furn( const tripoint &p, bash_params ¶ms ) params.success |= success; // Not always true, so that we can tell when to stop destroying params.bashed_solid = true; if( !sound.empty() && !params.silent ) { - sounds::sound( p, sound_volume, sounds::sound_t::combat, _( sound ), false, + sounds::sound( p, sound_volume, sounds::sound_t::combat, sound, false, soundfxid, soundfxvariant ); } } @@ -4058,16 +4062,11 @@ map_stack map::i_at( const int x, const int y ) return map_stack{ ¤t_submap->itm[l.x][l.y], tripoint( p, abs_sub.z ), this }; } -std::list::iterator map::i_rem( const point &location, std::list::iterator it ) +map_stack::iterator map::i_rem( const point &location, map_stack::const_iterator it ) { return i_rem( tripoint( location, abs_sub.z ), it ); } -int map::i_rem( const int x, const int y, const int index ) -{ - return i_rem( tripoint( x, y, abs_sub.z ), index ); -} - void map::i_rem( const int x, const int y, item *it ) { i_rem( tripoint( x, y, abs_sub.z ), it ); @@ -4122,7 +4121,7 @@ map_stack map::i_at( const tripoint &p ) return map_stack{ ¤t_submap->itm[l.x][l.y], p, this }; } -std::list::iterator map::i_rem( const tripoint &p, std::list::iterator it ) +map_stack::iterator map::i_rem( const tripoint &p, map_stack::const_iterator it ) { point l; submap *const current_submap = get_submap_at( p, l ); @@ -4139,34 +4138,12 @@ std::list::iterator map::i_rem( const tripoint &p, std::list::iterat return current_submap->itm[l.x][l.y].erase( it ); } -int map::i_rem( const tripoint &p, const int index ) -{ - if( index < 0 ) { - debugmsg( "i_rem called with negative index %d", index ); - return index; - } - - if( index >= static_cast( i_at( p ).size() ) ) { - return index; - } - - auto map_items = i_at( p ); - auto iter = map_items.begin(); - std::advance( iter, index ); - map_items.erase( iter ); - return index; -} - -void map::i_rem( const tripoint &p, const item *it ) +void map::i_rem( const tripoint &p, item *it ) { - auto map_items = i_at( p ); - - for( auto iter = map_items.begin(); iter != map_items.end(); iter++ ) { - //delete the item if the pointer memory addresses are the same - if( it == &*iter ) { - map_items.erase( iter ); - break; - } + map_stack map_items = i_at( p ); + map_stack::const_iterator iter = map_items.get_iterator_from_pointer( it ); + if( iter != map_items.end() ) { + i_rem( p, iter ); } } @@ -4380,12 +4357,7 @@ item &map::add_item( const tripoint &p, item new_item ) if( new_item.is_food() || new_item.has_temperature() ) { new_item.process( nullptr, p, false ); } - return add_item_at( p, current_submap->itm[l.x][l.y].end(), new_item ); -} -item &map::add_item_at( const tripoint &p, - std::list::iterator index, item new_item ) -{ if( new_item.made_of( LIQUID ) && has_flag( "SWIMMABLE", p ) ) { return null_item_reference(); } @@ -4398,16 +4370,14 @@ item &map::add_item_at( const tripoint &p, new_item.active = true; } - point l; - submap *const current_submap = get_submap_at( p, l ); - current_submap->is_uniform = false; - if( new_item.is_map() && !new_item.has_var( "reveal_map_center_omt" ) ) { new_item.set_var( "reveal_map_center_omt", ms_to_omt_copy( g->m.getabs( p ) ) ); } + current_submap->is_uniform = false; current_submap->update_lum_add( l, new_item ); - const auto new_pos = current_submap->itm[l.x][l.y].insert( index, new_item ); + + const map_stack::iterator new_pos = current_submap->itm[l.x][l.y].insert( new_item ); if( new_item.needs_processing() ) { if( current_submap->active_items.empty() ) { submaps_with_active_items.insert( abs_sub + tripoint( p.x / SEEX, p.y / SEEY, p.z ) ); @@ -4469,11 +4439,8 @@ void map::make_active( item_location &loc ) } point l; submap *const current_submap = get_submap_at( loc.position(), l ); - auto &item_stack = current_submap->itm[l.x][l.y]; - auto iter = std::find_if( item_stack.begin(), item_stack.end(), - [&target]( const item & i ) { - return &i == target; - } ); + cata::colony &item_stack = current_submap->itm[l.x][l.y]; + cata::colony::iterator iter = item_stack.get_iterator_from_pointer( target ); if( current_submap->active_items.empty() ) { submaps_with_active_items.insert( abs_sub + tripoint( loc.position().x / SEEX, @@ -4501,49 +4468,34 @@ void map::update_lum( item_location &loc, bool add ) } } -// This is an ugly and dirty hack to prevent invalidating the item_location -// references the player is using for an activity. What needs to happen is -// activity targets gets refactored in some way that it can reference items -// between turns that doesn't rely on a pointer to the item. A really nice -// solution would be something like UUIDs but that requires special -// considerations. -static bool item_is_in_activity( const item *it ) -{ - const auto targs = &g->u.activity.targets; - return !targs->empty() && - std::find_if( targs->begin(), targs->end(), [it]( const item_location & it_loc ) { - return it_loc.get_item() == it; - } ) != targs->end(); -} - -static bool process_item( item_stack &items, std::list::iterator &n, const tripoint &location, +static bool process_item( item_stack &items, item_stack::iterator &n, const tripoint &location, const bool activate, const float insulation, const temperature_flag flag ) { - if( !item_is_in_activity( &*n ) ) { - // make a temporary copy, remove the item (in advance) - // and use that copy to process it - item temp_item = *n; - auto insertion_point = items.erase( n ); - if( !temp_item.process( nullptr, location, activate, insulation, flag ) ) { - // Not destroyed, must be inserted again. - // If the item lost its active flag in processing, - // it won't be re-added to the active list, tidy! - // Re-insert at the item's previous position. - // This assumes that the item didn't invalidate any iterators - // As a result of activation, because everything that does that - // destroys itself. - items.insert_at( insertion_point, temp_item ); - return false; + // Process the item out of the map in case it destroys other items + // (for example because it is a grenade) since it might destroy itself + // and that would be bad. + item temp; + std::swap( temp, *n ); + + // Store a pointer to the target item so we can check if processing destroyed it. + item *const target = &*n; + + if( temp.process( nullptr, location, activate, insulation, flag ) ) { + // Item is to be destroyed so erase the null item in the map stack + // unless it was already destroyed by processing. + item_stack::iterator it = items.get_iterator_from_pointer( target ); + if( it != items.end() ) { + items.erase( it ); } return true; - } else if( n->process( nullptr, location, activate, insulation, flag ) ) { - items.erase( n ); - return true; + } else { + // Item survived processing so replace it in the map stack + *n = std::move( temp ); + return false; } - return false; } -static bool process_map_items( item_stack &items, std::list::iterator &n, +static bool process_map_items( item_stack &items, item_stack::iterator &n, const tripoint &location, const std::string &, const float insulation, const temperature_flag flag ) { @@ -4704,7 +4656,7 @@ void map::process_items_in_vehicle( vehicle &cur_veh, submap ¤t_submap, co if( it == end( cargo_parts ) ) { continue; // Can't find a cargo part matching the active item. } - auto &item_iter = active_item.item_iterator; + item_stack::iterator &item_iter = active_item.item_iterator; // Find the cargo part and coordinates corresponding to the current active item. const vehicle_part &pt = it->part(); const tripoint item_loc = it->pos(); @@ -5134,7 +5086,7 @@ std::list > map::get_rc_items( int x, int y, int z ) return rc_pairs; } -static bool trigger_radio_item( item_stack &items, std::list::iterator &n, +static bool trigger_radio_item( item_stack &items, item_stack::iterator &n, const tripoint &pos, const std::string &signal, const float, const temperature_flag flag ) { @@ -5180,28 +5132,6 @@ void map::trigger_rc_items( const std::string &signal ) process_items( false, trigger_radio_item, signal ); } -item *map::item_from( const tripoint &pos, size_t index ) -{ - auto items = i_at( pos ); - - if( index >= items.size() ) { - return nullptr; - } else { - return &items[index]; - } -} - -item *map::item_from( vehicle *veh, int cargo_part, size_t index ) -{ - auto items = veh->get_items( cargo_part ); - - if( index >= items.size() ) { - return nullptr; - } else { - return &items[index]; - } -} - const trap &map::tr_at( const tripoint &p ) const { if( !inbounds( p ) ) { @@ -5294,7 +5224,7 @@ void map::disarm_trap( const tripoint &p ) // 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( _( "You take down the %s." ), tr.name() ); + add_msg( _( "The %s is taken down." ), tr.name() ); tr.on_disarmed( *this, p ); return; } @@ -5399,9 +5329,9 @@ time_duration map::adjust_field_age( const tripoint &p, const field_id type, return set_field_age( p, type, offset, true ); } -int map::adjust_field_strength( const tripoint &p, const field_id type, const int offset ) +int map::adjust_field_intensity( const tripoint &p, const field_id type, const int offset ) { - return set_field_strength( p, type, offset, true ); + return set_field_intensity( p, type, offset, true ); } time_duration map::set_field_age( const tripoint &p, const field_id type, const time_duration &age, @@ -5417,13 +5347,13 @@ time_duration map::set_field_age( const tripoint &p, const field_id type, const * set strength of field type at point, creating if not present, removing if strength is 0 * returns resulting strength, or 0 for not present */ -int map::set_field_strength( const tripoint &p, const field_id type, const int str, bool isoffset ) +int map::set_field_intensity( const tripoint &p, const field_id type, const int str, bool isoffset ) { field_entry *field_ptr = get_field( p, type ); if( field_ptr != nullptr ) { int adj = ( isoffset ? field_ptr->get_field_intensity() : 0 ) + str; if( adj > 0 ) { - field_ptr->set_field_density( adj ); + field_ptr->set_field_intensity( adj ); return adj; } else { remove_field( p, type ); @@ -5442,7 +5372,7 @@ time_duration map::get_field_age( const tripoint &p, const field_id type ) const return field_ptr == nullptr ? -1_turns : field_ptr->get_field_age(); } -int map::get_field_strength( const tripoint &p, const field_id type ) const +int map::get_field_intensity( const tripoint &p, const field_id type ) const { auto field_ptr = field_at( p ).find_field( type ); return ( field_ptr == nullptr ? 0 : field_ptr->get_field_intensity() ); @@ -5460,14 +5390,15 @@ field_entry *map::get_field( const tripoint &p, const field_id type ) return current_submap->fld[l.x][l.y].find_field( type ); } -bool map::add_field( const tripoint &p, const field_id type, int density, const time_duration &age ) +bool map::add_field( const tripoint &p, const field_id type, int intensity, + const time_duration &age ) { if( !inbounds( p ) ) { return false; } - density = std::min( density, MAX_FIELD_DENSITY ); - if( density <= 0 ) { + intensity = std::min( intensity, MAX_FIELD_INTENSITY ); + if( intensity <= 0 ) { return false; } @@ -5479,9 +5410,12 @@ bool map::add_field( const tripoint &p, const field_id type, int density, const submap *const current_submap = get_submap_at( p, l ); current_submap->is_uniform = false; - if( current_submap->fld[l.x][l.y].add_field( type, density, age ) ) { + if( current_submap->fld[l.x][l.y].add_field( type, intensity, age ) ) { //Only adding it to the count if it doesn't exist. - current_submap->field_count++; + if( ! current_submap->field_count++ ) { + get_cache( p.z ).field_cache.set( static_cast( p.x / SEEX + ( ( + p.y / SEEX ) * MAPSIZE ) ) ); + } } if( g != nullptr && this == &g->m && p == g->u.pos() ) { @@ -5516,7 +5450,10 @@ void map::remove_field( const tripoint &p, const field_id field_to_remove ) if( current_submap->fld[l.x][l.y].remove_field( field_to_remove ) ) { // Only adjust the count if the field actually existed. - current_submap->field_count--; + if( ! --current_submap->field_count ) { + get_cache( p.z ).field_cache.reset( static_cast( p.x / SEEX + ( ( + p.y / SEEX ) * MAPSIZE ) ) ); + } const auto &fdata = all_field_types_enum_list[ field_to_remove ]; for( bool i : fdata.transparent ) { if( !i ) { @@ -5550,7 +5487,7 @@ void map::add_splatter( const field_id type, const tripoint &where, int intensit } } } - adjust_field_strength( where, type, intensity ); + adjust_field_intensity( where, type, intensity ); } void map::add_splatter_trail( const field_id type, const tripoint &from, const tripoint &to ) @@ -5570,14 +5507,14 @@ void map::add_splatter_trail( const field_id type, const tripoint &from, const t } } -void map::add_splash( const field_id type, const tripoint ¢er, int radius, int density ) +void map::add_splash( const field_id type, const tripoint ¢er, int radius, int intensity ) { if( type == fd_null ) { return; } // TODO: use Bresenham here and take obstacles into account for( const tripoint &pnt : points_in_radius( center, radius ) ) { - if( trig_dist( pnt, center ) <= radius && !one_in( density ) ) { + if( trig_dist( pnt, center ) <= radius && !one_in( intensity ) ) { add_splatter( type, pnt ); } } @@ -6548,31 +6485,36 @@ void map::shift_traps( const tripoint &shift ) } } -void shift_map_memory_seen_cache( - std::bitset &map_memory_seen_cache, - const int sx, const int sy ) +template +void shift_bitset_cache( std::bitset &cache, const int sx, const int sy ) { - // sx shifts by SEEX rows, sy shifts by SEEX columns. - int shift_amount = ( sx * SEEX ) + ( sy * MAPSIZE_Y * SEEX ); + // sx shifts by MULTIPLIER rows, sy shifts by MULTIPLIER columns. + int shift_amount = ( sx * MULTIPLIER ) + ( sy * SIZE * MULTIPLIER ); if( shift_amount > 0 ) { - map_memory_seen_cache >>= static_cast( shift_amount ); + cache >>= static_cast( shift_amount ); } else if( shift_amount < 0 ) { - map_memory_seen_cache <<= static_cast( -shift_amount ); + cache <<= static_cast( -shift_amount ); } // Shifting in the y direction shifted in 0 values, no no additional clearing is necessary, but // a shift in the x direction makes values "wrap" to the next row, and they need to be zeroed. if( sx == 0 ) { return; } - const size_t x_offset = ( sx > 0 ) ? MAPSIZE_X - SEEX : 0; - for( size_t y = 0; y < MAPSIZE_X; ++y ) { - size_t y_offset = y * MAPSIZE_X; - for( size_t x = 0; x < SEEX; ++x ) { - map_memory_seen_cache.reset( y_offset + x_offset + x ); + const size_t x_offset = ( sx > 0 ) ? SIZE - MULTIPLIER : 0; + for( size_t y = 0; y < SIZE; ++y ) { + size_t y_offset = y * SIZE; + for( size_t x = 0; x < MULTIPLIER; ++x ) { + cache.reset( y_offset + x_offset + x ); } } } +template void +shift_bitset_cache( std::bitset &cache, + const int sx, const int sy ); +template void +shift_bitset_cache( std::bitset &cache, const int sx, const int sy ); + void map::shift( const int sx, const int sy ) { // Special case of 0-shift; refresh the map @@ -6610,7 +6552,8 @@ void map::shift( const int sx, const int sy ) // Clear vehicle list and rebuild after shift clear_vehicle_cache( gridz ); clear_vehicle_list( gridz ); - shift_map_memory_seen_cache( get_cache( gridz ).map_memory_seen_cache, sx, sy ); + shift_bitset_cache( get_cache( gridz ).map_memory_seen_cache, sx, sy ); + shift_bitset_cache( get_cache( gridz ).field_cache, sx, sy ); if( sx >= 0 ) { for( int gridx = 0; gridx < my_MAPSIZE; gridx++ ) { if( sy >= 0 ) { @@ -6851,6 +6794,9 @@ void map::loadn( const int gridx, const int gridy, const int gridz, const bool u if( !tmpsub->active_items.empty() ) { submaps_with_active_items.emplace( absx, absy, gridz ); } + if( tmpsub->field_count > 0 ) { + get_cache( gridz ).field_cache.set( gridx + ( gridy * MAPSIZE ) ); + } // Destroy bugged no-part vehicles auto &veh_vec = tmpsub->vehicles; for( auto iter = veh_vec.begin(); iter != veh_vec.end(); ) { @@ -6993,55 +6939,69 @@ void map::grow_plant( const tripoint &p ) if( !furn.has_flag( "PLANT" ) ) { return; } - auto items = i_at( p ); - if( items.empty() ) { - // No seed there anymore, we don't know what kind of plant it was. - dbg( D_ERROR ) << "a seed item has vanished at " << p.x << "," << p.y << "," << p.z; - furn_set( p, f_null ); - return; - } + // Can't use item_stack::only_item() since there might be fertilizer + map_stack items = i_at( p ); + map_stack::iterator seed = std::find_if( items.begin(), items.end(), []( const item &it ) { + return it.is_seed(); + } ); - auto seed = items.front(); - if( !seed.is_seed() ) { + if( seed == items.end() ) { // No seed there anymore, we don't know what kind of plant it was. dbg( D_ERROR ) << "a planted item at " << p.x << "," << p.y << "," << p.z << " has no seed data"; + i_clear( p ); furn_set( p, f_null ); return; } - const time_duration plantEpoch = seed.get_plant_epoch(); - if( seed.age() >= plantEpoch * furn.plant->growth_multiplier && + const time_duration plantEpoch = seed->get_plant_epoch(); + if( seed->age() >= plantEpoch * furn.plant->growth_multiplier && !furn.has_flag( "GROWTH_HARVEST" ) ) { - if( seed.age() < plantEpoch * 2 ) { + if( seed->age() < plantEpoch * 2 ) { if( has_flag_furn( "GROWTH_SEEDLING", p ) ) { return; } - i_rem( p, 1 ); - rotten_item_spawn( seed, p ); + + // Remove fertilizer if any + map_stack::iterator fertilizer = std::find_if( items.begin(), items.end(), []( const item &it ) { + return it.has_flag( "FERTILIZER" ); + } ); + if( fertilizer != items.end() ) { + items.erase( fertilizer ); + } + + rotten_item_spawn( *seed, p ); furn_set( p, furn_str_id( furn.plant->transform ) ); - } else if( seed.age() < plantEpoch * 3 * furn.plant->growth_multiplier ) { + } else if( seed->age() < plantEpoch * 3 * furn.plant->growth_multiplier ) { if( has_flag_furn( "GROWTH_MATURE", p ) ) { return; } - i_rem( p, 1 ); - rotten_item_spawn( seed, p ); + + // Remove fertilizer if any + map_stack::iterator fertilizer = std::find_if( items.begin(), items.end(), []( const item &it ) { + return it.has_flag( "FERTILIZER" ); + } ); + if( fertilizer != items.end() ) { + items.erase( fertilizer ); + } + + rotten_item_spawn( *seed, p ); //You've skipped the seedling stage so roll monsters twice if( !has_flag_furn( "GROWTH_SEEDLING", p ) ) { - rotten_item_spawn( seed, p ); + rotten_item_spawn( *seed, p ); } furn_set( p, furn_str_id( furn.plant->transform ) ); } else { //You've skipped two stages so roll monsters two times if( has_flag_furn( "GROWTH_SEEDLING", p ) ) { - rotten_item_spawn( seed, p ); - rotten_item_spawn( seed, p ); + rotten_item_spawn( *seed, p ); + rotten_item_spawn( *seed, p ); //One stage change } else if( has_flag_furn( "GROWTH_MATURE", p ) ) { - rotten_item_spawn( seed, p ); + rotten_item_spawn( *seed, p ); //Goes from seed to harvest in one check } else { - rotten_item_spawn( seed, p ); - rotten_item_spawn( seed, p ); - rotten_item_spawn( seed, p ); + rotten_item_spawn( *seed, p ); + rotten_item_spawn( *seed, p ); + rotten_item_spawn( *seed, p ); } furn_set( p, furn_str_id( furn.plant->transform ) ); } @@ -7216,10 +7176,10 @@ void map::decay_cosmetic_fields( const tripoint &p, const time_duration &time_si const time_duration added_age = 2 * time_since_last_actualize / rng( 2, 4 ); fd.mod_age( added_age ); const time_duration hl = all_field_types_enum_list[ fd.get_field_type() ].halflife; - const int density_drop = fd.get_field_age() / hl; - if( density_drop > 0 ) { - fd.set_field_density( fd.get_field_intensity() - density_drop ); - fd.mod_age( -hl * density_drop ); + const int intensity_drop = fd.get_field_age() / hl; + if( intensity_drop > 0 ) { + fd.set_field_intensity( fd.get_field_intensity() - intensity_drop ); + fd.mod_age( -hl * intensity_drop ); } } } @@ -7271,13 +7231,6 @@ void map::actualize( const int gridx, const int gridy, const int gridz ) } } - //Check for Merchants to restock - for( npc &guy : g->all_npcs() ) { - if( guy.restock != calendar::before_time_starts && calendar::turn > guy.restock ) { - guy.shop_restock(); - } - } - // the last time we touched the submap, is right now. tmpsub->last_touched = calendar::turn; } @@ -7590,6 +7543,42 @@ bool tinymap::inbounds( const tripoint &p ) const return generic_inbounds( p, map_boundaries, map_clearance ); } +// set up a map just long enough scribble on it +// this tinymap should never, ever get saved +bool tinymap::fake_load( const furn_id &fur_type, const ter_id &ter_type, const trap_id &trap_type ) +{ + bool do_terset = true; + set_abs_sub( 0, 0, 0 ); + for( int gridx = 0; gridx < my_MAPSIZE; gridx++ ) { + for( int gridy = 0; gridy < my_MAPSIZE; gridy++ ) { + submap *tmpsub = MAPBUFFER.lookup_submap( gridx, gridy, 0 ); + if( tmpsub == nullptr ) { + generate_uniform( gridx, gridy, 0, ter_type ); + do_terset = false; + tmpsub = MAPBUFFER.lookup_submap( gridx, gridy, 0 ); + if( tmpsub == nullptr ) { + dbg( D_ERROR ) << "failed to generate a fake submap at 0, 0, 0 "; + debugmsg( "failed to generate a fake submap at 0,0,0" ); + return false; + } + } + const size_t gridn = get_nonant( { gridx, gridy, 0 } ); + + setsubmap( gridn, tmpsub ); + } + } + + for( const tripoint &pos : points_in_rectangle( { 0, 0, 0 }, + tripoint( MAPSIZE * SEEX, MAPSIZE * SEEY, 0 ) ) ) { + if( do_terset ) { + ter_set( pos, ter_type ); + } + furn_set( pos, fur_type ); + trap_set( pos, trap_type ); + } + return true; +} + void map::set_graffiti( const tripoint &p, const std::string &contents ) { if( !inbounds( p ) ) { @@ -8568,8 +8557,8 @@ void map::update_pathfinding_cache( int zlev ) const for( const auto &fld : tile.get_field() ) { const field_entry &cur = fld.second; const field_id type = cur.get_field_type(); - const int density = cur.get_field_intensity(); - if( all_field_types_enum_list[type].dangerous[density - 1] ) { + const int intensity = cur.get_field_intensity(); + if( all_field_types_enum_list[type].dangerous[intensity - 1] ) { cur_value |= PF_FIELD; } } diff --git a/src/map.h b/src/map.h index 788a32ea2429f..dc5f64448a3a0 100644 --- a/src/map.h +++ b/src/map.h @@ -17,6 +17,7 @@ #include #include "calendar.h" +#include "colony.h" #include "enums.h" #include "game_constants.h" #include "item.h" @@ -96,11 +97,10 @@ class map_stack : public item_stack tripoint location; map *myorigin; public: - map_stack( std::list *newstack, tripoint newloc, map *neworigin ) : + map_stack( cata::colony *newstack, tripoint newloc, map *neworigin ) : item_stack( newstack ), location( newloc ), myorigin( neworigin ) {} - std::list::iterator erase( std::list::iterator it ) override; - void push_back( const item &newitem ) override; - void insert_at( std::list::iterator index, const item &newitem ) override; + void insert( const item &newitem ) override; + iterator erase( const_iterator it ) override; int count_limit() const override { return MAX_ITEM_IN_SQUARE; } @@ -163,6 +163,7 @@ struct level_cache { float camera_cache[MAPSIZE_X][MAPSIZE_Y]; lit_level visibility_cache[MAPSIZE_X][MAPSIZE_Y]; std::bitset map_memory_seen_cache; + std::bitset field_cache; bool veh_in_active_range; bool veh_exists_at[MAPSIZE_X][MAPSIZE_Y]; @@ -896,8 +897,7 @@ class map // Items: 2D map_stack i_at( int x, int y ); void i_clear( const int x, const int y ); - std::list::iterator i_rem( const point &location, std::list::iterator it ); - int i_rem( const int x, const int y, const int index ); + map_stack::iterator i_rem( const point &location, map_stack::const_iterator it ); void i_rem( const int x, const int y, item *it ); void spawn_item( const int x, const int y, const std::string &itype_id, const unsigned quantity = 1, const int charges = 0, @@ -921,9 +921,8 @@ class map void i_clear( const tripoint &p ); // i_rem() methods that return values act like container::erase(), // returning an iterator to the next item after removal. - std::list::iterator i_rem( const tripoint &p, std::list::iterator it ); - int i_rem( const tripoint &p, const int index ); - void i_rem( const tripoint &p, const item *it ); + map_stack::iterator i_rem( const tripoint &p, map_stack::const_iterator it ); + void i_rem( const tripoint &p, item *it ); void spawn_artifact( const tripoint &p ); void spawn_natural_artifact( const tripoint &p, const artifact_natural_property prop ); void spawn_item( const tripoint &p, const std::string &itype_id, @@ -943,8 +942,6 @@ class map */ item &add_item_or_charges( const tripoint &pos, item obj, bool overflow = true ); - /** Helper for map::add_item */ - item &add_item_at( const tripoint &p, std::list::iterator index, item new_item ); /** * Place an item on the map, despite the parameter name, this is not necessarily a new item. * WARNING: does -not- check volume or stack charges. player functions (drop etc) should use @@ -1026,15 +1023,6 @@ class map void create_anomaly( const tripoint &p, artifact_natural_property prop, bool create_rubble = true ); - /** - * Fetch an item from this map location, with sanity checks to ensure it still exists. - */ - item *item_from( const tripoint &pos, const size_t index ); - - /** - * Fetch an item from this vehicle, with sanity checks to ensure it still exists. - */ - item *item_from( vehicle *veh, const int cargo_part, const size_t index ); // Partial construction functions void partial_con_set( const tripoint &p, const partial_con &con ); void partial_con_remove( const tripoint &p ); @@ -1084,10 +1072,10 @@ class map */ time_duration get_field_age( const tripoint &p, const field_id type ) const; /** - * Get the density of a field entry (@ref field_entry::density), + * Get the intensity of a field entry (@ref field_entry::intensity), * if there is no field of that type, returns 0. */ - int get_field_strength( const tripoint &p, const field_id type ) const; + int get_field_intensity( const tripoint &p, const field_id type ) const; /** * Increment/decrement age of field entry at point. * @return resulting age or `-1_turns` if not present (does *not* create a new field). @@ -1095,11 +1083,11 @@ class map time_duration adjust_field_age( const tripoint &p, const field_id type, const time_duration &offset ); /** - * Increment/decrement density of field entry at point, creating if not present, - * removing if density becomes 0. - * @return resulting density, or 0 for not present (either removed or not created at all). + * Increment/decrement intensity of field entry at point, creating if not present, + * removing if intensity becomes 0. + * @return resulting intensity, or 0 for not present (either removed or not created at all). */ - int adjust_field_strength( const tripoint &p, const field_id type, const int offset ); + int adjust_field_intensity( const tripoint &p, const field_id type, const int offset ); /** * Set age of field entry at point. * @param p Location of field @@ -1112,27 +1100,27 @@ class map time_duration set_field_age( const tripoint &p, const field_id type, const time_duration &age, bool isoffset = false ); /** - * Set density of field entry at point, creating if not present, - * removing if density becomes 0. + * Set intensity of field entry at point, creating if not present, + * removing if intensity becomes 0. * @param p Location of field * @param type ID of field * @param str New strength of field * @param isoffset If true, the given str value is added to the existing value, - * if false, the existing density is ignored and overridden. - * @return resulting density, or 0 for not present (either removed or not created at all). + * if false, the existing intensity is ignored and overridden. + * @return resulting intensity, or 0 for not present (either removed or not created at all). */ - int set_field_strength( const tripoint &p, const field_id type, const int str, - bool isoffset = false ); + int set_field_intensity( const tripoint &p, const field_id type, const int str, + bool isoffset = false ); /** * Get field of specific type at point. * @return NULL if there is no such field entry at that place. */ field_entry *get_field( const tripoint &p, const field_id type ); /** - * Add field entry at point, or set density if present + * Add field entry at point, or set intensity if present * @return false if the field could not be created (out of bounds), otherwise true. */ - bool add_field( const tripoint &p, const field_id type, int density, + bool add_field( const tripoint &p, const field_id type, int intensity, const time_duration &age = 0_turns ); /** * Remove field entry at xy, ignored if the field entry is not present. @@ -1140,12 +1128,12 @@ class map void remove_field( const tripoint &p, const field_id field_to_remove ); // Splatters of various kind - void add_splatter( const field_id type, const tripoint &where, int density = 1 ); + void add_splatter( const field_id type, const tripoint &where, int intensity = 1 ); void add_splatter_trail( const field_id type, const tripoint &from, const tripoint &to ); void add_splash( const field_id type, const tripoint ¢er, int radius, int density ); void propagate_field( const tripoint ¢er, const field_id type, - int amount, int max_density = MAX_FIELD_DENSITY ); + int amount, int max_intensity = MAX_FIELD_INTENSITY ); /** * Runs one cycle of emission @ref src which **may** result in propagation of fields @@ -1524,6 +1512,7 @@ class map */ submap *get_submap_at_grid( const point &gridp ) const; submap *get_submap_at_grid( const tripoint &gridp ) const; + protected: /** * Get the index of a submap pointer in the grid given by grid coordinates. The grid * coordinates must be valid: 0 <= x < my_MAPSIZE, same for y. @@ -1537,7 +1526,7 @@ class map * The given submap pointer must not be null. */ void setsubmap( size_t grididx, submap *smap ); - + private: /** * Internal versions of public functions to avoid checking same variables multiple times. * They lack safety checks, because their callers already do those. @@ -1579,10 +1568,9 @@ class map void apply_light_arc( const tripoint &p, int angle, float luminance, int wideangle = 30 ); void apply_light_ray( bool lit[MAPSIZE_X][MAPSIZE_Y], const tripoint &s, const tripoint &e, float luminance ); - void add_light_from_items( const tripoint &p, std::list::iterator begin, - std::list::iterator end ); - std::unique_ptr add_vehicle_to_map( std::unique_ptr veh, - bool merge_wrecks ); + void add_light_from_items( const tripoint &p, item_stack::iterator begin, + item_stack::iterator end ); + std::unique_ptr add_vehicle_to_map( std::unique_ptr veh, bool merge_wrecks ); // Internal methods used to bash just the selected features // Information on what to bash/what was bashed is read from/written to the bash_params struct @@ -1605,7 +1593,7 @@ class map * It's a really heinous function pointer so a typedef is the best * solution in this instance. */ - using map_process_func = bool ( * )( item_stack &, std::list::iterator &, const tripoint &, + using map_process_func = bool ( * )( item_stack &, item_stack::iterator &, const tripoint &, const std::string &, float, temperature_flag ); private: @@ -1705,9 +1693,8 @@ class map bool need_draw_lower_floor( const tripoint &p ); }; -void shift_map_memory_seen_cache( - std::bitset &map_memory_seen_cache, - const int sx, const int sy ); +template +void shift_bitset_cache( std::bitset &cache, const int sx, const int sy ); std::vector closest_points_first( int radius, point p ); std::vector closest_points_first( int radius, int x, int y ); @@ -1720,6 +1707,7 @@ class tinymap : public map public: tinymap( int mapsize = 2, bool zlevels = false ); bool inbounds( const tripoint &p ) const override; + bool fake_load( const furn_id &fur_type, const ter_id &ter_type, const trap_id &trap_type ); }; #endif diff --git a/src/map_extras.cpp b/src/map_extras.cpp index b8ebb3693736f..cebfbc7be4219 100644 --- a/src/map_extras.cpp +++ b/src/map_extras.cpp @@ -15,6 +15,7 @@ #include "field.h" #include "fungal_effects.h" #include "game.h" +#include "generic_factory.h" #include "map.h" #include "map_iterator.h" #include "mapdata.h" @@ -41,9 +42,25 @@ #include "vpart_reference.h" #include "type_id.h" #include "messages.h" +#include "coordinate_conversions.h" +#include "options.h" class npc_template; +namespace +{ + +generic_factory extras( "map extra" ); + +} // namespace + +/** @relates string_id */ +template<> +const map_extra &string_id::obj() const +{ + return extras.obj( *this ); +} + namespace MapExtras { @@ -72,6 +89,7 @@ static const mtype_id mon_spider_widow_giant( "mon_spider_widow_giant" ); static const mtype_id mon_spider_cellar_giant( "mon_spider_cellar_giant" ); static const mtype_id mon_wasp( "mon_wasp" ); static const mtype_id mon_jabberwock( "mon_jabberwock" ); +static const mtype_id mon_wolf( "mon_wolf" ); static void mx_null( map &, const tripoint & ) { @@ -564,7 +582,6 @@ static void mx_marloss_pilgrimage( map &m, const tripoint &abs_sub ) where.y ) : m.add_spawn( mon_marloss_zealot_m, 1, where.x, where.y ); } } - } static void mx_bandits_block( map &m, const tripoint &abs_sub ) @@ -574,10 +591,10 @@ static void mx_bandits_block( map &m, const tripoint &abs_sub ) const oter_id &west = overmap_buffer.ter( abs_sub.x - 1, abs_sub.y, abs_sub.z ); const oter_id &east = overmap_buffer.ter( abs_sub.x + 1, abs_sub.y, abs_sub.z ); - const bool forest_at_north = is_ot_type( "forest", north ); - const bool forest_at_south = is_ot_type( "forest", south ); - const bool forest_at_west = is_ot_type( "forest", west ); - const bool forest_at_east = is_ot_type( "forest", east ); + const bool forest_at_north = is_ot_prefix( "forest", north ); + const bool forest_at_south = is_ot_prefix( "forest", south ); + const bool forest_at_west = is_ot_prefix( "forest", west ); + const bool forest_at_east = is_ot_prefix( "forest", east ); const bool road_at_north = is_ot_type( "road", north ); const bool road_at_south = is_ot_type( "road", south ); @@ -2182,25 +2199,115 @@ static void mx_roadworks( map &m, const tripoint &abs_sub ) } } +static void mx_mayhem( map &m, const tripoint &abs_sub ) +{ + switch( rng( 1, 3 ) ) { + //Car accident resulted in a shootout with two victims + case 1: { + m.add_vehicle( vproto_id( "car" ), 18, 9, 270 ); + m.add_vehicle( vproto_id( "4x4_car" ), 20, 5, 0 ); + + m.spawn_item( { 16, 10, abs_sub.z }, "shot_hull" ); + m.add_corpse( { 16, 9, abs_sub.z } ); + m.add_field( { 16, 9, abs_sub.z }, fd_blood, rng( 1, 3 ) ); + + for( const auto &loc : g->m.points_in_radius( { 16, 3, abs_sub.z }, 1 ) ) { + if( one_in( 2 ) ) { + m.spawn_item( loc, "9mm_casing" ); + } + } + + m.add_splatter_trail( fd_blood, { 16, 3, abs_sub.z }, { 23, 1, abs_sub.z } ); + m.add_corpse( { 23, 1, abs_sub.z } ); + break; + } + //Some cocky moron with friends got dragged out of limo and shooted down by a military + case 2: { + m.add_vehicle( vproto_id( "limousine" ), 18, 9, 270 ); + + m.add_corpse( { 16, 9, abs_sub.z } ); + m.add_corpse( { 16, 11, abs_sub.z } ); + m.add_corpse( { 16, 12, abs_sub.z } ); + + m.add_splatter_trail( fd_blood, { 16, 8, abs_sub.z }, { 16, 12, abs_sub.z } ); + + for( const auto &loc : g->m.points_in_radius( { 12, 11, abs_sub.z }, 2 ) ) { + if( one_in( 3 ) ) { + m.spawn_item( loc, "223_casing" ); + } + } + break; + } + //Some unfortunate stopped at the roadside to change tire, but was ambushed and killed + case 3: { + m.add_vehicle( vproto_id( "car" ), 18, 12, 270 ); + + m.add_field( { 16, 15, abs_sub.z }, fd_blood, rng( 1, 3 ) ); + + m.spawn_item( { 16, 16, abs_sub.z }, "wheel", 1, 0, calendar::time_of_cataclysm, 4 ); + m.spawn_item( { 16, 16, abs_sub.z }, "wrench" ); + + if( one_in( 2 ) ) { //Unknown people killed and robbed the poor guy + item body = item::make_corpse(); + m.put_items_from_loc( "default_zombie_clothes", { 16, 15, abs_sub.z } ); + m.add_item_or_charges( { 16, 15, abs_sub.z }, body ); + m.spawn_item( { 21, 15, abs_sub.z }, "shot_hull" ); + } else { //Wolves charged to the poor guy... + m.add_corpse( { 16, 15, abs_sub.z } ); + m.add_splatter_trail( fd_gibs_flesh, { 16, 13, abs_sub.z }, { 16, 16, abs_sub.z } ); + m.add_field( { 15, 15, abs_sub.z }, fd_gibs_flesh, rng( 1, 3 ) ); + + for( const auto &loc : g->m.points_in_radius( { 16, 15, abs_sub.z }, 1 ) ) { + if( one_in( 2 ) ) { + m.spawn_item( loc, "9mm_casing" ); + } + } + + const int max_wolves = rng( 1, 3 ); + item body = item::make_corpse( mon_wolf ); + if( one_in( 2 ) ) { //...from the north + for( int i = 0; i < max_wolves; i++ ) { + const auto &loc = g->m.points_in_radius( { 12, 12, abs_sub.z }, 3 ); + const tripoint where = random_entry( loc ); + m.add_item_or_charges( where, body ); + m.add_field( where, fd_blood, rng( 1, 3 ) ); + } + } else { //...from the south + for( int i = 0; i < max_wolves; i++ ) { + const auto &loc = g->m.points_in_radius( { 12, 18, abs_sub.z }, 3 ); + const tripoint where = random_entry( loc ); + m.add_item_or_charges( where, body ); + m.add_field( where, fd_blood, rng( 1, 3 ) ); + } + } + } + break; + } + } +} + FunctionMap builtin_functions = { { "mx_null", mx_null }, - { "mx_house_wasp", mx_house_wasp }, - { "mx_house_spider", mx_house_spider }, - { "mx_helicopter", mx_helicopter }, - { "mx_military", mx_military }, - { "mx_science", mx_science }, + { "mx_crater", mx_crater }, + { "mx_fumarole", mx_fumarole }, { "mx_collegekids", mx_collegekids }, - { "mx_roadblock", mx_roadblock }, { "mx_drugdeal", mx_drugdeal }, + { "mx_roadworks", mx_roadworks }, + { "mx_mayhem", mx_mayhem }, + { "mx_roadblock", mx_roadblock }, + { "mx_bandits_block", mx_bandits_block }, + { "mx_minefield", mx_minefield }, { "mx_supplydrop", mx_supplydrop }, + { "mx_military", mx_military }, + { "mx_helicopter", mx_helicopter }, + { "mx_science", mx_science }, { "mx_portal", mx_portal }, - { "mx_minefield", mx_minefield }, - { "mx_crater", mx_crater }, - { "mx_fumarole", mx_fumarole }, { "mx_portal_in", mx_portal_in }, { "mx_anomaly", mx_anomaly }, - { "mx_shia", mx_shia }, + { "mx_house_spider", mx_house_spider }, + { "mx_house_wasp", mx_house_wasp }, { "mx_spider", mx_spider }, + { "mx_shia", mx_shia }, { "mx_jabberwock", mx_jabberwock }, { "mx_grove", mx_grove }, { "mx_shrubbery", mx_shrubbery }, @@ -2211,24 +2318,65 @@ FunctionMap builtin_functions = { { "mx_point_dead_vegetation", mx_point_dead_vegetation }, { "mx_burned_ground", mx_burned_ground }, { "mx_point_burned_ground", mx_point_burned_ground }, - { "mx_bandits_block", mx_bandits_block }, - { "mx_roadworks", mx_roadworks }, { "mx_marloss_pilgrimage", mx_marloss_pilgrimage }, }; -map_special_pointer get_function( const std::string &name ) +map_extra_pointer get_function( const std::string &name ) { const auto iter = builtin_functions.find( name ); if( iter == builtin_functions.end() ) { - debugmsg( "no map special with name %s", name ); + debugmsg( "no map extra function with name %s", name ); return nullptr; } return iter->second; } +void apply_function( const string_id &id, map &m, const tripoint &abs_sub ) +{ + const map_extra &extra = id.obj(); + const map_extra_pointer mx_func = extra.function_pointer; + const std::string mx_note = + string_format( "%s:%s;%s: %s", + extra.get_symbol(), + get_note_string_from_color( extra.color ), + extra.name, + extra.description ); + if( mx_func != nullptr ) { + mx_func( m, abs_sub ); + overmap_buffer.add_extra( sm_to_omt_copy( abs_sub ), id ); + if( get_option( "AUTO_NOTES" ) && get_option( "AUTO_NOTES_MAP_EXTRAS" ) && + !mx_note.empty() ) { + overmap_buffer.add_note( sm_to_omt_copy( abs_sub ), mx_note ); + } + } +} +void apply_function( const std::string &id, map &m, const tripoint &abs_sub ) +{ + apply_function( string_id( id ), m, abs_sub ); +} + FunctionMap all_functions() { return builtin_functions; } +void load( JsonObject &jo, const std::string &src ) +{ + extras.load( jo, src ); +} + +} // namespace MapExtras + +void map_extra::load( JsonObject &jo, const std::string & ) +{ + mandatory( jo, was_loaded, "name", name ); + mandatory( jo, was_loaded, "description", description ); + mandatory( jo, was_loaded, "function", function ); + function_pointer = MapExtras::get_function( function ); + if( function_pointer == nullptr ) { + debugmsg( "invalid map extra function (%s) defined for map extra (%s)", function, id.str() ); + } + optional( jo, was_loaded, "sym", symbol, unicode_codepoint_from_symbol_reader, NULL_UNICODE ); + color = jo.has_member( "color" ) ? color_from_string( jo.get_string( "color" ) ) : c_white; + optional( jo, was_loaded, "autonote", autonote, false ); } diff --git a/src/map_extras.h b/src/map_extras.h index 590fe4b8c4057..6404db51f2fe1 100644 --- a/src/map_extras.h +++ b/src/map_extras.h @@ -6,12 +6,41 @@ #include "mapgen.h" +using map_extra_pointer = void( * )( map &, const tripoint & ); + +class map_extra +{ + public: + string_id id = string_id::NULL_ID(); + std::string name; + std::string description; + std::string function; + map_extra_pointer function_pointer; + bool autonote = false; + uint32_t symbol = UTF8_getch( "X" ); + nc_color color = c_red; + + std::string get_symbol() const { + return utf32_to_utf8( symbol ); + } + + // Used by generic_factory + bool was_loaded = false; + void load( JsonObject &jo, const std::string &src ); +}; + namespace MapExtras { -using FunctionMap = std::unordered_map; +using FunctionMap = std::unordered_map; -map_special_pointer get_function( const std::string &name ); +map_extra_pointer get_function( const std::string &name ); FunctionMap all_functions(); -} + +void apply_function( const string_id &id, map &m, const tripoint &abs_sub ); +void apply_function( const std::string &id, map &m, const tripoint &abs_sub ); + +void load( JsonObject &jo, const std::string &src ); + +} // namespace MapExtras #endif diff --git a/src/map_field.cpp b/src/map_field.cpp index 2726b6aec3c5f..eb684d87364fd 100644 --- a/src/map_field.cpp +++ b/src/map_field.cpp @@ -107,10 +107,11 @@ bool map::process_fields() const int maxz = zlevels ? OVERMAP_HEIGHT : abs_sub.z; for( int z = minz; z <= maxz; z++ ) { bool zlev_dirty = false; + auto &field_cache = get_cache( z ).field_cache; for( int x = 0; x < my_MAPSIZE; x++ ) { for( int y = 0; y < my_MAPSIZE; y++ ) { - submap *const current_submap = get_submap_at_grid( { x, y, z } ); - if( current_submap->field_count > 0 ) { + if( field_cache[ x + ( y * MAPSIZE ) ] ) { + submap *const current_submap = get_submap_at_grid( { x, y, z } ); const bool cur_dirty = process_fields_in_submap( current_submap, x, y, z ); zlev_dirty |= cur_dirty; } @@ -202,15 +203,15 @@ bool map::process_fields_in_submap( submap *const current_submap, g->scent.set( tmp, 0 ); } - const int current_density = cur.get_field_intensity(); + const int current_intensity = cur.get_field_intensity(); const time_duration current_age = cur.get_field_age(); // Dissipate faster outdoors. if( is_outside( p ) ) { cur.set_field_age( current_age + outdoor_age_speedup ); } - // Bail out if we don't meet the spread chance or required density. - if( current_density <= 1 || rng( 1, ( 100 - windpower ) ) > percent_spread ) { + // Bail out if we don't meet the spread chance or required intensity. + if( current_intensity <= 1 || rng( 1, ( 100 - windpower ) ) > percent_spread ) { return; } @@ -226,16 +227,16 @@ bool map::process_fields_in_submap( submap *const current_submap, const auto spread_to = [&]( maptile & dst ) { field_entry *candidate_field = dst.find_field( curtype ); // Nearby gas grows thicker, and ages are shared. - const time_duration age_fraction = current_age / current_density ; + const time_duration age_fraction = current_age / current_intensity ; if( candidate_field != nullptr ) { - candidate_field->set_field_density( candidate_field->get_field_intensity() + 1 ); - cur.set_field_density( current_density - 1 ); + candidate_field->set_field_intensity( candidate_field->get_field_intensity() + 1 ); + cur.set_field_intensity( current_intensity - 1 ); candidate_field->set_field_age( candidate_field->get_field_age() + age_fraction ); cur.set_field_age( current_age - age_fraction ); // Or, just create a new field. } else if( dst.add_field( curtype, 1, 0_turns ) ) { dst.find_field( curtype )->set_field_age( age_fraction ); - cur.set_field_density( current_density - 1 ); + cur.set_field_intensity( current_intensity - 1 ); cur.set_field_age( current_age - age_fraction ); } }; @@ -308,9 +309,9 @@ bool map::process_fields_in_submap( submap *const current_submap, Function: create_hot_air Helper function that encapsulates the logic involved in creating hot air. */ - const auto create_hot_air = [this]( const tripoint & p, int density ) { + const auto create_hot_air = [this]( const tripoint & p, int intensity ) { field_id hot_air; - switch( density ) { + switch( intensity ) { case 1: hot_air = fd_hot_air1; break; @@ -324,7 +325,7 @@ bool map::process_fields_in_submap( submap *const current_submap, hot_air = fd_hot_air4; break; default: - debugmsg( "Tried to spread hot air with density %d", density ); + debugmsg( "Tried to spread hot air with intensity %d", intensity ); return; } @@ -369,16 +370,16 @@ bool map::process_fields_in_submap( submap *const current_submap, if( !all_field_types_enum_list[cur.get_field_type()].transparent[cur.get_field_intensity() - 1] ) { dirty_transparency_cache = true; } - current_submap->field_count--; + --current_submap->field_count; curfield.remove_field( it++ ); continue; } //Holds cur.get_field_type() as that is what the old system used before rewrite. field_id curtype = cur.get_field_type(); - // Again, legacy support in the event someone Mods set_field_density to allow more values. + // Again, legacy support in the event someone Mods set_field_intensity to allow more values. if( cur.get_field_intensity() > 3 || cur.get_field_intensity() < 1 ) { - debugmsg( "Whoooooa density of %d", cur.get_field_intensity() ); + debugmsg( "Whoooooa intensity of %d", cur.get_field_intensity() ); } // Don't process "newborn" fields. This gives the player time to run if they need to. @@ -428,20 +429,20 @@ bool map::process_fields_in_submap( submap *const current_submap, // Math can be a bit off, // but "boiling" falling acid can be allowed to be stronger // than acid that just lies there - const int sum_density = cur.get_field_intensity() + acid_there->get_field_intensity(); - const int new_density = std::min( 3, sum_density ); + const int sum_intensity = cur.get_field_intensity() + acid_there->get_field_intensity(); + const int new_intensity = std::min( 3, sum_intensity ); // No way to get precise elapsed time, let's always reset // Allow falling acid to last longer than regular acid to show it off - const time_duration new_age = -1_minutes * ( sum_density - new_density ); - acid_there->set_field_density( new_density ); + const time_duration new_age = -1_minutes * ( sum_intensity - new_intensity ); + acid_there->set_field_intensity( new_intensity ); acid_there->set_field_age( new_age ); } // Set ourselves up for removal - cur.set_field_density( 0 ); + cur.set_field_intensity( 0 ); } - // TODO: Allow spreading to the sides if age < 0 && density == 3 + // TODO: Allow spreading to the sides if age < 0 && intensity == 3 } break; @@ -556,7 +557,7 @@ bool map::process_fields_in_submap( submap *const current_submap, // Consume the terrain we're on if( ter_furn_has_flag( ter, frn, TFLAG_FLAMMABLE ) ) { - // The fire feeds on the ground itself until max density. + // 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 ); @@ -567,7 +568,7 @@ bool map::process_fields_in_submap( submap *const current_submap, } else if( ter_furn_has_flag( ter, frn, TFLAG_FLAMMABLE_HARD ) && one_in( 3 ) ) { - // The fire feeds on the ground itself until max density. + // 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 ); @@ -577,17 +578,22 @@ bool map::process_fields_in_submap( submap *const current_submap, } } else if( ter.has_flag( TFLAG_FLAMMABLE_ASH ) ) { - // The fire feeds on the ground itself until max density. + // 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 ) ) { - ter_set( p, t_dirt ); + 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 density. + // 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 ); @@ -605,22 +611,22 @@ bool map::process_fields_in_submap( submap *const current_submap, 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_density( cur.get_field_intensity() - 1 ); + 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_density = std::max( cur.get_field_intensity(), - fire_there->get_field_intensity() ); + int new_intensity = std::max( cur.get_field_intensity(), + fire_there->get_field_intensity() ); // Allow smaller fires to combine - if( new_density < 3 && + if( new_intensity < 3 && cur.get_field_intensity() == fire_there->get_field_intensity() ) { - new_density++; + new_intensity++; } - fire_there->set_field_density( new_density ); + fire_there->set_field_intensity( new_intensity ); // A raging fire below us can support us for a while // Otherwise decay and decay fast - if( new_density < 3 || one_in( 10 ) ) { - cur.set_field_density( cur.get_field_intensity() - 1 ); + if( new_intensity < 3 || one_in( 10 ) ) { + cur.set_field_intensity( cur.get_field_intensity() - 1 ); } } @@ -687,7 +693,7 @@ bool map::process_fields_in_submap( submap *const current_submap, dstfld->get_field_age() > cur.get_field_age() ) && ( in_pit == ( dst.get_ter() == t_pit ) ) ) { if( dstfld->get_field_intensity() < 2 ) { - dstfld->set_field_density( dstfld->get_field_intensity() + 1 ); + dstfld->set_field_intensity( dstfld->get_field_intensity() + 1 ); } dstfld->set_field_age( dstfld->get_field_age() - 5_minutes ); @@ -711,7 +717,7 @@ bool map::process_fields_in_submap( submap *const current_submap, dstfld->get_field_age() > cur.get_field_age() ) && ( in_pit == ( dst.get_ter() == t_pit ) ) ) { if( dstfld->get_field_intensity() < 2 ) { - dstfld->set_field_density( dstfld->get_field_intensity() + 1 ); + dstfld->set_field_intensity( dstfld->get_field_intensity() + 1 ); } dstfld->set_field_age( dstfld->get_field_age() - 5_minutes ); @@ -728,34 +734,34 @@ bool map::process_fields_in_submap( submap *const current_submap, // burning neighbors are necessary in addition to // field age < 0, or alternatively, a LOT of fuel. - // The maximum fire density is 1 for a lone fire, 2 for at least 1 neighbor, + // The maximum fire intensity is 1 for a lone fire, 2 for at least 1 neighbor, // 3 for at least 2 neighbors. - int maximum_density = 1; + int maximum_intensity = 1; // The following logic looks a bit complex due to optimization concerns, so here are the semantics: - // 1. Calculate maximum field density based on fuel, -50 minutes is 2(medium), -500 minutes is 3(raging) - // 2. Calculate maximum field density based on neighbors, 3 neighbors is 2(medium), 7 or more neighbors is 3(raging) + // 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_density = 3; + maximum_intensity = 3; } else { for( auto &neigh : neighs ) { if( neigh.get_field().find_field( fd_fire ) != nullptr ) { adjacent_fires++; } } - maximum_density = 1 + ( adjacent_fires >= 3 ) + ( adjacent_fires >= 7 ); + maximum_intensity = 1 + ( adjacent_fires >= 3 ) + ( adjacent_fires >= 7 ); - if( maximum_density < 2 && cur.get_field_age() < -50_minutes ) { - maximum_density = 2; + 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_density && cur.get_field_age() < 0_turns ) { + 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_density( cur.get_field_intensity() + 1 ); + cur.set_field_intensity( cur.get_field_intensity() + 1 ); cur.set_field_age( cur.get_field_age() + 10_minutes * cur.get_field_intensity() ); } } @@ -834,7 +840,7 @@ bool map::process_fields_in_submap( submap *const current_submap, cur.set_field_age( cur.get_field_age() + 1_minutes ); } if( nearwebfld ) { - nearwebfld->set_field_density( 0 ); + nearwebfld->set_field_intensity( 0 ); } } } @@ -894,7 +900,7 @@ bool map::process_fields_in_submap( submap *const current_submap, cur.set_field_age( cur.get_field_age() + 1_minutes ); } if( nearwebfld ) { - nearwebfld->set_field_density( 0 ); + nearwebfld->set_field_intensity( 0 ); } } } @@ -1026,7 +1032,7 @@ bool map::process_fields_in_submap( submap *const current_submap, field &wandering_field = get_field( pnt ); tmpfld = wandering_field.find_field( fd_toxic_gas ); if( tmpfld && tmpfld->get_field_intensity() < cur.get_field_intensity() ) { - tmpfld->set_field_density( tmpfld->get_field_intensity() + 1 ); + tmpfld->set_field_intensity( tmpfld->get_field_intensity() + 1 ); } else { add_field( pnt, fd_toxic_gas, cur.get_field_intensity() ); } @@ -1040,7 +1046,7 @@ bool map::process_fields_in_submap( submap *const current_submap, field &wandering_field = get_field( pnt ); tmpfld = wandering_field.find_field( fd_smoke ); if( tmpfld && tmpfld->get_field_intensity() < cur.get_field_intensity() ) { - tmpfld->set_field_density( tmpfld->get_field_intensity() + 1 ); + tmpfld->set_field_intensity( tmpfld->get_field_intensity() + 1 ); } else { add_field( pnt, fd_smoke, cur.get_field_intensity() ); } @@ -1051,24 +1057,24 @@ bool map::process_fields_in_submap( submap *const current_submap, case fd_fire_vent: if( cur.get_field_intensity() > 1 ) { if( one_in( 3 ) ) { - cur.set_field_density( cur.get_field_intensity() - 1 ); + cur.set_field_intensity( cur.get_field_intensity() - 1 ); } create_hot_air( p, cur.get_field_intensity() ); } else { dirty_transparency_cache = true; add_field( p, fd_flame_burst, 3, cur.get_field_age() ); - cur.set_field_density( 0 ); + cur.set_field_intensity( 0 ); } break; case fd_flame_burst: if( cur.get_field_intensity() > 1 ) { - cur.set_field_density( cur.get_field_intensity() - 1 ); + cur.set_field_intensity( cur.get_field_intensity() - 1 ); create_hot_air( p, cur.get_field_intensity() ); } else { dirty_transparency_cache = true; add_field( p, fd_fire_vent, 3, cur.get_field_age() ); - cur.set_field_density( 0 ); + cur.set_field_intensity( 0 ); } break; @@ -1084,7 +1090,7 @@ bool map::process_fields_in_submap( submap *const current_submap, pnt.y = p.y + rng( -1, 1 ); if( passable( pnt ) ) { add_field( pnt, fd_electricity, 1, cur.get_field_age() + 1_turns ); - cur.set_field_density( cur.get_field_intensity() - 1 ); + cur.set_field_intensity( cur.get_field_intensity() - 1 ); tries = 0; } else { tries++; @@ -1101,17 +1107,17 @@ bool map::process_fields_in_submap( submap *const current_submap, field_entry *elec = get_field( dst ).find_field( fd_electricity ); if( passable( dst ) && elec != nullptr && elec->get_field_intensity() < 3 ) { - elec->set_field_density( elec->get_field_intensity() + 1 ); - cur.set_field_density( cur.get_field_intensity() - 1 ); + elec->set_field_intensity( elec->get_field_intensity() + 1 ); + cur.set_field_intensity( cur.get_field_intensity() - 1 ); } else if( passable( dst ) ) { add_field( dst, fd_electricity, 1, cur.get_field_age() + 1_turns ); } - cur.set_field_density( cur.get_field_intensity() - 1 ); + cur.set_field_intensity( cur.get_field_intensity() - 1 ); } while( !valid.empty() && cur.get_field_intensity() > 1 ) { const tripoint target = random_entry_removed( valid ); add_field( target, fd_electricity, 1, cur.get_field_age() + 1_turns ); - cur.set_field_density( cur.get_field_intensity() - 1 ); + cur.set_field_intensity( cur.get_field_intensity() - 1 ); } } } @@ -1126,7 +1132,7 @@ bool map::process_fields_in_submap( submap *const current_submap, } }; if( cur.get_field_intensity() < 3 && calendar::once_every( 6_hours ) && one_in( 10 ) ) { - cur.set_field_density( cur.get_field_intensity() + 1 ); + cur.set_field_intensity( cur.get_field_intensity() + 1 ); } else if( cur.get_field_intensity() == 3 && one_in( 600 ) ) { // Spawn nether creature! g->summon_mon( random_entry( monids ), p ); } @@ -1183,10 +1189,10 @@ bool map::process_fields_in_submap( submap *const current_submap, case fd_shock_vent: if( cur.get_field_intensity() > 1 ) { if( one_in( 5 ) ) { - cur.set_field_density( cur.get_field_intensity() - 1 ); + cur.set_field_intensity( cur.get_field_intensity() - 1 ); } } else { - cur.set_field_density( 3 ); + cur.set_field_intensity( 3 ); int num_bolts = rng( 3, 6 ); for( int i = 0; i < num_bolts; i++ ) { int xdir = 0; @@ -1224,20 +1230,20 @@ bool map::process_fields_in_submap( submap *const current_submap, case fd_acid_vent: if( cur.get_field_intensity() > 1 ) { if( cur.get_field_age() >= 1_minutes ) { - cur.set_field_density( cur.get_field_intensity() - 1 ); + cur.set_field_intensity( cur.get_field_intensity() - 1 ); cur.set_field_age( 0_turns ); } } else { - cur.set_field_density( 3 ); + cur.set_field_intensity( 3 ); for( const tripoint &t : points_in_radius( p, 5 ) ) { const field_entry *acid = get_field( t, fd_acid ); if( acid != nullptr && acid->get_field_intensity() == 0 ) { - int newdens = 3 - ( rl_dist( p, t ) / 2 ) + ( one_in( 3 ) ? 1 : 0 ); - if( newdens > 3 ) { - newdens = 3; + int new_intensity = 3 - ( rl_dist( p, t ) / 2 ) + ( one_in( 3 ) ? 1 : 0 ); + if( new_intensity > 3 ) { + new_intensity = 3; } - if( newdens > 0 ) { - add_field( t, fd_acid, newdens ); + if( new_intensity > 0 ) { + add_field( t, fd_acid, new_intensity ); } } } @@ -1269,7 +1275,7 @@ bool map::process_fields_in_submap( submap *const current_submap, curfield.find_field( fd_electricity ) || curfield.find_field( fd_incendiary ) ) { // Kill them at the end of processing. - cur.set_field_density( 0 ); + cur.set_field_intensity( 0 ); } else { // Bees chase the player if in range, wander randomly otherwise. if( !g->u.is_underwater() && @@ -1288,7 +1294,7 @@ bool map::process_fields_in_submap( submap *const current_submap, if( !target_field.find_field( fd_bees ) ) { add_field( tripoint( candidate_position, p.z ), fd_bees, cur.get_field_intensity(), cur.get_field_age() ); - cur.set_field_density( 0 ); + cur.set_field_intensity( 0 ); break; } } @@ -1329,11 +1335,11 @@ bool map::process_fields_in_submap( submap *const current_submap, //check the terrain and replace it accordingly to simulate the fungus dieing off const auto &ter = map_tile.get_ter_t(); const auto &frn = map_tile.get_furn_t(); - const int density = cur.get_field_intensity(); - if( ter.has_flag( "FUNGUS" ) && one_in( 10 / density ) ) { + const int intensity = cur.get_field_intensity(); + if( ter.has_flag( "FUNGUS" ) && one_in( 10 / intensity ) ) { ter_set( p, t_dirt ); } - if( frn.has_flag( "FUNGUS" ) && one_in( 10 / density ) ) { + if( frn.has_flag( "FUNGUS" ) && one_in( 10 / intensity ) ) { furn_set( p, f_null ); } } @@ -1350,10 +1356,10 @@ bool map::process_fields_in_submap( submap *const current_submap, if( fdata.halflife > 0_turns && cur.get_field_age() > 0_turns && dice( 2, to_turns( cur.get_field_age() ) ) > to_turns( fdata.halflife ) ) { cur.set_field_age( 0_turns ); - cur.set_field_density( cur.get_field_intensity() - 1 ); + cur.set_field_intensity( cur.get_field_intensity() - 1 ); } if( !cur.is_field_alive() ) { - current_submap->field_count--; + --current_submap->field_count; curfield.remove_field( it++ ); } else { ++it; @@ -1361,6 +1367,20 @@ bool map::process_fields_in_submap( submap *const current_submap, } } } + const int minz = zlevels ? -OVERMAP_DEPTH : abs_sub.z; + const int maxz = zlevels ? OVERMAP_HEIGHT : abs_sub.z; + for( int z = std::max( submap_z - 1, minz ); z <= std::min( submap_z + 1, maxz ); ++z ) { + auto &field_cache = get_cache( z ).field_cache; + for( int y = std::max( submap_y - 1, 0 ); y <= std::min( submap_y + 1, MAPSIZE - 1 ); ++y ) { + for( int x = std::max( submap_x - 1, 0 ); x <= std::min( submap_x + 1, MAPSIZE - 1 ); ++x ) { + if( get_submap_at_grid( { x, y, z } )->field_count > 0 ) { + field_cache.set( x + ( y * MAPSIZE ) ); + } else { + field_cache.reset( x + ( y * MAPSIZE ) ); + } + } + } + } return dirty_transparency_cache; } @@ -1389,7 +1409,7 @@ void map::player_in_field( player &u ) } // Iterate through all field effects on this tile. - // Do not remove the field with remove_field, instead set it's density to 0. It will be removed + // Do not remove the field with remove_field, instead set it's intensity to 0. It will be removed // later by the field processing, which will also adjust field_count accordingly. for( auto &field_list_it : curfield ) { field_entry &cur = field_list_it.second; @@ -1416,12 +1436,12 @@ void map::player_in_field( player &u ) if( !u.has_trait( trait_id( "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() ); - cur.set_field_density( 0 ); //Its spent. + cur.set_field_intensity( 0 ); //Its spent. 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_density( 0 ); + cur.set_field_intensity( 0 ); continue; } } @@ -1439,27 +1459,27 @@ void map::player_in_field( player &u ) break; } - const int density = cur.get_field_intensity(); + const int intensity = cur.get_field_intensity(); int total_damage = 0; // Use a helper for a bit less boilerplate const auto burn_part = [&]( body_part bp, const int scale ) { - const int damage = rng( 1, scale + density ); + const int damage = rng( 1, scale + intensity ); // A bit ugly, but better than being annoyed by acid when in hazmat if( u.get_armor_type( DT_ACID, bp ) < damage ) { auto ddi = u.deal_damage( nullptr, bp, damage_instance( DT_ACID, damage ) ); total_damage += ddi.total_damage(); } // Represents acid seeping in rather than being splashed on - u.add_env_effect( effect_corroding, bp, 2 + density, time_duration::from_turns( rng( 2, - 1 + density ) ), bp, false, 0 ); + u.add_env_effect( effect_corroding, bp, 2 + intensity, time_duration::from_turns( rng( 2, + 1 + intensity ) ), bp, false, 0 ); }; - // 1-3 at density, 1-4 at 2, 1-5 at 3 + // 1-3 at intensity, 1-4 at 2, 1-5 at 3 burn_part( bp_foot_l, 2 ); burn_part( bp_foot_r, 2 ); - // 1 dmg at 1 density, 1-3 at 2, 1-5 at 3 - burn_part( bp_leg_l, density - 1 ); - burn_part( bp_leg_r, density - 1 ); + // 1 dmg at 1 intensity, 1-3 at 2, 1-5 at 3 + burn_part( bp_leg_l, intensity - 1 ); + burn_part( 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 @@ -1498,7 +1518,7 @@ void map::player_in_field( player &u ) u.add_msg_player_or_npc( m_bad, _( "The sap sticks to you!" ), _( "The sap sticks to !" ) ); u.add_effect( effect_sap, cur.get_field_intensity() * 2_turns ); - cur.set_field_density( cur.get_field_intensity() - 1 ); //Use up sap. + cur.set_field_intensity( cur.get_field_intensity() - 1 ); //Use up sap. break; case fd_sludge: @@ -1506,7 +1526,7 @@ void map::player_in_field( player &u ) if( !u.in_vehicle ) { u.add_msg_if_player( m_bad, _( "The sludge is thick and sticky. You struggle to pull free." ) ); u.moves -= cur.get_field_intensity() * 300; - cur.set_field_density( 0 ); + cur.set_field_intensity( 0 ); } break; @@ -1597,16 +1617,16 @@ void map::player_in_field( player &u ) case fd_smoke: { if( !inside ) { //Get smoke disease from standing in smoke. - int density = cur.get_field_intensity(); + int intensity = cur.get_field_intensity(); int coughStr; time_duration coughDur = 0_turns; - if( density >= 3 ) { // thick smoke + if( intensity >= 3 ) { // thick smoke coughStr = 4; coughDur = 15_turns; - } else if( density == 2 ) { // smoke + } else if( intensity == 2 ) { // smoke coughStr = 2; coughDur = 7_turns; - } else { // density 1, thin smoke + } else { // intensity 1, thin smoke coughStr = 1; coughDur = 2_turns; } @@ -1668,7 +1688,7 @@ void map::player_in_field( player &u ) case fd_nuke_gas: { // Get irradiated by the nuclear fallout. - // Changed to min of density, not 0. + // Changed to min of intensity, not 0. float rads = rng( cur.get_field_intensity(), cur.get_field_intensity() * ( cur.get_field_intensity() + 1 ) ); bool rad_proof = !u.irradiate( rads ); @@ -1700,7 +1720,7 @@ void map::player_in_field( player &u ) break; case fd_electricity: { - // Small universal damage based on density, only if not electroproofed. + // Small universal damage based on intensity, only if not electroproofed. if( u.is_elec_immune() ) { break; } @@ -1742,32 +1762,32 @@ void map::player_in_field( player &u ) case fd_shock_vent: // Stepping on an acid vent shuts it down. case fd_acid_vent: - cur.set_field_density( 0 ); + cur.set_field_intensity( 0 ); continue; case fd_bees: // Player is immune to bees while underwater. if( !u.is_underwater() ) { int times_stung = 0; - int density = cur.get_field_intensity(); + int intensity = cur.get_field_intensity(); // If the bees can get at you, they cause steadily increasing pain. // TODO: Specific stinging messages. times_stung += one_in( 4 ) && - u.add_env_effect( effect_stung, bp_torso, density, 9_minutes ); + u.add_env_effect( effect_stung, bp_torso, intensity, 9_minutes ); times_stung += one_in( 4 ) && - u.add_env_effect( effect_stung, bp_torso, density, 9_minutes ); + u.add_env_effect( effect_stung, bp_torso, intensity, 9_minutes ); times_stung += one_in( 4 ) && - u.add_env_effect( effect_stung, bp_torso, density, 9_minutes ); + u.add_env_effect( effect_stung, bp_torso, intensity, 9_minutes ); times_stung += one_in( 4 ) && - u.add_env_effect( effect_stung, bp_torso, density, 9_minutes ); + u.add_env_effect( effect_stung, bp_torso, intensity, 9_minutes ); times_stung += one_in( 4 ) && - u.add_env_effect( effect_stung, bp_torso, density, 9_minutes ); + u.add_env_effect( effect_stung, bp_torso, intensity, 9_minutes ); times_stung += one_in( 4 ) && - u.add_env_effect( effect_stung, bp_torso, density, 9_minutes ); + u.add_env_effect( effect_stung, bp_torso, intensity, 9_minutes ); times_stung += one_in( 4 ) && - u.add_env_effect( effect_stung, bp_torso, density, 9_minutes ); + u.add_env_effect( effect_stung, bp_torso, intensity, 9_minutes ); times_stung += one_in( 4 ) && - u.add_env_effect( effect_stung, bp_torso, density, 9_minutes ); + u.add_env_effect( effect_stung, bp_torso, intensity, 9_minutes ); switch( times_stung ) { case 0: // Woo, unscathed! @@ -1822,11 +1842,11 @@ void map::player_in_field( player &u ) break; } bool inhaled = false; - const int density = cur.get_field_intensity(); - inhaled = u.add_env_effect( effect_poison, bp_mouth, 5, density * 1_minutes ); + const int intensity = cur.get_field_intensity(); + inhaled = u.add_env_effect( effect_poison, bp_mouth, 5, intensity * 1_minutes ); if( u.has_trait( trait_id( "THRESH_MYCUS" ) ) || u.has_trait( trait_id( "THRESH_MARLOSS" ) ) ) { - inhaled |= u.add_env_effect( effect_badpoison, bp_mouth, 5, density * 1_minutes ); - u.hurtall( rng( density, density * 2 ), nullptr ); + inhaled |= u.add_env_effect( effect_badpoison, bp_mouth, 5, intensity * 1_minutes ); + u.hurtall( rng( intensity, intensity * 2 ), nullptr ); u.add_msg_if_player( m_bad, _( "The %s burns your skin." ), cur.name() ); } @@ -1864,7 +1884,7 @@ void map::monster_in_field( monster &z ) int dam = 0; // Iterate through all field effects on this tile. - // Do not remove the field with remove_field, instead set it's density to 0. It will be removed + // Do not remove the field with remove_field, instead set it's intensity to 0. It will be removed // later by the field processing, which will also adjust field_count accordingly. for( auto &field_list_it : curfield ) { field_entry &cur = field_list_it.second; @@ -1881,7 +1901,7 @@ void map::monster_in_field( monster &z ) case fd_web: if( !z.has_flag( MF_WEBWALK ) ) { z.add_effect( effect_webbed, 1_turns, num_bp, true, cur.get_field_intensity() ); - cur.set_field_density( 0 ); + cur.set_field_intensity( 0 ); } break; @@ -1895,14 +1915,14 @@ void map::monster_in_field( monster &z ) case fd_sap: z.moves -= cur.get_field_intensity() * 5; - cur.set_field_density( cur.get_field_intensity() - 1 ); + cur.set_field_intensity( cur.get_field_intensity() - 1 ); break; case fd_sludge: if( !z.has_flag( MF_DIGS ) && !z.has_flag( MF_FLIES ) && !z.has_flag( MF_SLUDGEPROOF ) ) { z.moves -= cur.get_field_intensity() * 300; - cur.set_field_density( 0 ); + cur.set_field_intensity( 0 ); } break; @@ -2116,17 +2136,17 @@ void map::monster_in_field( monster &z ) !z.type->has_flag( MF_NO_BREATHE ) && !z.make_fungus() ) { // Don't insta-kill jabberwocks, that's silly - const int density = cur.get_field_intensity(); - z.moves -= rng( 10 * density, 30 * density ); - dam += rng( 0, 10 * density ); + const int intensity = cur.get_field_intensity(); + z.moves -= rng( 10 * intensity, 30 * intensity ); + dam += rng( 0, 10 * intensity ); } break; case fd_fungicidal_gas: if( z.type->in_species( FUNGUS ) ) { - const int density = cur.get_field_intensity(); - z.moves -= rng( 10 * density, 30 * density ); - dam += rng( 4, 7 * density ); + const int intensity = cur.get_field_intensity(); + z.moves -= rng( 10 * intensity, 30 * intensity ); + dam += rng( 4, 7 * intensity ); } break; @@ -2201,12 +2221,12 @@ void map::emit_field( const tripoint &pos, const emit_id &src, float mul ) float chance = src->chance() * mul; if( src.is_valid() && x_in_y( chance, 100 ) ) { int qty = chance > 100.0f ? roll_remainder( src->qty() * chance / 100.0f ) : src->qty(); - propagate_field( pos, src->field(), qty, src->density() ); + propagate_field( pos, src->field(), qty, src->intensity() ); } } void map::propagate_field( const tripoint ¢er, const field_id type, int amount, - int max_density ) + int max_intensity ) { using gas_blast = std::pair; std::priority_queue, pair_greater_cmp_first> open; @@ -2221,12 +2241,12 @@ void map::propagate_field( const tripoint ¢er, const field_id type, int amou continue; } - // All points with equal gas density should propagate at the same time + // All points with equal gas intensity should propagate at the same time std::list gas_front; gas_front.push_back( open.top() ); - int cur_intensity = get_field_strength( open.top().second, type ); + int cur_intensity = get_field_intensity( open.top().second, type ); open.pop(); - while( !open.empty() && get_field_strength( open.top().second, type ) == cur_intensity ) { + while( !open.empty() && get_field_intensity( open.top().second, type ) == cur_intensity ) { if( closed.count( open.top().second ) == 0 ) { gas_front.push_back( open.top() ); } @@ -2239,10 +2259,10 @@ void map::propagate_field( const tripoint ¢er, const field_id type, int amou while( amount > 0 && !gas_front.empty() ) { auto gp = random_entry_removed( gas_front ); closed.insert( gp.second ); - int cur_strength = get_field_strength( gp.second, type ); - if( cur_strength < max_density ) { - int bonus = std::min( max_density - cur_strength, increment ); - adjust_field_strength( gp.second, type, bonus ); + int cur_intensity = get_field_intensity( gp.second, type ); + if( cur_intensity < max_intensity ) { + int bonus = std::min( max_intensity - cur_intensity, increment ); + adjust_field_intensity( gp.second, type, bonus ); amount -= bonus; } else { amount--; diff --git a/src/map_iterator.h b/src/map_iterator.h index f8649cf6fb66a..db0cbcb0a322a 100644 --- a/src/map_iterator.h +++ b/src/map_iterator.h @@ -100,6 +100,15 @@ class tripoint_range return size() == 0; } + bool is_point_inside( const tripoint &point ) const { + for( const tripoint ¤t : *this ) { + if( current == point ) { + return true; + } + } + return false; + } + const tripoint &min() const { return minp; } diff --git a/src/mapdata.cpp b/src/mapdata.cpp index 6677e42e07fdc..44be61c2bfc2e 100644 --- a/src/mapdata.cpp +++ b/src/mapdata.cpp @@ -28,7 +28,7 @@ const units::volume DEFAULT_MAX_VOLUME_IN_SQUARE = units::from_liter( 1000 ); generic_factory terrain_data( "terrain", "id", "aliases" ); generic_factory furniture_data( "furniture", "id", "aliases" ); -} +} // namespace /** @relates int_id */ template<> @@ -222,8 +222,8 @@ bool map_bash_info::load( JsonObject &jsobj, const std::string &member, bool is_ bash_below = j.get_bool( "bash_below", false ); - sound = j.get_string( "sound", _( "smash!" ) ); - sound_fail = j.get_string( "sound_fail", _( "thump!" ) ); + sound = _( j.get_string( "sound", "smash!" ) ); + sound_fail = _( j.get_string( "sound_fail", "thump!" ) ); if( is_furniture ) { furn_set = furn_str_id( j.get_string( "furn_set", "f_null" ) ); @@ -263,6 +263,7 @@ bool map_deconstruct_info::load( JsonObject &jsobj, const std::string &member, b ter_set = ter_str_id( j.get_string( "ter_set" ) ); } can_do = true; + deconstruct_above = j.get_bool( "deconstruct_above", false ); JsonIn &stream = *j.get_raw( "items" ); drop_group = item_group::load_item_group( stream, "collection" ); @@ -1081,7 +1082,7 @@ season_type string_to_enum( const std::string &data ) { return string_to_enum_look_up( season_map, data ); } -} +} // namespace io void map_data_common_t::load( JsonObject &jo, const std::string &src ) { diff --git a/src/mapgen.cpp b/src/mapgen.cpp index 4c6266a60b2fe..b67e1f26f766f 100644 --- a/src/mapgen.cpp +++ b/src/mapgen.cpp @@ -157,10 +157,7 @@ void map::generate( const int x, const int y, const int z, const time_point &whe if( extra == nullptr ) { debugmsg( "failed to pick extra for type %s", terrain_type->get_extras() ); } else { - auto func = MapExtras::get_function( *( ex.values.pick() ) ); - if( func != nullptr ) { - func( *this, abs_sub ); - } + MapExtras::apply_function( *( ex.values.pick() ), *this, abs_sub ); } } @@ -308,7 +305,7 @@ std::string member; std::string message; bool defer; JsonObject jsi; -} +} // namespace mapgen_defer static void set_mapgen_defer( const JsonObject &jsi, const std::string &member, const std::string &message ) @@ -381,7 +378,7 @@ static void load_nested_mapgen( JsonObject &jio, const std::string &id_base ) JsonObject jo = jio.get_object( "object" ); std::string jstr = jo.str(); nested_mapgen[id_base].push_back( - cata::make_unique( jstr ) ); + std::make_unique( jstr ) ); } else { debugmsg( "Nested mapgen: Invalid mapgen function (missing \"object\" object)", id_base.c_str() ); } @@ -399,7 +396,7 @@ static void load_update_mapgen( JsonObject &jio, const std::string &id_base ) JsonObject jo = jio.get_object( "object" ); std::string jstr = jo.str(); update_mapgen[id_base].push_back( - cata::make_unique( jstr ) ); + std::make_unique( jstr ) ); } else { debugmsg( "Update mapgen: Invalid mapgen function (missing \"object\" object)", id_base.c_str() ); @@ -474,10 +471,10 @@ void reset_mapgens() size_t mapgen_function_json_base::calc_index( const size_t x, const size_t y ) const { if( x >= mapgensize_x ) { - debugmsg( "invalid value %lu for x in calc_index", static_cast( x ) ); + debugmsg( "invalid value %zu for x in calc_index", x ); } if( y >= mapgensize_y ) { - debugmsg( "invalid value %lu for y in calc_index", static_cast( y ) ); + debugmsg( "invalid value %zu for y in calc_index", y ); } return y * mapgensize_y + x; } @@ -742,18 +739,18 @@ class jmapgen_alternativly : public jmapgen_piece /** * Places fields on the map. * "field": field type ident. - * "density": initial field density. + * "intensity": initial field intensity. * "age": initial field age. */ class jmapgen_field : public jmapgen_piece { public: field_id ftype; - int density; + int intensity; time_duration age; jmapgen_field( JsonObject &jsi ) : jmapgen_piece() , ftype( field_from_ident( jsi.get_string( "field" ) ) ) - , density( jsi.get_int( "density", 1 ) ) + , intensity( jsi.get_int( "intensity", 1 ) ) , age( time_duration::from_turns( jsi.get_int( "age", 0 ) ) ) { if( ftype == fd_null ) { set_mapgen_defer( jsi, "field", "invalid field type" ); @@ -761,7 +758,7 @@ class jmapgen_field : public jmapgen_piece } void apply( const mapgendata &dat, const jmapgen_int &x, const jmapgen_int &y, const float /*mon_density*/, mission * /*miss*/ ) const override { - dat.m.add_field( tripoint( x.get(), y.get(), dat.m.get_abs_sub().z ), ftype, density, age ); + dat.m.add_field( tripoint( x.get(), y.get(), dat.m.get_abs_sub().z ), ftype, intensity, age ); } }; /** @@ -2711,32 +2708,32 @@ void map::draw_map( const oter_id &terrain_type, const oter_id &t_north, const o const bool generated = run_mapgen_func( function_key, this, terrain_type, dat, when, density ); if( !generated ) { - if( is_ot_type( "megastore", terrain_type ) ) { + if( is_ot_prefix( "megastore", terrain_type ) ) { draw_megastore( terrain_type, dat, when, density ); - } else if( is_ot_type( "slimepit", terrain_type ) || - is_ot_type( "slime_pit", terrain_type ) ) { + } else if( is_ot_prefix( "slimepit", terrain_type ) || + is_ot_prefix( "slime_pit", terrain_type ) ) { draw_slimepit( terrain_type, dat, when, density ); - } else if( is_ot_type( "haz_sar", terrain_type ) ) { + } else if( is_ot_prefix( "haz_sar", terrain_type ) ) { draw_sarcophagus( terrain_type, dat, when, density ); - } else if( is_ot_type( "triffid", terrain_type ) ) { + } else if( is_ot_prefix( "triffid", terrain_type ) ) { draw_triffid( terrain_type, dat, when, density ); - } else if( is_ot_type( "office", terrain_type ) ) { + } else if( is_ot_prefix( "office", terrain_type ) ) { draw_office_tower( terrain_type, dat, when, density ); - } else if( is_ot_type( "sewage", terrain_type ) ) { + } else if( is_ot_prefix( "sewage", terrain_type ) ) { draw_sewer( terrain_type, dat, when, density ); - } else if( is_ot_type( "spider", terrain_type ) ) { + } else if( is_ot_prefix( "spider", terrain_type ) ) { draw_spider_pit( terrain_type, dat, when, density ); - } else if( is_ot_type( "spiral", terrain_type ) ) { + } else if( is_ot_prefix( "spiral", terrain_type ) ) { draw_spiral( terrain_type, dat, when, density ); - } else if( is_ot_type( "temple", terrain_type ) ) { + } else if( is_ot_prefix( "temple", terrain_type ) ) { draw_temple( terrain_type, dat, when, density ); - } else if( is_ot_type( "toxic", terrain_type ) ) { + } else if( is_ot_prefix( "toxic", terrain_type ) ) { draw_toxic_dump( terrain_type, dat, when, density ); - } else if( is_ot_type( "fema", terrain_type ) ) { + } else if( is_ot_prefix( "fema", terrain_type ) ) { draw_fema( terrain_type, dat, when, density ); - } else if( is_ot_type( "mine", terrain_type ) ) { + } else if( is_ot_prefix( "mine", terrain_type ) ) { draw_mine( terrain_type, dat, when, density ); - } else if( is_ot_type( "silo", terrain_type ) ) { + } else if( is_ot_prefix( "silo", terrain_type ) ) { draw_silo( terrain_type, dat, when, density ); } else if( is_ot_subtype( "anthill", terrain_type ) ) { draw_anthill( terrain_type, dat, when, density ); @@ -3345,9 +3342,9 @@ void map::draw_lab( const oter_id &terrain_type, mapgendata &dat, const time_poi terrain_type == "central_lab_core" || terrain_type == "tower_lab" || terrain_type == "tower_lab_stairs" ) { - ice_lab = is_ot_type( "ice_lab", terrain_type ); - central_lab = is_ot_type( "central_lab", terrain_type ); - tower_lab = is_ot_type( "tower_lab", terrain_type ); + ice_lab = is_ot_prefix( "ice_lab", terrain_type ); + central_lab = is_ot_prefix( "central_lab", terrain_type ); + tower_lab = is_ot_prefix( "tower_lab", terrain_type ); if( ice_lab ) { int temperature = -20 + 30 * ( dat.zlevel ); @@ -4043,9 +4040,9 @@ void map::draw_lab( const oter_id &terrain_type, mapgendata &dat, const time_poi } else if( terrain_type == "lab_finale" || terrain_type == "ice_lab_finale" || terrain_type == "central_lab_finale" || terrain_type == "tower_lab_finale" ) { - ice_lab = is_ot_type( "ice_lab", terrain_type ); - central_lab = is_ot_type( "central_lab", terrain_type ); - tower_lab = is_ot_type( "tower_lab", terrain_type ); + ice_lab = is_ot_prefix( "ice_lab", terrain_type ); + central_lab = is_ot_prefix( "central_lab", terrain_type ); + tower_lab = is_ot_prefix( "tower_lab", terrain_type ); if( ice_lab ) { int temperature = -20 + 30 * dat.zlevel; @@ -4994,22 +4991,22 @@ void map::draw_mine( const oter_id &terrain_type, mapgendata &dat, const time_po rotate( rng( 0, 3 ) ); } else if( terrain_type == "mine" || terrain_type == "mine_down" ) { - if( is_ot_type( "mine", dat.north() ) ) { + if( is_ot_prefix( "mine", dat.north() ) ) { dat.n_fac = ( one_in( 10 ) ? 0 : -2 ); } else { dat.n_fac = 4; } - if( is_ot_type( "mine", dat.east() ) ) { + if( is_ot_prefix( "mine", dat.east() ) ) { dat.e_fac = ( one_in( 10 ) ? 0 : -2 ); } else { dat.e_fac = 4; } - if( is_ot_type( "mine", dat.south() ) ) { + if( is_ot_prefix( "mine", dat.south() ) ) { dat.s_fac = ( one_in( 10 ) ? 0 : -2 ); } else { dat.s_fac = 4; } - if( is_ot_type( "mine", dat.west() ) ) { + if( is_ot_prefix( "mine", dat.west() ) ) { dat.w_fac = ( one_in( 10 ) ? 0 : -2 ); } else { dat.w_fac = 4; @@ -6494,7 +6491,7 @@ void map::draw_anthill( const oter_id &terrain_type, mapgendata &dat, const time void map::draw_slimepit( const oter_id &terrain_type, mapgendata &dat, const time_point &/*when*/, const float /*density*/ ) { - if( is_ot_type( "slimepit", terrain_type ) ) { + if( is_ot_prefix( "slimepit", terrain_type ) ) { for( int i = 0; i < SEEX * 2; i++ ) { for( int j = 0; j < SEEY * 2; j++ ) { if( !one_in( 10 ) && ( j < dat.n_fac * SEEX || @@ -8455,23 +8452,16 @@ std::pair, std::map> get_changed_ids_from_up return std::make_pair( terrains, furnitures ); } - const tripoint omt_pos = tripoint( 0, 0, 0 ); - tinymap fake_map; - fake_map.load( 0, 0, 0, false ); - for( const tripoint &pos : fake_map.points_in_rectangle( omt_pos, - tripoint( MAPSIZE * SEEX, MAPSIZE * SEEY, 0 ) ) ) { - fake_map.furn_set( pos, f_null ); - fake_map.ter_set( pos, t_dirt ); - fake_map.trap_set( pos, tr_null ); + if( !fake_map.fake_load( f_null, t_dirt, tr_null ) ) { + return std::make_pair( terrains, furnitures ); } - - const regional_settings &rsettings = overmap_buffer.get_settings( omt_pos.x, omt_pos.y, - omt_pos.z ); oter_id any = oter_id( "field" ); + // just need a variable here, it doesn't need to be valid + const regional_settings dummy_settings; mapgendata fake_md( any, any, any, any, any, any, any, any, - any, any, omt_pos.z, rsettings, fake_map ); + any, any, 0, dummy_settings, fake_map ); if( update_function->second[0]->update_map( fake_md ) ) { for( const tripoint &pos : fake_map.points_in_rectangle( { 0, 0, 0 }, { 23, 23, 0 } ) ) { diff --git a/src/mapgen.h b/src/mapgen.h index f088d018a0bf3..5cdedc25c3b16 100644 --- a/src/mapgen.h +++ b/src/mapgen.h @@ -446,6 +446,4 @@ void circle( map *m, ter_id type, int x, int y, int rad ); void circle_furn( map *m, furn_id type, int x, int y, int rad ); void add_corpse( map *m, int x, int y ); -using map_special_pointer = void ( * )( map &, const tripoint & ); - #endif diff --git a/src/mapgen_functions.cpp b/src/mapgen_functions.cpp index 35a7b8b120972..8097137742211 100644 --- a/src/mapgen_functions.cpp +++ b/src/mapgen_functions.cpp @@ -2855,7 +2855,7 @@ static point best_expand( const map &m, const tripoint &from, int maxx, int maxy return best; } -} +} // namespace furn_space void mapgen_basement_junk( map *m, oter_id terrain_type, mapgendata dat, const time_point &turn, float density ) @@ -4552,10 +4552,10 @@ void mtrap_set( map *m, int x, int y, trap_id type ) m->trap_set( actual_location, type ); } -void madd_field( map *m, int x, int y, field_id type, int density ) +void madd_field( map *m, int x, int y, field_id type, int intensity ) { tripoint actual_location( x, y, m->get_abs_sub().z ); - m->add_field( actual_location, type, density, 0_turns ); + m->add_field( actual_location, type, intensity, 0_turns ); } static bool is_suitable_for_stairs( const map *const m, const tripoint &p ) diff --git a/src/mapgen_functions.h b/src/mapgen_functions.h index a2c1fea2404c9..d3ddca14a6eb8 100644 --- a/src/mapgen_functions.h +++ b/src/mapgen_functions.h @@ -209,7 +209,7 @@ void mapgen_lake_shore( map *m, oter_id terrain_type, mapgendata dat, const time // Temporary wrappers void mremove_trap( map *m, int x, int y ); void mtrap_set( map *m, int x, int y, trap_id type ); -void madd_field( map *m, int x, int y, field_id type, int density ); +void madd_field( map *m, int x, int y, field_id type, int intensity ); void place_stairs( map *m, oter_id terrain_type, mapgendata dat ); @@ -217,7 +217,7 @@ mapgen_update_func add_mapgen_update_func( JsonObject &jo, bool &defer ); bool run_mapgen_update_func( const std::string &update_mapgen_id, const tripoint &omt_pos, mission *miss = nullptr, bool cancel_on_collision = true ); bool run_mapgen_func( const std::string &mapgen_id, map *m, oter_id terrain_type, mapgendata dat, - const time_point &turn, float density ); + const time_point &turn, float intensity ); std::pair, std::map> get_changed_ids_from_update( const std::string &update_mapgen_id ); #endif diff --git a/src/mapsharing.h b/src/mapsharing.h index 7a21bf7c40215..54770447b04eb 100644 --- a/src/mapsharing.h +++ b/src/mapsharing.h @@ -39,7 +39,7 @@ void setDebuggers( const std::set &names ); void addDebugger( const std::string &name ); void setDefaults(); -} +} // namespace MAP_SHARING int getLock( const char *lockName ); void releaseLock( int fd, const char *lockName ); diff --git a/src/martialarts.cpp b/src/martialarts.cpp index e2df4f6e5da98..d15fbb2bec146 100644 --- a/src/martialarts.cpp +++ b/src/martialarts.cpp @@ -38,7 +38,7 @@ namespace generic_factory ma_techniques( "martial art technique" ); generic_factory martialarts( "martial art style" ); generic_factory ma_buffs( "martial art buff" ); -} +} // namespace matype_id martial_art_learned_from( const itype &type ) { @@ -46,9 +46,13 @@ matype_id martial_art_learned_from( const itype &type ) return {}; } - // strip "manual_" from the start of the item id, add the rest to "style_" - // TODO: replace this terrible hack to rely on the item name matching the style name, it's terrible. - return matype_id( "style_" + type.get_id().substr( 7 ) ); + if( !type.book || type.book->martial_art.is_null() ) { + debugmsg( "Item '%s' which claims to teach a martial art is missing martial_art", + type.get_id() ); + return {}; + } + + return type.book->martial_art; } void load_technique( JsonObject &jo, const std::string &src ) diff --git a/src/material.cpp b/src/material.cpp index 23384a3f47dc1..e7d48f22e9526 100644 --- a/src/material.cpp +++ b/src/material.cpp @@ -94,7 +94,7 @@ void material_type::load( JsonObject &jsobj, const std::string & ) } JsonArray burn_data_array = jsobj.get_array( "burn_data" ); - for( size_t intensity = 0; intensity < MAX_FIELD_DENSITY; intensity++ ) { + for( size_t intensity = 0; intensity < MAX_FIELD_INTENSITY; intensity++ ) { if( burn_data_array.has_more() ) { JsonObject brn = burn_data_array.next_object(); _burn_data[ intensity ] = load_mat_burn_data( brn ); @@ -287,7 +287,7 @@ bool material_type::reinforces() const const mat_burn_data &material_type::burn_data( size_t intensity ) const { - return _burn_data[ std::min( intensity, MAX_FIELD_DENSITY ) - 1 ]; + return _burn_data[ std::min( intensity, MAX_FIELD_INTENSITY ) - 1 ]; } const mat_burn_products &material_type::burn_products() const diff --git a/src/material.h b/src/material.h index b2da4cc76ad00..c4ed8ad6ce66b 100644 --- a/src/material.h +++ b/src/material.h @@ -59,7 +59,7 @@ class material_type std::map _vitamins; - std::array _burn_data; + std::array _burn_data; //Burn products defined in JSON as "burn_products": [ [ "X", float efficiency ], [ "Y", float efficiency ] ] mat_burn_products _burn_products; @@ -127,6 +127,6 @@ material_list get_all(); material_list get_compactable(); std::set get_rotting(); -} +} // namespace materials #endif diff --git a/src/melee.cpp b/src/melee.cpp index c92dff51986bd..8bd6aae9b04a9 100644 --- a/src/melee.cpp +++ b/src/melee.cpp @@ -2181,4 +2181,4 @@ float melee_hit_range( float accuracy ) return normal_roll( accuracy * 5, 25.0f ); } -} +} // namespace melee diff --git a/src/melee.h b/src/melee.h index efe21531d73c9..a2f4eaf5138da 100644 --- a/src/melee.h +++ b/src/melee.h @@ -7,6 +7,6 @@ namespace melee float melee_hit_range( float accuracy ); -} +} // namespace melee #endif diff --git a/src/messages.cpp b/src/messages.cpp index 52e266d81b95f..7ac0f12d1c61c 100644 --- a/src/messages.cpp +++ b/src/messages.cpp @@ -454,7 +454,7 @@ class dialog bool canceled; bool errored; }; -} +} // namespace Messages Messages::dialog::dialog() : border_color( BORDER_COLOR ), filter_color( c_white ), diff --git a/src/messages.h b/src/messages.h index 084239dde5ec6..9322e66b85e5c 100644 --- a/src/messages.h +++ b/src/messages.h @@ -9,6 +9,7 @@ #include "string_formatter.h" #include "enums.h" +#include "debug.h" class JsonOut; class JsonObject; @@ -50,11 +51,17 @@ void add_msg( const game_message_params ¶ms, std::string msg ); template inline void add_msg( const game_message_params ¶ms, const std::string &msg, Args &&... args ) { + if( params.type == m_debug && !debug_mode ) { + return; + } return add_msg( params, string_format( msg, std::forward( args )... ) ); } template inline void add_msg( const game_message_params ¶ms, const char *const msg, Args &&... args ) { + if( params.type == m_debug && !debug_mode ) { + return; + } return add_msg( params, string_format( msg, std::forward( args )... ) ); } diff --git a/src/mission.cpp b/src/mission.cpp index c359caf9eed4e..4cceb8d1f3dfb 100644 --- a/src/mission.cpp +++ b/src/mission.cpp @@ -505,7 +505,7 @@ mission_type_id mission::get_follow_up() const return follow_up; } -long mission::get_value() const +int mission::get_value() const { return value; } diff --git a/src/mission.h b/src/mission.h index 8631f143995ad..0c9dccb90a444 100644 --- a/src/mission.h +++ b/src/mission.h @@ -38,7 +38,7 @@ enum npc_mission : int; namespace debug_menu { class mission_debug; -} +} // namespace debug_menu enum mission_origin { ORIGIN_NULL = 0, @@ -183,7 +183,7 @@ void set_assign_om_target( JsonObject &jo, std::vector> &funcs ); bool set_update_mapgen( JsonObject &jo, std::vector> &funcs ); bool load_funcs( JsonObject jo, std::vector> &funcs ); -} +} // namespace mission_util struct mission_type { // Matches it to a mission_type_id above @@ -285,7 +285,7 @@ class mission std::string description; mission_status status; // Cash/Favor value of completing this - unsigned long value; + unsigned int value; // If there's a special reward for completing it npc_favor reward; // Unique ID number, used for referencing elsewhere @@ -340,7 +340,7 @@ class mission const mission_type &get_type() const; bool has_follow_up() const; mission_type_id get_follow_up() const; - long get_value() const; + int get_value() const; int get_id() const; const std::string &get_item_id() const; int get_npc_id() const; diff --git a/src/mission_companion.cpp b/src/mission_companion.cpp index 8265a5b462eda..4bb5ace027300 100644 --- a/src/mission_companion.cpp +++ b/src/mission_companion.cpp @@ -104,7 +104,7 @@ void commune_farmfield( mission_data &mission_key, npc &p ); void commune_forage( mission_data &mission_key, npc &p ); void commune_refuge_caravan( mission_data &mission_key, npc &p ); bool handle_outpost_mission( const mission_entry &cur_key, npc &p ); -} +} // namespace talk_function void talk_function::companion_mission( npc &p ) { @@ -1039,9 +1039,14 @@ void talk_function::field_harvest( npc &p, const std::string &place ) for( int x = 0; x < SEEX * 2 - 1; x++ ) { for( int y = 0; y < SEEY * 2 - 1; y++ ) { if( bay.furn( x, y ) == furn_str_id( "f_plant_harvest" ) && !bay.i_at( x, y ).empty() ) { - const item &seed = bay.i_at( x, y )[0]; - if( seed.is_seed() ) { - const islot_seed &seed_data = *seed.type->seed; + // Can't use item_stack::only_item() since there might be fertilizer + map_stack items = bay.i_at( x, y ); + map_stack::iterator seed = std::find_if( items.begin(), items.end(), []( const item & it ) { + return it.is_seed(); + } ); + + if( seed != items.end() ) { + const islot_seed &seed_data = *seed->type->seed; tmp = item( seed_data.fruit_id, calendar::turn ); bool check = false; for( const std::string &elem : plant_names ) { @@ -1052,7 +1057,7 @@ void talk_function::field_harvest( npc &p, const std::string &place ) if( !check ) { plant_types.push_back( tmp.typeId() ); plant_names.push_back( tmp.type_name( 3 ) ); - seed_types.push_back( seed.typeId() ); + seed_types.push_back( seed->typeId() ); } } } @@ -1081,11 +1086,15 @@ void talk_function::field_harvest( npc &p, const std::string &place ) for( int x = 0; x < SEEX * 2 - 1; x++ ) { for( int y = 0; y < SEEY * 2 - 1; y++ ) { - if( bay.furn( x, y ) == furn_str_id( "f_plant_harvest" ) && - !bay.i_at( x, y ).empty() ) { - const item &seed = bay.i_at( x, y )[0]; - if( seed.is_seed() ) { - const islot_seed &seed_data = *seed.type->seed; + if( bay.furn( x, y ) == furn_str_id( "f_plant_harvest" ) ) { + // Can't use item_stack::only_item() since there might be fertilizer + map_stack items = bay.i_at( x, y ); + map_stack::iterator seed = std::find_if( items.begin(), items.end(), []( const item & it ) { + return it.is_seed(); + } ); + + if( seed != items.end() ) { + const islot_seed &seed_data = *seed->type->seed; tmp = item( seed_data.fruit_id, calendar::turn ); if( tmp.typeId() == plant_types[plant_index] ) { number_plots++; @@ -2006,10 +2015,9 @@ npc_ptr talk_function::companion_choose_return( const tripoint &omt_pos, } //Smash stuff, steal valuables, and change map maker -std::vector talk_function::loot_building( const tripoint &site ) +void talk_function::loot_building( const tripoint &site ) { tinymap bay; - std::vector items_found; tripoint p; bay.load( site.x * 2, site.y * 2, site.z, false ); for( int x = 0; x < SEEX * 2 - 1; x++ ) { @@ -2067,22 +2075,20 @@ std::vector talk_function::loot_building( const tripoint &site ) critter->die( nullptr ); } //Hoover up tasty items! - for( unsigned int i = 0; i < bay.i_at( p ).size(); i++ ) { - if( ( ( bay.i_at( p )[i].is_food() || bay.i_at( p )[i].is_food_container() ) && - !one_in( 8 ) ) || - ( bay.i_at( p )[i].made_of( LIQUID ) && !one_in( 8 ) ) || - ( bay.i_at( p )[i].price( true ) > 1000 && !one_in( 4 ) ) || - one_in( 5 ) ) { - item *it = &bay.i_at( p )[i]; - items_found.push_back( it ); - bay.i_rem( p, i ); + map_stack items = bay.i_at( p ); + for( map_stack::iterator it = items.begin(); it != items.end(); ) { + if( ( ( it->is_food() || it->is_food_container() ) && !one_in( 8 ) ) || + ( it->made_of( LIQUID ) && !one_in( 8 ) ) || + ( it->price( true ) > 1000 && !one_in( 4 ) ) || one_in( 5 ) ) { + it = items.erase( it ); + } else { + ++it; } } } } bay.save(); overmap_buffer.ter( site.x, site.y, site.z ) = oter_id( "looted_building" ); - return items_found; } void mission_data::add( const std::string &id, const std::string &name_display, diff --git a/src/mission_companion.h b/src/mission_companion.h index 290d830087fc2..25856836b2cce 100644 --- a/src/mission_companion.h +++ b/src/mission_companion.h @@ -143,6 +143,8 @@ npc_ptr companion_choose_return( const tripoint &omt_pos, const std::string &rol //Return NPC to your party void companion_return( npc &comp ); //Smash stuff, steal valuables, and change map maker -std::vector loot_building( const tripoint &site ); -} +// TODO: Make this return the loot gained +void loot_building( const tripoint &site ); + +} // namespace talk_function #endif diff --git a/src/mission_start.cpp b/src/mission_start.cpp index 1b9d3fff1f181..8e570d6503070 100644 --- a/src/mission_start.cpp +++ b/src/mission_start.cpp @@ -206,7 +206,7 @@ void mission_start::place_npc_software( mission *miss ) tripoint comppoint; oter_id oter = overmap_buffer.ter( place.x, place.y, place.z ); - if( is_ot_type( "house", oter ) || is_ot_type( "s_pharm", oter ) || oter == "" ) { + if( is_ot_prefix( "house", oter ) || is_ot_type( "s_pharm", oter ) || oter == "" ) { comppoint = find_potential_computer_point( compmap, place.z ); } @@ -584,7 +584,7 @@ void mission_start::place_book( mission * ) void mission_start::reveal_refugee_center( mission *miss ) { mission_target_params t; - t.overmap_terrain_subtype = "evac_center_18"; + t.overmap_terrain_subtype = "refctr_S3e"; t.overmap_special = overmap_special_id( "evac_center" ); t.mission_pointer = miss; t.search_range = 0; diff --git a/src/mod_manager.h b/src/mod_manager.h index c485ae008d001..943031e125966 100644 --- a/src/mod_manager.h +++ b/src/mod_manager.h @@ -180,8 +180,8 @@ class mod_ui void try_rem( size_t selection, std::vector &active_list ); void try_shift( char direction, size_t &selection, std::vector &active_list ); - bool can_shift_up( long selection, const std::vector &active_list ); - bool can_shift_down( long selection, const std::vector &active_list ); + bool can_shift_up( size_t selection, const std::vector &active_list ); + bool can_shift_down( size_t selection, const std::vector &active_list ); }; #endif diff --git a/src/mod_manager_ui.cpp b/src/mod_manager_ui.cpp index 37c9ba8a845e5..a6e698c4fdfea 100644 --- a/src/mod_manager_ui.cpp +++ b/src/mod_manager_ui.cpp @@ -209,10 +209,10 @@ void mod_ui::try_shift( char direction, size_t &selection, std::vector & selection += selshift; } -bool mod_ui::can_shift_up( long selection, const std::vector &active_list ) +bool mod_ui::can_shift_up( size_t selection, const std::vector &active_list ) { // error catch for out of bounds - if( selection < 0 || selection >= static_cast( active_list.size() ) ) { + if( selection >= active_list.size() ) { return false; } // dependencies of this active element @@ -239,17 +239,17 @@ bool mod_ui::can_shift_up( long selection, const std::vector &active_lis } } -bool mod_ui::can_shift_down( long selection, const std::vector &active_list ) +bool mod_ui::can_shift_down( size_t selection, const std::vector &active_list ) { // error catch for out of bounds - if( selection < 0 || selection >= static_cast( active_list.size() ) ) { + if( selection >= active_list.size() ) { return false; } std::vector dependents = mm_tree.get_dependents_of_X_as_strings( active_list[selection] ); // figure out if we can move down! - if( selection == static_cast( active_list.size() ) - 1 ) { + if( selection == active_list.size() - 1 ) { // can't move down, don't bother trying return false; } diff --git a/src/monattack.cpp b/src/monattack.cpp index 8329e9061d598..48c2978610017 100644 --- a/src/monattack.cpp +++ b/src/monattack.cpp @@ -335,14 +335,15 @@ bool mattack::antqueen( monster *z ) if( g->u.sees( *z ) ) { add_msg( m_warning, _( "The %s tends nearby eggs, and they hatch!" ), z->name() ); } - for( auto &i : egg_points ) { - auto eggs = g->m.i_at( i ); - for( size_t j = 0; j < eggs.size(); j++ ) { - if( eggs[j].typeId() != "ant_egg" ) { + for( const tripoint &egg_pos : egg_points ) { + map_stack items = g->m.i_at( egg_pos ); + for( map_stack::iterator it = items.begin(); it != items.end(); ) { + if( it->typeId() != "ant_egg" ) { + ++it; continue; } - g->m.i_rem( i, j ); - monster tmp( z->type->id == mon_ant_acid_queen ? mon_ant_acid_larva : mon_ant_larva, i ); + it = items.erase( it ); + monster tmp( z->type->id == mon_ant_acid_queen ? mon_ant_acid_larva : mon_ant_larva, egg_pos ); tmp.make_ally( *z ); g->add_zombie( tmp ); break; // Max one hatch per tile @@ -852,7 +853,7 @@ bool mattack::resurrect( monster *z ) 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_strength( p, fd_fire ) > 1 || + if( !g->is_empty( p ) || g->m.get_field_intensity( p, fd_fire ) > 1 || !g->m.sees( z->pos(), p, -1 ) ) { continue; } @@ -1053,7 +1054,7 @@ find_empty_neighbors( const Creature &c ) */ static size_t get_random_index( const size_t size ) { - return static_cast( rng( 0, static_cast( size - 1 ) ) ); + return static_cast( rng( 0, static_cast( size - 1 ) ) ); } //-------------------------------------------------------------------------------------------------- @@ -1098,7 +1099,7 @@ bool mattack::science( monster *const z ) // I said SCIENCE again! constexpr int att_rad_dose_max = 50; // max radiation // acid attack behavior - constexpr int att_acid_density = 3; + constexpr int att_acid_intensity = 3; // flavor messages static const std::array m_flavor = {{ @@ -1244,7 +1245,7 @@ bool mattack::science( monster *const z ) // I said SCIENCE again! // 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_density ); + g->m.add_field( p, fd_acid, att_acid_intensity ); } break; @@ -1640,7 +1641,7 @@ bool mattack::fungus_big_blossom( monster *z ) const auto u_see = g->u.sees( *z ); // Fungal fire-suppressor! >:D for( const tripoint &dest : g->m.points_in_radius( z->pos(), 6 ) ) { - if( g->m.get_field_strength( dest, fd_fire ) != 0 ) { + if( g->m.get_field_intensity( dest, fd_fire ) != 0 ) { firealarm = true; } if( firealarm ) { diff --git a/src/mondeath.cpp b/src/mondeath.cpp index f8bc7f4ef909c..ab235fa840c53 100644 --- a/src/mondeath.cpp +++ b/src/mondeath.cpp @@ -357,7 +357,7 @@ void mdeath::triffid_heart( monster &z ) void mdeath::fungus( monster &z ) { // If the fungus died from anti-fungal poison, don't pouf - if( g->m.get_field_strength( z.pos(), fd_fungicidal_gas ) ) { + if( g->m.get_field_intensity( z.pos(), fd_fungicidal_gas ) ) { return; } @@ -599,10 +599,12 @@ void mdeath::explode( monster &z ) void mdeath::focused_beam( monster &z ) { - - for( int k = g->m.i_at( z.pos() ).size() - 1; k >= 0; k-- ) { - if( g->m.i_at( z.pos() )[k].typeId() == "processor" ) { - g->m.i_rem( z.pos(), k ); + map_stack items = g->m.i_at( z.pos() ); + for( map_stack::iterator it = items.begin(); it != items.end(); ) { + if( it->typeId() == "processor" ) { + it = items.erase( it ); + } else { + ++it; } } diff --git a/src/monexamine.h b/src/monexamine.h index 7290b3897dd00..9b61db48a1338 100644 --- a/src/monexamine.h +++ b/src/monexamine.h @@ -28,5 +28,5 @@ void attach_or_remove_saddle( monster &z ); *and amount the times per day you can milk the monster. */ void milk_source( monster &source_mon ); -} +} // namespace monexamine #endif diff --git a/src/monfaction.h b/src/monfaction.h index 97328cf53265f..ceb8eb6080a19 100644 --- a/src/monfaction.h +++ b/src/monfaction.h @@ -22,7 +22,7 @@ namespace monfactions void finalize(); void load_monster_faction( JsonObject &jo ); mfaction_id get_or_add_faction( const mfaction_str_id &id ); -} +} // namespace monfactions class monfaction { diff --git a/src/monmove.cpp b/src/monmove.cpp index bee15b0886345..07253afb3d200 100644 --- a/src/monmove.cpp +++ b/src/monmove.cpp @@ -738,11 +738,24 @@ void monster::move() // Otherwise weird things happen destination.z = posz(); } + + int new_dx = destination.x - pos().x; + int new_dy = destination.y - pos().y; + // toggle facing direction for sdl flip - if( destination.x < pos().x ) { - facing = FD_LEFT; + if( ! tile_iso ) { + if( new_dx < 0 ) { + facing = FD_LEFT; + } else if( new_dx > 0 ) { + facing = FD_RIGHT; + } } else { - facing = FD_RIGHT; + if( new_dy <= 0 && new_dx <= 0 ) { + facing = FD_LEFT; + } + if( new_dx >= 0 && new_dy >= 0 ) { + facing = FD_RIGHT; + } } tripoint next_step; @@ -917,20 +930,8 @@ void monster::footsteps( const tripoint &p ) if( volume == 0 ) { return; } - std::string footstep; - if( type->in_species( BLOB ) ) { - footstep = translate_marker( "plop." ); - } else if( type->in_species( ZOMBIE ) ) { - footstep = translate_marker( "shuffling." ); - } else if( type->in_species( ROBOT ) ) { - footstep = translate_marker( "mechanical whirring." ); - } else if( type->in_species( WORM ) ) { - footstep = translate_marker( "rustle." ); - } else { - footstep = translate_marker( "footsteps" ); - } int dist = rl_dist( p, g->u.pos() ); - sounds::add_footstep( p, volume, dist, this, _( footstep ) ); + sounds::add_footstep( p, volume, dist, this, type->get_footsteps() ); return; } diff --git a/src/monster.cpp b/src/monster.cpp index 4d17cf19dc830..7ffe28e80c08e 100644 --- a/src/monster.cpp +++ b/src/monster.cpp @@ -30,6 +30,7 @@ #include "morale_types.h" #include "mtype.h" #include "npc.h" +#include "optional.h" #include "options.h" #include "output.h" #include "overmapbuffer.h" @@ -598,7 +599,7 @@ int monster::print_info( const catacurses::window &w, int vStart, int vLines, in } std::string effects = get_effect_status(); - long long used_space = att.first.length() + name().length() + 3; + size_t used_space = att.first.length() + name().length() + 3; trim_and_print( w, vStart++, used_space, getmaxx( w ) - used_space - 2, h_white, effects ); @@ -1046,7 +1047,7 @@ 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_strength( p, fd_fire ); + ret += 5 * g->m.get_field_intensity( p, fd_fire ); } return ret; } ); @@ -1838,8 +1839,26 @@ void monster::explode() hp = INT_MIN + 1; } +void monster::set_summon_time( const time_duration &length ) +{ + summon_time_limit = length; +} + +void monster::decrement_summon_timer() +{ + if( !summon_time_limit ) { + return; + } + if( *summon_time_limit <= 0_turns ) { + die( nullptr ); + } else { + *summon_time_limit -= 1_turns; + } +} + void monster::process_turn() { + decrement_summon_timer(); if( !is_hallucination() ) { for( const auto &e : type->emit_fields ) { if( e == emit_id( "emit_shock_cloud" ) ) { @@ -2026,7 +2045,7 @@ void monster::die( Creature *nkiller ) } mission::on_creature_death( *this ); // Also, perform our death function - if( is_hallucination() ) { + if( is_hallucination() || summon_time_limit ) { //Hallucinations always just disappear mdeath::disappear( *this ); return; @@ -2428,7 +2447,7 @@ void monster::on_hit( Creature *source, body_part, return; } - if( rng( 0, 100 ) <= static_cast( type->def_chance ) ) { + if( rng( 0, 100 ) <= static_cast( type->def_chance ) ) { type->sp_defense( *this, source, proj ); } diff --git a/src/monster.h b/src/monster.h index 0b77be7ea3abb..afa28511f2bee 100644 --- a/src/monster.h +++ b/src/monster.h @@ -486,7 +486,10 @@ class monster : public Creature const pathfinding_settings &get_pathfinding_settings() const override; std::set get_path_avoid() const override; - + // summoned monsters via spells + void set_summon_time( const time_duration &length ); + // handles removing the monster if the timer runs out + void decrement_summon_timer(); private: void process_trigger( mon_trigger trig, int amount ); void process_trigger( mon_trigger trig, const std::function &amount_func ); @@ -511,6 +514,7 @@ class monster : public Creature /** Found path. Note: Not used by monsters that don't pathfind! **/ std::vector path; std::bitset effect_cache; + cata::optional summon_time_limit = cata::nullopt; protected: void store( JsonOut &jsout ) const; diff --git a/src/monstergenerator.cpp b/src/monstergenerator.cpp index 62973c86b0d1c..5c5891c419673 100644 --- a/src/monstergenerator.cpp +++ b/src/monstergenerator.cpp @@ -148,7 +148,7 @@ const std::map flag_map = { { "LOUDMOVES", MF_LOUDMOVES } }; -} +} // namespace namespace io { @@ -165,7 +165,7 @@ m_flag string_to_enum( const std::string &flag ) return string_to_enum_look_up( flag_map, flag ); } -} +} // namespace io /** @relates string_id */ template<> @@ -790,6 +790,8 @@ void MonsterGenerator::load_species( JsonObject &jo, const std::string &src ) void species_type::load( JsonObject &jo, const std::string & ) { + optional( jo, was_loaded, "footsteps", footsteps, "footsteps." ); + footsteps = _( footsteps ); const auto flag_reader = enum_flags_reader { "monster flag" }; optional( jo, was_loaded, "flags", flags, flag_reader ); diff --git a/src/monstergenerator.h b/src/monstergenerator.h index dbd7e1073029e..0f7aaaf692868 100644 --- a/src/monstergenerator.h +++ b/src/monstergenerator.h @@ -27,10 +27,14 @@ using mon_action_defend = void ( * )( monster &, Creature *, dealt_projectile_at struct species_type { species_id id; bool was_loaded = false; + std::string footsteps; enum_bitset flags; enum_bitset anger; enum_bitset fear; enum_bitset placate; + std::string get_footsteps() const { + return footsteps; + } species_type(): id( species_id::NULL_ID() ) { diff --git a/src/morale.cpp b/src/morale.cpp index e36526c3e093f..fc92d2e2cbdf4 100644 --- a/src/morale.cpp +++ b/src/morale.cpp @@ -105,7 +105,7 @@ static const morale_mult badtemper( 0.8, 1.2 ); static const morale_mult prozac( 1.0, 0.25 ); // The bad prozac effect reduces good morale by 75%. static const morale_mult prozac_bad( 0.25, 1.0 ); -} +} // namespace morale_mults std::string player_morale::morale_point::get_name() const { @@ -697,14 +697,10 @@ void player_morale::on_item_takeoff( const item &it ) set_worn( it, false ); } -void player_morale::on_worn_item_transform( const item &it ) +void player_morale::on_worn_item_transform( const item &old_it, const item &new_it ) { - item dummy = it; - dummy.convert( dynamic_cast( item::find_type( - it.typeId() )->get_use( "transform" )->get_actor_ptr() )->target ); - - set_worn( dummy, false ); - set_worn( it, true ); + set_worn( old_it, false ); + set_worn( new_it, true ); } void player_morale::on_worn_item_washed( const item &it ) diff --git a/src/morale.h b/src/morale.h index 93cbffed3cc00..819ef25cf1b58 100644 --- a/src/morale.h +++ b/src/morale.h @@ -64,7 +64,7 @@ class player_morale void on_stat_change( const std::string &stat, int value ); void on_item_wear( const item &it ); void on_item_takeoff( const item &it ); - void on_worn_item_transform( const item &it ); + void on_worn_item_transform( const item &old_it, const item &new_it ); void on_worn_item_washed( const item &it ); void on_effect_int_change( const efftype_id &eid, int intensity, body_part bp = num_bp ); diff --git a/src/morale_types.cpp b/src/morale_types.cpp index 85dea7be627c3..30373c078387c 100644 --- a/src/morale_types.cpp +++ b/src/morale_types.cpp @@ -163,6 +163,8 @@ const morale_type MORALE_BOOK( "morale_book" ); const morale_type MORALE_COMFY( "morale_comfy" ); const morale_type MORALE_SCREAM( "morale_scream" ); const morale_type MORALE_PERM_MASOCHIST( "morale_perm_masochist" ); +const morale_type MORALE_PERM_NOFACE( "morale_perm_noface" ); +const morale_type MORALE_PERM_FPMODE_ON( "morale_perm_fpmode_on" ); const morale_type MORALE_PERM_HOARDER( "morale_perm_hoarder" ); const morale_type MORALE_PERM_FANCY( "morale_perm_fancy" ); const morale_type MORALE_PERM_OPTIMIST( "morale_perm_optimist" ); @@ -194,7 +196,7 @@ namespace generic_factory morale_data( "morale type" ); -} +} // namespace template<> const morale_type_data &morale_type::obj() const diff --git a/src/morale_types.h b/src/morale_types.h index dd4b6bc36e651..2f49951a48b51 100644 --- a/src/morale_types.h +++ b/src/morale_types.h @@ -90,6 +90,8 @@ extern const morale_type MORALE_BOOK; extern const morale_type MORALE_COMFY; extern const morale_type MORALE_SCREAM; extern const morale_type MORALE_PERM_MASOCHIST; +extern const morale_type MORALE_PERM_NOFACE; +extern const morale_type MORALE_PERM_FPMODE_ON; extern const morale_type MORALE_PERM_HOARDER; extern const morale_type MORALE_PERM_FANCY; extern const morale_type MORALE_PERM_OPTIMIST; diff --git a/src/mtype.cpp b/src/mtype.cpp index b2cc6fd54c405..de88e55a8c8b3 100644 --- a/src/mtype.cpp +++ b/src/mtype.cpp @@ -8,6 +8,7 @@ #include "item.h" #include "itype.h" #include "mondeath.h" +#include "monstergenerator.h" #include "translations.h" #include "mapdata.h" @@ -221,3 +222,11 @@ std::string mtype::get_description() const { return _( description ); } + +std::string mtype::get_footsteps() const +{ + for( const species_id &s : species ) { + return s.obj().get_footsteps(); + } + return "footsteps."; +} diff --git a/src/mtype.h b/src/mtype.h index b25af64f0bdc9..bea82d8f28bce 100644 --- a/src/mtype.h +++ b/src/mtype.h @@ -346,6 +346,7 @@ struct mtype { itype_id get_meat_itype() const; int get_meat_chunks_count() const; std::string get_description() const; + std::string get_footsteps() const; // Historically located in monstergenerator.cpp void load( JsonObject &jo, const std::string &src ); diff --git a/src/mutation.cpp b/src/mutation.cpp index 8d3e24db41cc4..f35f478f7c4cc 100644 --- a/src/mutation.cpp +++ b/src/mutation.cpp @@ -532,9 +532,9 @@ void player::mutate() std::vector downgrades; // For each mutation... - for( auto &traits_iter : mutation_branch::get_all() ) { - const auto &base_mutation = traits_iter.id; - const auto &base_mdata = traits_iter; + for( const mutation_branch &traits_iter : mutation_branch::get_all() ) { + const trait_id &base_mutation = traits_iter.id; + const mutation_branch &base_mdata = traits_iter; bool thresh_save = base_mdata.threshold; bool prof_save = base_mdata.profession; bool purify_save = base_mdata.purifiable; @@ -542,7 +542,7 @@ void player::mutate() // ...that we have... if( has_trait( base_mutation ) ) { // ...consider the mutations that replace it. - for( auto &mutation : base_mdata.replacements ) { + for( const trait_id &mutation : base_mdata.replacements ) { bool valid_ok = mutation->valid; if( ( mutation_ok( mutation, force_good, force_bad ) ) && @@ -552,7 +552,7 @@ void player::mutate() } // ...consider the mutations that add to it. - for( auto &mutation : base_mdata.additions ) { + for( const trait_id &mutation : base_mdata.additions ) { bool valid_ok = mutation->valid; if( ( mutation_ok( mutation, force_good, force_bad ) ) && @@ -566,7 +566,7 @@ void player::mutate() // Starting traits don't count toward categories std::vector group = mutations_category[cat]; bool in_cat = false; - for( auto &elem : group ) { + for( const trait_id &elem : group ) { if( elem == base_mutation ) { in_cat = true; break; @@ -575,11 +575,9 @@ void player::mutate() // mark for removal // no removing Thresholds/Professions this way! - if( !in_cat && !thresh_save && !prof_save ) { - // non-purifiable stuff should be pretty tenacious - // category-enforcement only targets it 25% of the time - // (purify_save defaults true, = false for non-purifiable) - if( purify_save || one_in( 4 ) ) { + // unpurifiable traits also cannot be purified + if( !in_cat && !thresh_save && !prof_save && !purify_save ) { + if( one_in( 4 ) ) { downgrades.push_back( base_mutation ); } } @@ -622,7 +620,7 @@ void player::mutate() if( cat.empty() ) { // Pull the full list - for( auto &traits_iter : mutation_branch::get_all() ) { + for( const mutation_branch &traits_iter : mutation_branch::get_all() ) { if( traits_iter.valid ) { valid.push_back( traits_iter.id ); } diff --git a/src/mutation.h b/src/mutation.h index db847e4487422..cc2fcd56764ea 100644 --- a/src/mutation.h +++ b/src/mutation.h @@ -139,6 +139,8 @@ struct mutation_branch { // Subtracted from the range at which monsters see player, corresponding to percentage of change. Clamped to +/- 60 for effectiveness float stealth_modifier = 0.0f; + // Speed lowers--or raises--for every X F (X C) degrees below or above 65 F (18.3 C) + float temperature_speed_modifier = 0.0f; // Extra metabolism rate multiplier. 1.0 doubles usage, -0.5 halves. float metabolism_modifier = 0.0f; // As above but for thirst. @@ -166,6 +168,8 @@ struct mutation_branch { float mana_modifier; float mana_multiplier; float mana_regen_multiplier; + // spells learned and their associated level when gaining the mutation + std::map spells_learned; private: std::string raw_spawn_item_message; public: diff --git a/src/mutation_data.cpp b/src/mutation_data.cpp index 8937829e18e77..d9922770dbd4f 100644 --- a/src/mutation_data.cpp +++ b/src/mutation_data.cpp @@ -25,7 +25,7 @@ TraitGroupMap trait_groups; namespace { generic_factory trait_factory( "trait" ); -} +} // namespace std::vector dreams; std::map > mutations_category; @@ -343,6 +343,7 @@ void mutation_branch::load( JsonObject &jo, const std::string & ) optional( jo, was_loaded, "weight_capacity_modifier", weight_capacity_modifier, 1.0f ); optional( jo, was_loaded, "hearing_modifier", hearing_modifier, 1.0f ); optional( jo, was_loaded, "noise_modifier", noise_modifier, 1.0f ); + optional( jo, was_loaded, "temperature_speed_modifier", temperature_speed_modifier, 0.0f ); optional( jo, was_loaded, "metabolism_modifier", metabolism_modifier, 0.0f ); optional( jo, was_loaded, "thirst_modifier", thirst_modifier, 0.0f ); optional( jo, was_loaded, "fatigue_modifier", fatigue_modifier, 0.0f ); @@ -380,6 +381,13 @@ void mutation_branch::load( JsonObject &jo, const std::string & ) mutations_category[s].push_back( trait_id( id ) ); } + jsarr = jo.get_array( "spells_learned" ); + while( jsarr.has_more() ) { + JsonArray ja = jsarr.next_array(); + const spell_id sp( ja.next_string() ); + spells_learned.emplace( sp, ja.next_int() ); + } + jsarr = jo.get_array( "wet_protection" ); while( jsarr.has_more() ) { JsonObject jo = jsarr.next_object(); @@ -633,9 +641,7 @@ void mutation_branch::load_trait_group( JsonArray &entries, const trait_group::T JsonArray subarr = entries.next_array(); trait_id id( subarr.get_string( 0 ) ); - std::unique_ptr ptr( - new Single_trait_creator( id, subarr.get_int( 1 ) ) ); - tg.add_entry( ptr ); + tg.add_entry( std::make_unique( id, subarr.get_int( 1 ) ) ); // Otherwise load new format {"trait": ... } or {"group": ...} } else { JsonObject subobj = entries.next_object(); @@ -721,7 +727,7 @@ void mutation_branch::add_entry( Trait_group &tg, JsonObject &obj ) JsonObject job2 = jarr.next_object(); add_entry( tg2, job2 ); } - tg.add_entry( ptr ); + tg.add_entry( std::move( ptr ) ); return; } @@ -737,7 +743,7 @@ void mutation_branch::add_entry( Trait_group &tg, JsonObject &obj ) return; } - tg.add_entry( ptr ); + tg.add_entry( std::move( ptr ) ); } std::shared_ptr mutation_branch::get_group( const trait_group::Trait_group_tag &gid ) diff --git a/src/name.cpp b/src/name.cpp index 65410ed946f97..e42d0166b425e 100644 --- a/src/name.cpp +++ b/src/name.cpp @@ -150,5 +150,5 @@ void clear() { names.clear(); } -} +} // namespace Name diff --git a/src/name.h b/src/name.h index 462648d871e7c..5f5ed19f86ea7 100644 --- a/src/name.h +++ b/src/name.h @@ -29,7 +29,7 @@ std::string generate( bool is_male ); /// Clear names used for generation void clear(); -} +} // namespace Name inline nameFlags operator|( nameFlags l, nameFlags r ) { diff --git a/src/newcharacter.cpp b/src/newcharacter.cpp index bc1cbd4a594e5..0e287eb5d4f82 100644 --- a/src/newcharacter.cpp +++ b/src/newcharacter.cpp @@ -567,7 +567,7 @@ bool avatar::create( character_type type, const std::string &tempname ) // Learn recipes for( const auto &e : recipe_dict ) { const auto &r = e.second; - if( !knows_recipe( &r ) && has_recipe_requirements( r ) ) { + if( !r.has_flag( "SECRET" ) && !knows_recipe( &r ) && has_recipe_requirements( r ) ) { learn_recipe( &r ); } } diff --git a/src/npc.cpp b/src/npc.cpp index 288ff4d153646..d4d6a60c9c5ad 100644 --- a/src/npc.cpp +++ b/src/npc.cpp @@ -1257,6 +1257,9 @@ void npc::say( const std::string &line, const int priority ) const bool npc::wants_to_sell( const item &it ) const { + if( my_fac != it.get_owner() ) { + return false; + } const int market_price = it.price( true ); return wants_to_sell( it, value( it, market_price ), market_price ); } @@ -1293,24 +1296,51 @@ bool npc::wants_to_buy( const item &/*it*/, int at_price, int /*market_price*/ ) void npc::shop_restock() { + if( calendar::turn - restock < 3_days ) { + return; + } + restock = calendar::turn + 3_days; if( is_player_ally() ) { return; } - const Group_tag &from = myclass->get_shopkeeper_items(); if( from == "EMPTY_GROUP" ) { return; } units::volume total_space = volume_capacity(); + if( mission == NPC_MISSION_SHOPKEEP ) { + total_space = units::from_liter( 5000 ); + } + std::list ret; + int shop_value = 75000; + if( my_fac ) { + shop_value = my_fac->wealth * 0.0075; + if( mission == NPC_MISSION_SHOPKEEP && !my_fac->currency.empty() ) { + item my_currency( my_fac->currency ); + if( !my_currency.is_null() ) { + my_currency.set_owner( my_fac ); + int my_amount = rng( 5, 15 ) * shop_value / 100 / my_currency.price( true ); + for( int lcv = 0; lcv < my_amount; lcv++ ) { + ret.push_back( my_currency ); + } + } + } + } - while( total_space > 0_ml && !one_in( 50 ) ) { + int count = 0; + bool last_item = false; + while( shop_value > 0 && total_space > 0_ml && !last_item ) { item tmpit = item_group::item_from( from, 0 ); if( !tmpit.is_null() && total_space >= tmpit.volume() ) { + tmpit.set_owner( my_fac ); ret.push_back( tmpit ); + shop_value -= tmpit.price( true ); total_space -= tmpit.volume(); + count += 1; + last_item = count > 10 && one_in( 100 ); } } @@ -1350,6 +1380,11 @@ int npc::value( const item &it, int market_price ) const return -1000; } + // faction currency trades at market price + if( my_fac && my_fac->currency == it.typeId() ) { + return market_price; + } + int ret = 0; // TODO: Cache own weapon value (it can be a bit expensive to compute 50 times/turn) double weapon_val = weapon_value( it ) - weapon_value( weapon ); @@ -1807,7 +1842,7 @@ int npc::print_info( const catacurses::window &w, int line, int vLines, int colu size_t split; do { split = ( str_in.length() <= iWidth ) ? std::string::npos : str_in.find_last_of( ' ', - static_cast( iWidth ) ); + static_cast( iWidth ) ); if( split == std::string::npos ) { mvwprintz( w, line, column, color, str_in ); } else { diff --git a/src/npc_class.h b/src/npc_class.h index e731d2717c0be..d63f79b909629 100644 --- a/src/npc_class.h +++ b/src/npc_class.h @@ -23,7 +23,7 @@ namespace trait_group using Trait_group_tag = string_id; -} +} // namespace trait_group // TODO: Move to better suited file (rng.h/.cpp?) class distribution diff --git a/src/npcmove.cpp b/src/npcmove.cpp index 234c9c7fc9abb..444700f9af66a 100644 --- a/src/npcmove.cpp +++ b/src/npcmove.cpp @@ -184,7 +184,7 @@ const std::vector weapon_cbms = { { const int avoidance_vehicles_radius = 5; -} +} // namespace std::string npc_action_name( npc_action action ); @@ -1455,7 +1455,7 @@ bool npc::can_reload_current() return false; } - return find_usable_ammo( weapon ); + return static_cast( find_usable_ammo( weapon ) ); } item_location npc::find_usable_ammo( const item &weap ) diff --git a/src/npctalk.cpp b/src/npctalk.cpp index 85833b80e474e..346a4d6975cc1 100644 --- a/src/npctalk.cpp +++ b/src/npctalk.cpp @@ -92,6 +92,7 @@ const efftype_id effect_narcosis( "narcosis" ); const efftype_id effect_sleep( "sleep" ); static const trait_id trait_DEBUG_MIND_CONTROL( "DEBUG_MIND_CONTROL" ); +static const trait_id trait_PROF_FOODP( "PROF_FOODP" ); const zone_type_id zone_no_investigate( "NPC_NO_INVESTIGATE" ); const zone_type_id zone_investigate_only( "NPC_INVESTIGATE_ONLY" ); @@ -156,7 +157,7 @@ int calc_ma_style_training_cost( const npc &p, const matype_id & /* id */ ) } // Rescale values from "mission scale" to "opinion scale" -int cash_to_favor( const npc &, int cash ) +int npc_trading::cash_to_favor( const npc &, int cash ) { // TODO: It should affect different NPCs to a different degree // Square root of mission value in dollars @@ -329,6 +330,12 @@ void game::chat() } ); const int guard_count = guards.size(); + 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!" ) ); + return; + } + uilist nmenu; nmenu.text = std::string( _( "What do you want to do?" ) ); @@ -674,6 +681,16 @@ void npc::talk_to_u( bool text_only, bool radio_contact ) } } + 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" ) ) ) ) { + d.add_topic( "TALK_NOFACE" ); + } + + if( has_trait( trait_PROF_FOODP ) && !( is_wearing( itype_id( "foodperson_mask" ) ) || + is_wearing( itype_id( "foodperson_mask_on" ) ) ) ) { + d.add_topic( "TALK_NPC_NOFACE" ); + } + decide_needs(); dialogue_window d_win; @@ -726,7 +743,13 @@ std::string dialogue::dynamic_line( const talk_topic &the_topic ) const } } - if( topic == "TALK_DEAF" ) { + if( topic == "TALK_NPC_NOFACE" ) { + return string_format( _( "&%s stays silent." ), beta->name ); + } + + if( topic == "TALK_NOFACE" ) { + return _( "&You can't talk without your face." ); + } else if( topic == "TALK_DEAF" ) { return _( "&You are deaf and can't talk." ); } else if( topic == "TALK_DEAF_ANGRY" ) { @@ -1759,24 +1782,27 @@ void talk_effect_fun_t::set_u_buy_item( const std::string &item_name, int cost, function = [item_name, cost, count, container_name]( const dialogue & d ) { npc &p = *d.beta; player &u = *d.alpha; + if( !npc_trading::pay_npc( p, cost ) ) { + popup( _( "You can't afford it!" ) ); + return; + } if( container_name.empty() ) { item new_item = item( item_name, calendar::turn, count ); u.i_add( new_item ); if( count == 1 ) { //~ %1%s is the NPC name, %2$s is an item - popup( _( "%1$s gives you a %2$s" ), p.name, new_item.tname() ); + popup( _( "%1$s gives you a %2$s." ), p.name, new_item.tname() ); } else { //~ %1%s is the NPC name, %2$d is a number of items, %3$s are items - popup( _( "%1$s gives you %2$d %3$s" ), p.name, count, new_item.tname() ); + popup( _( "%1$s gives you %2$d %3$s." ), p.name, count, new_item.tname() ); } } else { item container( container_name, calendar::turn ); container.emplace_back( item_name, calendar::turn, count ); u.i_add( container ); //~ %1%s is the NPC name, %2$s is an item - popup( _( "%1$s gives you a %2$s" ), p.name, container.tname() ); + popup( _( "%1$s gives you a %2$s." ), p.name, container.tname() ); } - u.cash -= cost; }; } @@ -1799,12 +1825,12 @@ void talk_effect_fun_t::set_u_sell_item( const std::string &item_name, int cost, if( count == 1 ) { //~ %1%s is the NPC name, %2$s is an item - popup( _( "You give %1$s a %2$s" ), p.name, old_item.tname() ); + popup( _( "You give %1$s a %2$s." ), p.name, old_item.tname() ); } else { //~ %1%s is the NPC name, %2$d is a number of items, %3$s are items - popup( _( "You give %1$s %2$d %3$s" ), p.name, count, old_item.tname() ); + popup( _( "You give %1$s %2$d %3$s." ), p.name, count, old_item.tname() ); } - u.cash += cost; + p.op_of_u.owed += cost; }; } @@ -1852,8 +1878,8 @@ void talk_effect_fun_t::set_remove_item_with( JsonObject jo, const std::string & void talk_effect_fun_t::set_u_spend_cash( int amount ) { function = [amount]( const dialogue & d ) { - player &u = *d.alpha; - u.cash -= amount; + npc &np = *d.beta; + npc_trading::pay_npc( np, amount ); }; } @@ -2010,8 +2036,34 @@ void talk_effect_fun_t::set_bulk_trade_accept( bool is_trade, bool is_npc ) item tmp( d.cur_item ); tmp.charges = seller_has; if( is_trade ) { - int price = tmp.price( true ) * ( is_npc ? -1 : 1 ); - g->u.cash += price; + int price = tmp.price( true ) * ( is_npc ? -1 : 1 ) + d.beta->op_of_u.owed; + if( d.beta->my_fac && !d.beta->my_fac->currency.empty() ) { + const itype_id &pay_in = d.beta->my_fac->currency; + item pay( pay_in ); + if( d.beta->value( pay ) > 0 ) { + int required = price / d.beta->value( pay ); + int buyer_has = required; + if( is_npc ) { + buyer_has = std::min( buyer_has, buyer->charges_of( pay_in ) ); + buyer->use_charges( pay_in, buyer_has ); + } else { + if( buyer_has == 1 ) { + //~ %1%s is the NPC name, %2$s is an item + popup( _( "%1$s gives you a %2$s." ), d.beta->disp_name(), + pay.tname() ); + } else if( buyer_has > 1 ) { + //~ %1%s is the NPC name, %2$d is a number of items, %3$s are items + popup( _( "%1$s gives you %2$d %3$s." ), d.beta->disp_name(), buyer_has, + pay.tname() ); + } + } + for( int i = 0; i < buyer_has; i++ ) { + seller->i_add( pay ); + price -= d.beta->value( pay ); + } + } + d.beta->op_of_u.owed += price; + } } seller->use_charges( d.cur_item, seller_has ); buyer->i_add( tmp ); @@ -2071,7 +2123,7 @@ talk_topic talk_effect_t::apply( dialogue &d ) const d.beta->op_of_u += opinion; if( miss && ( mission_opinion.trust || mission_opinion.fear || mission_opinion.value || mission_opinion.anger ) ) { - int m_value = cash_to_favor( *d.beta, miss->get_value() ); + int m_value = npc_trading::cash_to_favor( *d.beta, miss->get_value() ); npc_opinion mod = npc_opinion( mission_opinion.trust ? m_value / mission_opinion.trust : 0, mission_opinion.fear ? @@ -2237,6 +2289,7 @@ void talk_effect_t::parse_string_effect( const std::string &effect_id, JsonObjec WRAP( start_trade ), WRAP( sort_loot ), WRAP( do_construction ), + WRAP( do_blueprint_construction ), WRAP( assign_guard ), WRAP( stop_guard ), WRAP( start_camp ), @@ -2776,25 +2829,25 @@ void conditional_t::set_npc_role_nearby( JsonObject &jo ) void conditional_t::set_npc_allies( JsonObject &jo ) { - const unsigned long min_allies = jo.get_int( "npc_allies" ); + const unsigned int min_allies = jo.get_int( "npc_allies" ); condition = [min_allies]( const dialogue & ) { return g->allies().size() >= min_allies; }; } -void conditional_t::set_npc_service( JsonObject &jo ) +void conditional_t::set_u_has_cash( JsonObject &jo ) { - const signed long service_price = jo.get_int( "npc_service" ); - condition = [service_price]( const dialogue & d ) { - return !d.beta->has_effect( effect_currently_busy ) && d.alpha->cash >= service_price; + const int min_cash = jo.get_int( "u_has_cash" ); + condition = [min_cash]( const dialogue & d ) { + return d.alpha->cash >= min_cash; }; } -void conditional_t::set_u_has_cash( JsonObject &jo ) +void conditional_t::set_u_are_owed( JsonObject &jo ) { - const signed long min_cash = jo.get_int( "u_has_cash" ); - condition = [min_cash]( const dialogue & d ) { - return d.alpha->cash >= min_cash; + const int min_debt = jo.get_int( "u_are_owed" ); + condition = [min_debt]( const dialogue & d ) { + return d.beta->op_of_u.owed >= min_debt; }; } @@ -2872,7 +2925,7 @@ void conditional_t::set_npc_override( JsonObject &jo ) void conditional_t::set_days_since( JsonObject &jo ) { - const unsigned long days = jo.get_int( "days_since_cataclysm" ); + const unsigned int days = jo.get_int( "days_since_cataclysm" ); condition = [days]( const dialogue & ) { return to_turn( calendar::turn ) >= DAYS( days ); }; @@ -3263,9 +3316,11 @@ conditional_t::conditional_t( JsonObject jo ) } else if( jo.has_int( "npc_allies" ) ) { set_npc_allies( jo ); } else if( jo.has_int( "npc_service" ) ) { - set_npc_service( jo ); + set_npc_available(); } else if( jo.has_int( "u_has_cash" ) ) { set_u_has_cash( jo ); + } else if( jo.has_int( "u_are_owed" ) ) { + set_u_are_owed( jo ); } else if( jo.has_string( "npc_aim_rule" ) ) { set_npc_aim_rule( jo ); } else if( jo.has_string( "npc_engagement_rule" ) ) { @@ -3821,7 +3876,8 @@ std::string give_item_to( npc &p, bool allow_use, bool allow_carry ) return _( "Changed your mind?" ); } - if( &given == &g->u.weapon && given.has_flag( "NO_UNWIELD" ) ) { + if( ( &given == &g->u.weapon && given.has_flag( "NO_UNWIELD" ) ) || ( g->u.is_worn( given ) && + given.has_flag( "NO_TAKEOFF" ) ) ) { // Bionic weapon or shackles return _( "How?" ); } diff --git a/src/npctalk.h b/src/npctalk.h index 743b427563e43..cf55f7a7b1b0e 100644 --- a/src/npctalk.h +++ b/src/npctalk.h @@ -36,6 +36,7 @@ void buy_100_logs( npc & ); void start_trade( npc & ); void sort_loot( npc & ); void do_construction( npc & ); +void do_blueprint_construction( npc & ); void revert_activity( npc & ); void goto_location( npc & ); void assign_base( npc & ); @@ -76,7 +77,7 @@ void set_npc_pickup( npc &p ); void npc_die( npc &p ); void npc_thankful( npc &p ); void clear_overrides( npc &p ); -} +} // namespace talk_function time_duration calc_skill_training_time( const npc &p, const skill_id &skill ); int calc_skill_training_cost( const npc &p, const skill_id &skill ); diff --git a/src/npctalk_funcs.cpp b/src/npctalk_funcs.cpp index 8f30d00ce5654..e5f262bbc43de 100644 --- a/src/npctalk_funcs.cpp +++ b/src/npctalk_funcs.cpp @@ -94,7 +94,7 @@ void talk_function::mission_success( npc &p ) return; } - int miss_val = cash_to_favor( p, miss->get_value() ); + int miss_val = npc_trading::cash_to_favor( p, miss->get_value() ); npc_opinion tmp( 0, 0, 1 + miss_val / 5, -1, 0 ); p.op_of_u += tmp; if( p.my_fac != nullptr ) { @@ -152,7 +152,7 @@ void talk_function::mission_reward( npc &p ) int mission_value = miss->get_value(); p.op_of_u.owed += mission_value; - trade( p, 0, _( "Reward" ) ); + npc_trading::trade( p, 0, _( "Reward" ) ); } void talk_function::buy_chicken( npc &p ) @@ -188,7 +188,7 @@ void spawn_animal( npc &p, const mtype_id &mon ) void talk_function::start_trade( npc &p ) { - trade( p, 0, _( "Trade" ) ); + npc_trading::trade( p, 0, _( "Trade" ) ); } void talk_function::sort_loot( npc &p ) @@ -205,6 +205,13 @@ void talk_function::do_construction( npc &p ) p.set_mission( NPC_MISSION_ACTIVITY ); } +void talk_function::do_blueprint_construction( npc &p ) +{ + p.set_attitude( NPCATT_ACTIVITY ); + p.assign_activity( activity_id( "ACT_BLUEPRINT_CONSTRUCTION" ) ); + p.set_mission( NPC_MISSION_ACTIVITY ); +} + void talk_function::revert_activity( npc &p ) { p.revert_after_activity(); @@ -386,13 +393,14 @@ void talk_function::bionic_install( npc &p ) } //Makes the doctor awesome at installing but not perfect - if( g->u.install_bionics( it, p, false, 20 ) ) { + if( g->u.can_install_bionics( it, p, false, 20 ) ) { g->u.cash -= price; p.cash += price; g->u.amount_of( bionic_types[bionic_index] ); std::vector comps; comps.push_back( item_comp( tmp.typeId(), 1 ) ); g->u.consume_items( comps, 1 ); + g->u.install_bionics( it, p, false, 20 ); } } @@ -441,17 +449,18 @@ void talk_function::bionic_remove( npc &p ) } //Makes the doctor awesome at installing but not perfect - if( g->u.uninstall_bionic( bionic_id( bionic_types[bionic_index] ), p, false ) ) { + if( g->u.can_uninstall_bionic( bionic_id( bionic_types[bionic_index] ), p, false ) ) { g->u.cash -= price; p.cash += price; 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] ), p, false ); } } void talk_function::give_equipment( npc &p ) { - std::vector giving = init_selling( p ); + std::vector giving = npc_trading::init_selling( p ); int chosen = -1; while( chosen == -1 && giving.size() > 1 ) { int index = rng( 0, giving.size() - 1 ); @@ -796,21 +805,14 @@ void talk_function::lead_to_safety( npc &p ) p.set_attitude( NPCATT_LEAD ); } -static bool pay_npc( npc &np, int cost ) +bool npc_trading::pay_npc( npc &np, int cost ) { if( np.op_of_u.owed >= cost ) { np.op_of_u.owed -= cost; return true; } - if( g->u.cash + static_cast( np.op_of_u.owed ) >= static_cast - ( cost ) ) { - g->u.cash -= cost - np.op_of_u.owed; - np.op_of_u.owed = 0; - return true; - } - - return trade( np, -cost, _( "Pay:" ) ); + return npc_trading::trade( np, cost, _( "Pay:" ) ); } void talk_function::start_training( npc &p ) @@ -836,7 +838,7 @@ void talk_function::start_training( npc &p ) mission *miss = p.chatbin.mission_selected; if( miss != nullptr && miss->get_assigned_player_id() == g->u.getID() ) { clear_mission( p ); - } else if( !pay_npc( p, cost ) ) { + } else if( !npc_trading::pay_npc( p, cost ) ) { return; } g->u.assign_activity( activity_id( "ACT_TRAIN" ), to_moves( time ), p.getID(), 0, name ); diff --git a/src/npctrade.cpp b/src/npctrade.cpp index 5429732385f77..d3476c20cb120 100644 --- a/src/npctrade.cpp +++ b/src/npctrade.cpp @@ -22,31 +22,53 @@ #include "cursesdef.h" #include "item.h" #include "player.h" +#include "string_input_popup.h" #include "units.h" #include "visitable.h" #include "type_id.h" const skill_id skill_barter( "barter" ); -inventory inventory_exchange( inventory &inv, - const std::set &without, const std::vector &added ) +void npc_trading::transfer_items( std::vector &stuff, player &giver, + player &receiver, faction *fac, + std::list &from_map, bool npc_gives ) { - std::vector item_dump; - inv.dump( item_dump ); - item_dump.insert( item_dump.end(), added.begin(), added.end() ); - inventory new_inv; - new_inv.copy_invlet_of( inv ); - - for( item *it : item_dump ) { - if( without.count( it ) == 0 ) { - new_inv.add_item( *it, true, false ); + for( item_pricing &ip : stuff ) { + if( !ip.selected ) { + continue; + } + item gift = *ip.loc.get_item(); + gift.set_owner( fac ); + int charges = npc_gives ? ip.u_charges : ip.npc_charges; + int count = npc_gives ? ip.u_has : ip.npc_has; + + if( ip.charges ) { + gift.charges = charges; + receiver.i_add( gift ); + } else { + for( int i = 0; i < count; i++ ) { + receiver.i_add( gift ); + } } - } - return new_inv; + if( ip.loc.where() == item_location::type::character ) { + if( gift.typeId() == giver.weapon.typeId() ) { + giver.remove_weapon(); + } + if( ip.charges > 0 ) { + giver.use_charges( gift.typeId(), charges ); + } else if( ip.count > 0 ) { + for( int i = 0; i < count; i++ ) { + giver.use_amount( gift.typeId(), 1 ); + } + } + } else { + from_map.push_back( &ip.loc ); + } + } } -std::vector init_selling( npc &p ) +std::vector npc_trading::init_selling( npc &p ) { std::vector result; invslice slice = p.inv.slice(); @@ -56,7 +78,7 @@ std::vector init_selling( npc &p ) const int price = it.price( true ); int val = p.value( it ); if( p.wants_to_sell( it, val, price ) ) { - result.emplace_back( p, &i->front(), val, false ); + result.emplace_back( p, &i->front(), val, i->size() ); } } @@ -67,68 +89,109 @@ std::vector init_selling( npc &p ) return result; } +double npc_trading::net_price_adjustment( const player &buyer, const player &seller ) +{ + // Adjust the prices based on your barter skill. + // cap adjustment so nothing is ever sold below value + ///\EFFECT_INT_NPC slightly increases bartering price changes, relative to your INT + + ///\EFFECT_BARTER_NPC increases bartering price changes, relative to your BARTER + + ///\EFFECT_INT slightly increases bartering price changes, relative to NPC INT + + ///\EFFECT_BARTER increases bartering price changes, relative to NPC BARTER + double adjust = 0.05 * ( seller.int_cur - buyer.int_cur ) + + price_adjustment( seller.get_skill_level( skill_barter ) - + buyer.get_skill_level( skill_barter ) ); + return( std::max( adjust, 1.0 ) ); +} + template void buy_helper( T &src, Callback cb ) { src.visit_items( [&src, &cb]( item * node ) { - cb( std::move( item_location( src, node ) ) ); + cb( std::move( item_location( src, node ) ), 1 ); return VisitResponse::SKIP; } ); } -std::vector init_buying( npc &p, player &u ) +std::vector npc_trading::init_buying( player &buyer, player &seller, bool is_npc ) { std::vector result; + npc *np_p = dynamic_cast( &buyer ); + if( is_npc ) { + np_p = dynamic_cast( &seller ); + } + npc &np = *np_p; + faction *fac = np.my_fac; - const auto check_item = [&p, &result]( item_location && loc ) { + double adjust = net_price_adjustment( buyer, seller ); + + const auto check_item = [fac, adjust, is_npc, &np, &result]( item_location && loc, int count = 1 ) { item *it_ptr = loc.get_item(); if( it_ptr == nullptr || it_ptr->is_null() ) { return; } - auto &it = *it_ptr; + item &it = *it_ptr; const int market_price = it.price( true ); - int val = p.value( it, market_price ); - if( p.wants_to_buy( it, val, market_price ) ) { - result.emplace_back( std::move( loc ), val, false ); + int val = np.value( it, market_price ); + if( ( is_npc && np.wants_to_sell( it, val, market_price ) ) || + np.wants_to_buy( it, val, market_price ) ) { + result.emplace_back( std::move( loc ), val, count ); + result.back().adjust_values( adjust, fac ); } }; - invslice slice = u.inv.slice(); + invslice slice = seller.inv.slice(); for( auto &i : slice ) { - // TODO: Sane way of handling multi-item stacks - check_item( item_location( u, &i->front() ) ); + check_item( item_location( seller, &i->front() ), i->size() ); } - if( !u.weapon.has_flag( "NO_UNWIELD" ) ) { - check_item( item_location( u, &u.weapon ) ); + if( !seller.weapon.has_flag( "NO_UNWIELD" ) ) { + check_item( item_location( seller, &seller.weapon ), 1 ); } - for( auto &cursor : map_selector( u.pos(), 1 ) ) { + for( auto &cursor : map_selector( seller.pos(), 1 ) ) { buy_helper( cursor, check_item ); } - for( auto &cursor : vehicle_selector( u.pos(), 1 ) ) { + for( auto &cursor : vehicle_selector( seller.pos(), 1 ) ) { buy_helper( cursor, check_item ); } return result; } -bool trade( npc &p, int cost, const std::string &deal ) +void item_pricing::set_values( int ip_count ) +{ + item *i_p = loc.get_item(); + is_container = i_p->is_container() || i_p->is_ammo_container(); + vol = i_p->volume(); + weight = i_p->weight(); + if( is_container || i_p->count() == 1 ) { + count = ip_count; + } else { + charges = i_p->count(); + price /= charges; + vol /= charges; + weight /= charges; + } +} + +void item_pricing::adjust_values( const double adjust, faction *fac ) +{ + if( !fac || fac->currency != loc.get_item()->typeId() ) { + price *= adjust; + } +} + +void trading_window::setup_win( npc &np ) { - catacurses::window w_head = catacurses::newwin( 4, TERMX, 0, 0 ); - const int win_they_w = TERMX / 2; - catacurses::window w_them = catacurses::newwin( TERMY - 4, win_they_w, 4, 0 ); - catacurses::window w_you = catacurses::newwin( TERMY - 4, TERMX - win_they_w, 4, win_they_w ); - catacurses::window w_tmp; - std::string header_message = _( "\ -TAB key to switch lists, letters to pick items, Enter to finalize, Esc to quit,\n\ -? to get information on an item." ); - mvwprintz( w_head, 0, 0, c_white, header_message.c_str(), p.name ); - - // If entries were to get over a-z and A-Z, we wouldn't have good keys for them - const size_t entries_per_page = std::min( TERMY - 7, 2 + ( 'z' - 'a' ) + ( 'Z' - 'A' ) ); + w_head = catacurses::newwin( 4, TERMX, 0, 0 ); + w_them = catacurses::newwin( TERMY - 4, win_they_w, 4, 0 ); + w_you = catacurses::newwin( TERMY - 4, TERMX - win_they_w, 4, win_they_w ); + mvwprintz( w_head, 0, 0, c_white, header_message.c_str(), np.disp_name() ); // Set up line drawings for( int i = 0; i < TERMX; i++ ) { @@ -136,175 +199,218 @@ TAB key to switch lists, letters to pick items, Enter to finalize, Esc to quit,\ } wrefresh( w_head ); // End of line drawings +} +void trading_window::setup_trade( int cost, npc &np ) +{ // Populate the list of what the NPC is willing to buy, and the prices they pay // Note that the NPC's barter skill is factored into these prices. // TODO: Recalc item values every time a new item is selected // Trading is not linear - starving NPC may pay $100 for 3 jerky, but not $100000 for 300 jerky - std::vector theirs = init_selling( p ); - std::vector yours = init_buying( p, g->u ); + theirs = npc_trading::init_buying( g->u, np, true ); + yours = npc_trading::init_buying( np, g->u, false ); - // Adjust the prices based on your barter skill. - // cap adjustment so nothing is ever sold below value - ///\EFFECT_INT_NPC slightly increases bartering price changes, relative to your INT + // Just exchanging items, no barter involved + exchange = np.is_player_ally(); - ///\EFFECT_BARTER_NPC increases bartering price changes, relative to your BARTER - double their_adjust = ( price_adjustment( p.get_skill_level( skill_barter ) - g->u.get_skill_level( - skill_barter ) ) + - ( p.int_cur - g->u.int_cur ) / 20.0 ); - if( their_adjust < 1.0 ) { - their_adjust = 1.0; - } - for( item_pricing &p : theirs ) { - p.price *= their_adjust; + if( exchange ) { + // Sometimes owed money fails to reset for friends + // NPC AI is way too weak to manage money, so let's just make them give stuff away for free + u_get = 0; + npc_requires = INT_MAX; + } else { + // How much cash you get in the deal (must be less than npc_requires for the deal to happen) + u_get = cost - np.op_of_u.owed; + // the NPC doesn't require a barter to exactly match, but there's a small limit to how + // much credit they'll extend + npc_requires = 50 * std::max( 0, np.op_of_u.trust + np.op_of_u.value + np.op_of_u.fear - + np.op_of_u.anger + np.personality.altruism ); } - ///\EFFECT_INT slightly increases bartering price changes, relative to NPC INT +} - ///\EFFECT_BARTER increases bartering price changes, relative to NPC BARTER - double your_adjust = ( price_adjustment( g->u.get_skill_level( skill_barter ) - p.get_skill_level( - skill_barter ) ) + - ( g->u.int_cur - p.int_cur ) / 20.0 ); - if( your_adjust < 1.0 ) { - your_adjust = 1.0; - } - for( item_pricing &p : yours ) { - p.price *= your_adjust; - } +void trading_window::update_win( npc &p, const std::string &deal, const int adjusted_u_get ) +{ + if( update ) { // Time to re-draw + update = false; + // Draw borders, one of which is highlighted + werase( w_them ); + werase( w_you ); + for( int i = 1; i < TERMX; i++ ) { + mvwputch( w_head, 3, i, c_white, LINE_OXOX ); + } - // Just exchanging items, no barter involved - const bool ex = p.is_player_ally(); + std::set without; + std::vector added; - // How much cash you get in the deal (negative = losing money) - long cash = cost + p.op_of_u.owed; - bool focus_them = true; // Is the focus on them? - bool update = true; // Re-draw the screen? - size_t them_off = 0, you_off = 0; // Offset from the start of the list - size_t ch, help; + for( item_pricing &pricing : yours ) { + if( pricing.selected ) { + added.push_back( pricing.loc.get_item() ); + } + } - if( ex ) { - // Sometimes owed money fails to reset for friends - // NPC AI is way too weak to manage money, so let's just make them give stuff away for free - cash = 0; - } + for( item_pricing &pricing : theirs ) { + if( pricing.selected ) { + without.insert( pricing.loc.get_item() ); + } + } - // Make a temporary copy of the NPC inventory to make sure volume calculations are correct - inventory temp = p.inv; - units::volume volume_left = p.volume_capacity() - p.volume_carried(); - units::mass weight_left = p.weight_capacity() - p.weight_carried(); + bool npc_has_space = volume_left < 0_ml || weight_left < 0_gram; + mvwprintz( w_head, 3, 2, npc_has_space ? c_red : c_green, + _( "Volume: %s %s, Weight: %.1f %s" ), + format_volume( volume_left ), volume_units_abbr(), + convert_weight( weight_left ), weight_units() ); - do { + std::string cost_str = _( "Exchange" ); + if( !exchange ) { + cost_str = string_format( u_get < 0 ? _( "Profit %s" ) : _( "Cost %s" ), + format_money( std::abs( u_get ) ) ); + } + + mvwprintz( w_head, 3, TERMX / 2 + ( TERMX / 2 - cost_str.length() ) / 2, + adjusted_u_get < 0 ? c_green : c_red, cost_str ); + + if( !deal.empty() ) { + mvwprintz( w_head, 3, ( TERMX - deal.length() ) / 2, + adjusted_u_get > 0 ? c_light_red : c_light_green, deal ); + } + draw_border( w_them, ( focus_them ? c_yellow : BORDER_COLOR ) ); + draw_border( w_you, ( !focus_them ? c_yellow : BORDER_COLOR ) ); + + mvwprintz( w_them, 0, 2, adjusted_u_get < 0 ? c_green : c_red, p.name ); + mvwprintz( w_you, 0, 2, adjusted_u_get > 0 ? c_green : c_red, _( "You" ) ); #if defined(__ANDROID__) input_context ctxt( "NPC_TRADE" ); - ctxt.register_manual_key( '\t', "Switch lists" ); - ctxt.register_manual_key( '<', "Back" ); - ctxt.register_manual_key( '>', "More" ); - ctxt.register_manual_key( '?', "Examine item" ); #endif + // Draw lists of items, starting from offset + for( size_t whose = 0; whose <= 1; whose++ ) { + const bool they = whose == 0; + const std::vector &list = they ? theirs : yours; + const size_t &offset = they ? them_off : you_off; + const player &person = they ? static_cast( p ) : + static_cast( g->u ); + catacurses::window &w_whose = they ? w_them : w_you; + int win_w = getmaxx( w_whose ); + // Borders + win_w -= 2; + for( size_t i = offset; i < list.size() && i < entries_per_page + offset; i++ ) { + const item_pricing &ip = list[i]; + const item *it = ip.loc.get_item(); + auto color = it == &person.weapon ? c_yellow : c_light_gray; + const int &owner_sells = they ? ip.u_has : ip.npc_has; + const int &owner_sells_charge = they ? ip.u_charges : ip.npc_charges; + std::string itname = it->display_name(); + if( ip.loc.where() != item_location::type::character ) { + itname = itname + " " + ip.loc.describe( &g->u ); + color = c_light_blue; + } + if( ip.charges > 0 && owner_sells_charge > 0 ) { + itname += string_format( _( ": trading %d" ), owner_sells_charge ); + } else { + if( ip.count > 1 ) { + itname += string_format( _( " (%d)" ), ip.count ); + } + if( owner_sells ) { + itname += string_format( _( ": trading %d" ), owner_sells ); + } + } - auto &target_list = focus_them ? theirs : yours; - auto &offset = focus_them ? them_off : you_off; - if( update ) { // Time to re-draw - update = false; - // Draw borders, one of which is highlighted - werase( w_them ); - werase( w_you ); - for( int i = 1; i < TERMX; i++ ) { - mvwputch( w_head, 3, i, c_white, LINE_OXOX ); - } - - std::set without; - std::vector added; - - for( auto &pricing : yours ) { - if( pricing.selected ) { - added.push_back( pricing.loc.get_item() ); + if( ip.selected ) { + color = c_white; } - } - for( auto &pricing : theirs ) { - if( pricing.selected ) { - without.insert( pricing.loc.get_item() ); + int keychar = i - offset + 'a'; + if( keychar > 'z' ) { + keychar = keychar - 'z' - 1 + 'A'; } - } + trim_and_print( w_whose, i - offset + 1, 1, win_w, color, "%c %c %s", + static_cast( keychar ), ip.selected ? '+' : '-', itname ); +#if defined(__ANDROID__) + ctxt.register_manual_key( keychar, itname ); +#endif - temp = inventory_exchange( p.inv, without, added ); - - volume_left = p.volume_capacity() - p.volume_carried_with_tweaks( { temp } ); - weight_left = p.weight_capacity() - p.weight_carried_with_tweaks( { temp } ); - mvwprintz( w_head, 3, 2, ( volume_left < 0_ml || weight_left < 0_gram ) ? c_red : c_green, - _( "Volume: %s %s, Weight: %.1f %s" ), - format_volume( volume_left ), volume_units_abbr(), - convert_weight( weight_left ), weight_units() ); - - std::string cost_string = ex ? _( "Exchange" ) : ( cash >= 0 ? _( "Profit %s" ) : - _( "Cost %s" ) ); - mvwprintz( w_head, 3, TERMX / 2 + ( TERMX / 2 - cost_string.length() ) / 2, - ( cash < 0 && static_cast( g->u.cash ) >= cash * -1 ) || ( cash >= 0 && - static_cast( p.cash ) >= cash ) ? c_green : c_red, - cost_string.c_str(), format_money( std::abs( cash ) ) ); - - if( !deal.empty() ) { - mvwprintz( w_head, 3, ( TERMX - deal.length() ) / 2, cost < 0 ? c_light_red : c_light_green, - deal.c_str() ); + std::string price_str = format_money( ip.price ); + nc_color price_color = exchange ? c_dark_gray : ( ip.selected ? c_white : + c_light_gray ); + mvwprintz( w_whose, i - offset + 1, win_w - price_str.length(), + price_color, price_str ); } - draw_border( w_them, ( focus_them ? c_yellow : BORDER_COLOR ) ); - draw_border( w_you, ( !focus_them ? c_yellow : BORDER_COLOR ) ); - - mvwprintz( w_them, 0, 2, ( cash < 0 || static_cast( p.cash ) >= cash ? c_green : c_red ), - _( "%s: %s" ), p.name, format_money( p.cash ) ); - mvwprintz( w_you, 0, 2, ( cash > 0 || - static_cast( g->u.cash ) >= cash * -1 ? c_green : c_red ), - _( "You: %s" ), format_money( g->u.cash ) ); - // Draw lists of items, starting from offset - for( size_t whose = 0; whose <= 1; whose++ ) { - const bool they = whose == 0; - const auto &list = they ? theirs : yours; - const auto &offset = they ? them_off : you_off; - const player &person = they ? static_cast( p ) : static_cast( g->u ); - auto &w_whose = they ? w_them : w_you; - int win_w = getmaxx( w_whose ); - // Borders - win_w -= 2; - for( size_t i = offset; i < list.size() && i < entries_per_page + offset; i++ ) { - const item_pricing &ip = list[i]; - const item *it = ip.loc.get_item(); - auto color = it == &person.weapon ? c_yellow : c_light_gray; - std::string itname = it->display_name(); - if( ip.loc.where() != item_location::type::character ) { - itname = itname + " " + ip.loc.describe( &g->u ); - color = c_light_blue; - } + if( offset > 0 ) { + mvwprintw( w_whose, entries_per_page + 2, 1, _( "< Back" ) ); + } + if( offset + entries_per_page < list.size() ) { + mvwprintw( w_whose, entries_per_page + 2, 9, _( "More >" ) ); + } + } + wrefresh( w_head ); + wrefresh( w_them ); + wrefresh( w_you ); + } // Done updating the screen +} - if( ip.selected ) { - color = c_white; - } +void trading_window::show_item_data( npc &np, size_t offset, + std::vector &target_list ) +{ + update = true; + catacurses::window w_tmp = catacurses::newwin( 3, 21, 1 + ( TERMY - FULL_SCREEN_HEIGHT ) / 2, + 30 + ( TERMX - FULL_SCREEN_WIDTH ) / 2 ); + mvwprintz( w_tmp, 1, 1, c_red, _( "Examine which item?" ) ); + draw_border( w_tmp ); + wrefresh( w_tmp ); + // TODO: use input context + size_t help = inp_mngr.get_input_event().get_first_input(); + if( help >= 'a' && help <= 'z' ) { + help -= 'a'; + } else if( help >= 'A' && help <= 'Z' ) { + help = help - 'A' + 26; + } else { + return; + } - int keychar = i - offset + 'a'; - if( keychar > 'z' ) { - keychar = keychar - 'z' - 1 + 'A'; - } - trim_and_print( w_whose, i - offset + 1, 1, win_w, color, "%c %c %s", - static_cast( keychar ), ip.selected ? '+' : '-', itname ); + mvwprintz( w_head, 0, 0, c_white, header_message.c_str(), np.name ); + wrefresh( w_head ); + help += offset; + if( help < target_list.size() ) { + popup( target_list[help].loc.get_item()->info(), PF_NONE ); + } +} + +int trading_window::get_var_trade( const item &it, int total_count ) +{ + string_input_popup popup_input; + int how_many = total_count; + const std::string title = string_format( _( "Trade how many %s [MAX: %d]: " ), + it.display_name(), total_count ); + popup_input.title( title ).edit( how_many ); + if( popup_input.canceled() || how_many <= 0 ) { + return -1; + } + return std::min( total_count, how_many ); +} + +bool trading_window::perform_trade( npc &p, const std::string &deal ) +{ + size_t ch; + int adjusted_u_get = u_get - npc_requires; + + volume_left = p.volume_capacity() - p.volume_carried(); + weight_left = p.weight_capacity() - p.weight_carried(); + if( p.mission == NPC_MISSION_SHOPKEEP ) { + volume_left = units::from_liter( 5000 ); + weight_left = units::from_kilogram( 5000 ); + } + + do { + update_win( p, deal, adjusted_u_get ); #if defined(__ANDROID__) - ctxt.register_manual_key( keychar, itname ); + input_context ctxt( "NPC_TRADE" ); + ctxt.register_manual_key( '\t', "Switch lists" ); + ctxt.register_manual_key( '<', "Back" ); + ctxt.register_manual_key( '>', "More" ); + ctxt.register_manual_key( '?', "Examine item" ); #endif - std::string price_str = string_format( "%.2f", ip.price / 100.0 ); - nc_color price_color = ex ? c_dark_gray : ( ip.selected ? c_white : c_light_gray ); - mvwprintz( w_whose, i - offset + 1, win_w - price_str.length(), - price_color, price_str.c_str() ); - } - if( offset > 0 ) { - mvwprintw( w_whose, entries_per_page + 2, 1, _( "< Back" ) ); - } - if( offset + entries_per_page < list.size() ) { - mvwprintw( w_whose, entries_per_page + 2, 9, _( "More >" ) ); - } - } - wrefresh( w_head ); - wrefresh( w_them ); - wrefresh( w_you ); - } // Done updating the screen + std::vector &target_list = focus_them ? theirs : yours; + size_t &offset = focus_them ? them_off : you_off; // TODO: use input context ch = inp_mngr.get_input_event().get_first_input(); switch( ch ) { @@ -325,34 +431,13 @@ TAB key to switch lists, letters to pick items, Enter to finalize, Esc to quit,\ } break; case '?': - update = true; - w_tmp = catacurses::newwin( 3, 21, 1 + ( TERMY - FULL_SCREEN_HEIGHT ) / 2, - 30 + ( TERMX - FULL_SCREEN_WIDTH ) / 2 ); - mvwprintz( w_tmp, 1, 1, c_red, _( "Examine which item?" ) ); - draw_border( w_tmp ); - wrefresh( w_tmp ); - // TODO: use input context - help = inp_mngr.get_input_event().get_first_input(); - if( help >= 'a' && help <= 'z' ) { - help -= 'a'; - } else if( help >= 'A' && help <= 'Z' ) { - help = help - 'A' + 26; - } else { - break; - } - - mvwprintz( w_head, 0, 0, c_white, header_message.c_str(), p.name ); - wrefresh( w_head ); - help += offset; - if( help < target_list.size() ) { - popup( target_list[help].loc.get_item()->info(), PF_NONE ); - } + show_item_data( p, offset, target_list ); + ch = ' '; break; - case '\n': // Check if we have enough cash... - // The player must pay cash, and it should not put the player negative. - if( cash < 0 && static_cast( g->u.cash ) < cash * -1 ) { - popup( _( "Not enough cash! You have %s, price is %s." ), format_money( g->u.cash ), - format_money( -cash ) ); + case '\n': // Check if the NPC will accept the deal + // The player must give more than they get + if( adjusted_u_get > 0 ) { + popup( _( "Not enough value! You need %s." ), format_money( adjusted_u_get ) ); update = true; ch = ' '; } else if( volume_left < 0_ml || weight_left < 0_gram ) { @@ -373,96 +458,92 @@ TAB key to switch lists, letters to pick items, Enter to finalize, Esc to quit,\ ch += offset; if( ch < target_list.size() ) { - update = true; item_pricing &ip = target_list[ch]; + int change_amount = 1; + int &owner_sells = focus_them ? ip.u_has : ip.npc_has; + int &owner_sells_charge = focus_them ? ip.u_charges : ip.npc_charges; + + if( ip.selected ) { + if( owner_sells_charge > 0 ) { + change_amount = owner_sells_charge; + owner_sells_charge = 0; + } else if( owner_sells > 0 ) { + change_amount = owner_sells; + owner_sells = 0; + } + } else if( ip.charges > 0 ) { + change_amount = get_var_trade( *ip.loc.get_item(), ip.charges ); + if( change_amount < 1 ) { + ch = 0; + continue; + } + owner_sells_charge = change_amount; + } else { + if( ip.count > 1 ) { + change_amount = get_var_trade( *ip.loc.get_item(), ip.count ); + if( change_amount < 1 ) { + ch = 0; + continue; + } + } + owner_sells = change_amount; + } + update = true; ip.selected = !ip.selected; - if( !ex && ip.selected == focus_them ) { - cash -= ip.price; - } else if( !ex ) { - cash += ip.price; + if( ip.selected != focus_them ) { + change_amount *= -1; + } + int delta_price = ip.price * change_amount; + if( !exchange ) { + u_get += delta_price; + adjusted_u_get += delta_price; + volume_left -= ip.vol * change_amount; + weight_left -= ip.weight * change_amount; } } ch = 0; } } while( ch != KEY_ESCAPE && ch != '\n' ); - const bool traded = ch == '\n'; - if( traded ) { - int practice = 0; - - std::list from_map; - const auto mark_for_exchange = - [&practice, &from_map]( item_pricing & pricing, std::set &removing, - std::vector &giving ) { - if( !pricing.selected ) { - return; - } - - giving.push_back( pricing.loc.get_item() ); - practice++; - - if( pricing.loc.where() == item_location::type::character ) { - removing.insert( pricing.loc.get_item() ); - } else { - from_map.push_back( &pricing.loc ); - } - }; - // This weird exchange is needed to prevent pointer bugs - // Removing items from an inventory invalidates the pointers - std::set removing_yours; - std::vector giving_them; - - for( auto &pricing : yours ) { - mark_for_exchange( pricing, removing_yours, giving_them ); - } + return ch == '\n'; +} - std::set removing_theirs; - std::vector giving_you; - for( auto &pricing : theirs ) { - mark_for_exchange( pricing, removing_theirs, giving_you ); - } +void trading_window::update_npc_owed( npc &np ) +{ + np.op_of_u.owed = std::min( std::max( np.op_of_u.owed, npc_requires ), - u_get ); +} - const inventory &your_new_inv = inventory_exchange( g->u.inv, - removing_yours, giving_you ); - const inventory &their_new_inv = inventory_exchange( p.inv, - removing_theirs, giving_them ); +// Oh my aching head +// op_of_u.owed is the positive when the NPC owes the player, and negative if the player owes the +// NPC +// cost is positive when the player owes the NPC money for a service to be performed +bool npc_trading::trade( npc &np, int cost, const std::string &deal ) +{ + np.shop_restock(); + trading_window trade_win; + trade_win.setup_win( np ); + trade_win.setup_trade( cost, np ); - g->u.inv = your_new_inv; - p.inv = their_new_inv; + bool traded = trade_win.perform_trade( np, deal ); + if( traded ) { + int practice = 0; - if( removing_yours.count( &g->u.weapon ) ) { - g->u.remove_weapon(); - } + std::list from_map; - if( removing_theirs.count( &p.weapon ) ) { - p.remove_weapon(); - } + npc_trading::transfer_items( trade_win.yours, g->u, np, np.my_fac, from_map, false ); + npc_trading::transfer_items( trade_win.theirs, np, g->u, + g->faction_manager_ptr->get( faction_id( "your_followers" ) ), + from_map, true ); for( item_location *loc_ptr : from_map ) { loc_ptr->remove_item(); } - if( !ex && cash > static_cast( p.cash ) ) { - // Trade was forced, give the NPC's cash to the player. - p.op_of_u.owed = ( cash - p.cash ); - g->u.cash += p.cash; - p.cash = 0; - } else if( !ex ) { - g->u.cash += cash; - p.cash -= cash; + // NPCs will remember debts, to the limit that they'll extend credit or previous debts + if( !trade_win.exchange ) { + trade_win.update_npc_owed( np ); + g->u.practice( skill_barter, practice / 10000 ); } - - // TODO: Make this depend on prices - // TODO: Make this depend on npc price adjustment vs. your price adjustment - if( !ex ) { - g->u.practice( skill_barter, practice / 2 ); - } - } - for( auto &elem : g->u.inv_dump() ) { - elem->set_owner( g->faction_manager_ptr->get( faction_id( "your_followers" ) ) ); - } - for( auto &elem : p.inv_dump() ) { - elem->set_owner( p.my_fac ); } g->refresh_all(); return traded; diff --git a/src/npctrade.h b/src/npctrade.h index a65707d08d119..c3876f682d786 100644 --- a/src/npctrade.h +++ b/src/npctrade.h @@ -9,33 +9,93 @@ #include "inventory.h" #include "item_location.h" +#include "output.h" +#include "units.h" class Character; +class faction; class item; class npc; class player; -struct item_pricing { - item_pricing( Character &c, item *it, int v, bool s ) : loc( c, it ), price( v ), selected( s ) { - } +class item_pricing +{ + public: + item_pricing( Character &c, item *it, int v, int count ) : loc( c, it ), price( v ) { + set_values( count ); + } - item_pricing( item_location &&l, int v, bool s ) : loc( std::move( l ) ), price( v ), - selected( s ) { - } + item_pricing( item_location &&l, int v, int count ) : loc( std::move( l ) ), price( v ) { + set_values( count ); + } + void set_values( int ip_count ); + void adjust_values( const double adjust, faction *fac ); - item_location loc; - int price; - // Whether this is selected for trading, init_buying and init_selling initialize - // this to `false`. - bool selected; + item_location loc; + int price; + // Whether this is selected for trading + bool selected = false; + bool is_container; + int count = 0; + int charges = 0; + int u_has = 0; + int npc_has = 0; + int u_charges = 0; + int npc_charges = 0; + units::mass weight = units::from_gram( 0 ); + units::volume vol = units::from_milliliter( 0 ); }; +class trading_window +{ + public: + trading_window() = default; + std::vector theirs; + std::vector yours; + bool exchange; + int u_get; + int npc_requires; + + void setup_win( npc &np ); + void setup_trade( int cost, npc &np ); + void update_win( npc &p, const std::string &deal, const int adjusted_u_get ); + void show_item_data( npc &np, size_t offset, std::vector &target_list ); + bool perform_trade( npc &p, const std::string &deal ); + void update_npc_owed( npc &np ); + + private: + catacurses::window w_head; + catacurses::window w_them; + catacurses::window w_you; + const int win_they_w = TERMX / 2; + const std::string header_message = _( "TAB key to switch lists, letters to pick items," + "Enter to finalize, Esc to quit,\n" + "? to get information on an item." ); + const size_t entries_per_page = std::min( TERMY - 7, 2 + ( 'z' - 'a' ) + ( 'Z' - 'A' ) ); + bool update = true; + bool focus_them = true; // Is the focus on them? + size_t them_off = 0, you_off = 0; // Offset from the start of the list + + inventory temp; + units::volume volume_left; + units::mass weight_left; + + int get_var_trade( const item &it, int total_count ); +}; + +namespace npc_trading +{ + +bool pay_npc( npc &np, int cost ); + int cash_to_favor( const npc &, int cash ); -inventory inventory_exchange( inventory &inv, - const std::set &without, const std::vector &added ); -std::vector init_selling( npc &p ); -std::vector init_buying( npc &p, player &u ); +void transfer_items( std::vector &stuff, player &giver, player &receiver, + faction *fac, std::list &from_map, bool npc_gives ); +double net_price_adjustment( const player &buyer, const player &seller ); bool trade( npc &p, int cost, const std::string &deal ); +std::vector init_selling( npc &p ); +std::vector init_buying( player &buyer, player &seller, bool is_npc ); +} // namespace npc_trading #endif diff --git a/src/omdata.h b/src/omdata.h index 208f8c3d69df0..78270a9372469 100644 --- a/src/omdata.h +++ b/src/omdata.h @@ -97,7 +97,7 @@ type random(); /** Whether these directions are parallel. */ bool are_parallel( type dir1, type dir2 ); -} +} // namespace om_direction class overmap_land_use_code { @@ -442,7 +442,7 @@ void reset(); const std::vector &get_all(); -} +} // namespace overmap_terrains namespace overmap_land_use_codes { @@ -454,7 +454,7 @@ void reset(); const std::vector &get_all(); -} +} // namespace overmap_land_use_codes namespace overmap_specials { @@ -472,13 +472,13 @@ overmap_special_batch get_default_batch( const point &origin ); */ overmap_special_id create_building_from( const string_id &base ); -} +} // namespace overmap_specials namespace city_buildings { void load( JsonObject &jo, const std::string &src ); -} +} // namespace city_buildings #endif diff --git a/src/optional.h b/src/optional.h index f64e539dcf228..6e51095ea7e96 100644 --- a/src/optional.h +++ b/src/optional.h @@ -84,6 +84,7 @@ class optional !std::is_same, typename std::decay::type>::value && std::is_constructible < T, U && >::value && std::is_convertible < U &&, T >::value, bool >::type = true > + // NOLINTNEXTLINE(bugprone-forwarding-reference-overload) optional( U && t ) : optional( in_place, std::forward( t ) ) { } @@ -92,6 +93,7 @@ class optional !std::is_same, std::decay>::value && std::is_constructible < T, U && >::value && !std::is_convertible < U &&, T >::value, bool >::type = false > + // NOLINTNEXTLINE(bugprone-forwarding-reference-overload) explicit optional( U && t ) : optional( in_place, std::forward( t ) ) { } diff --git a/src/options.cpp b/src/options.cpp index 86f9628d196c9..fe13b1e821362 100644 --- a/src/options.cpp +++ b/src/options.cpp @@ -719,7 +719,7 @@ void options_manager::cOpt::setNext() } } else if( sType == "int_map" ) { - long unsigned int iNext = getIntPos( iSet ) + 1; + unsigned int iNext = getIntPos( iSet ) + 1; if( iNext >= mIntValues.size() ) { iNext = 0; } @@ -1178,6 +1178,27 @@ void options_manager::add_options_general() mOptionsSort["general"]++; + add( "AUTO_NOTES", "general", translate_marker( "Auto notes" ), + translate_marker( "If true, automatically sets notes" ), + false + ); + + add( "AUTO_NOTES_STAIRS", "general", translate_marker( "Auto notes (stairs)" ), + translate_marker( "If true, automatically sets notes on places that have stairs that go up or down" ), + false + ); + + get_option( "AUTO_NOTES_STAIRS" ).setPrerequisite( "AUTO_NOTES" ); + + add( "AUTO_NOTES_MAP_EXTRAS", "general", translate_marker( "Auto notes (map extras)" ), + translate_marker( "If true, automatically sets notes on places that contain various map extras" ), + false + ); + + get_option( "AUTO_NOTES_MAP_EXTRAS" ).setPrerequisite( "AUTO_NOTES" ); + + mOptionsSort["general"]++; + add( "CIRCLEDIST", "general", translate_marker( "Circular distances" ), translate_marker( "If true, the game will calculate range in a realistic way: light sources will be circles, diagonal movement will cover more ground and take longer. If disabled, everything is square: moving to the northwest corner of a building takes as long as moving to the north wall." ), true @@ -1189,11 +1210,6 @@ void options_manager::add_options_general() "no" ); - add( "AUTO_NOTES", "general", translate_marker( "Auto notes" ), - translate_marker( "If true, automatically sets notes on places that have stairs that go up or down" ), - true - ); - add( "DEATHCAM", "general", translate_marker( "DeathCam" ), translate_marker( "Always: Always start deathcam. Ask: Query upon death. Never: Never show deathcam." ), { { "always", translate_marker( "Always" ) }, { "ask", translate_marker( "Ask" ) }, { "never", translate_marker( "Never" ) } }, @@ -1393,6 +1409,11 @@ void options_manager::add_options_interface() true ); + add( "REVERSE_STEERING", "interface", translate_marker( "Reverse steering direction in reverse" ), + translate_marker( "If true, when driving a vehicle in reverse, steering should also reverse like real life." ), + false + ); + mOptionsSort["interface"]++; add( "SIDEBAR_POSITION", "interface", translate_marker( "Sidebar position" ), diff --git a/src/output.h b/src/output.h index 264eed0e23614..a6d6233abdf2e 100644 --- a/src/output.h +++ b/src/output.h @@ -803,7 +803,7 @@ std::string format_volume( const units::volume &volume ); std::string format_volume( const units::volume &volume, int width, bool *out_truncated, double *out_value ); -inline const std::string format_money( signed long cents ) +inline const std::string format_money( int cents ) { return string_format( _( "$%.2f" ), cents / 100.0 ); } diff --git a/src/overmap.cpp b/src/overmap.cpp index b6a57b8e4ff9d..074dc9fd433f9 100644 --- a/src/overmap.cpp +++ b/src/overmap.cpp @@ -28,6 +28,7 @@ #include "mapbuffer.h" #include "mapgen.h" #include "mapgen_functions.h" +#include "map_extras.h" #include "messages.h" #include "mongroup.h" #include "mtype.h" @@ -160,7 +161,7 @@ static size_t from_dir( om_direction::type dir ) return 0; } -} +} // namespace om_lines //const regional_settings default_region_settings; t_regional_settings_map region_settings_map; @@ -173,7 +174,7 @@ generic_factory terrain_types( "overmap terrain type" ); generic_factory terrains( "overmap terrain" ); generic_factory specials( "overmap special" ); -} +} // namespace static const std::map oter_flags_map = { { "KNOWN_DOWN", known_down }, @@ -474,6 +475,13 @@ bool is_river_or_lake( const oter_id &ter ) } bool is_ot_type( const std::string &otype, const oter_id &oter ) +{ + // Is a match if the base type is the same which will allow for handling rotations/linear features + // but won't incorrectly match other locations that happen to contain the substring. + return otype == oter->get_type_id().str(); +} + +bool is_ot_prefix( const std::string &otype, const oter_id &oter ) { const size_t oter_size = oter.id().str().size(); const size_t compare_size = otype.size(); @@ -1305,6 +1313,77 @@ std::vector overmap::find_notes( const int z, const std::string &text ) return note_locations; } +bool overmap::has_extra( const int x, const int y, const int z ) const +{ + if( z < -OVERMAP_DEPTH || z > OVERMAP_HEIGHT ) { + return false; + } + + for( auto &i : layer[z + OVERMAP_DEPTH].extras ) { + if( i.x == x && i.y == y ) { + return true; + } + } + return false; +} + +const string_id &overmap::extra( const int x, const int y, const int z ) const +{ + static const string_id fallback{}; + + if( z < -OVERMAP_DEPTH || z > OVERMAP_HEIGHT ) { + return fallback; + } + + const auto &extras = layer[z + OVERMAP_DEPTH].extras; + const auto it = std::find_if( begin( extras ), + end( extras ), [&]( const om_map_extra & n ) { + return n.x == x && n.y == y; + } ); + + return ( it != std::end( extras ) ) ? it->id : fallback; +} + +void overmap::add_extra( const int x, const int y, const int z, const string_id id ) +{ + if( z < -OVERMAP_DEPTH || z > OVERMAP_HEIGHT ) { + debugmsg( "Attempting to add not to overmap for blank layer %d", z ); + return; + } + + auto &extras = layer[z + OVERMAP_DEPTH].extras; + const auto it = std::find_if( begin( extras ), + end( extras ), [&]( const om_map_extra & n ) { + return n.x == x && n.y == y; + } ); + + if( it == std::end( extras ) ) { + extras.emplace_back( om_map_extra{ std::move( id ), x, y } ); + } else if( !id.is_null() ) { + it->id = std::move( id ); + } else { + extras.erase( it ); + } +} + +void overmap::delete_extra( const int x, const int y, const int z ) +{ + add_extra( x, y, z, string_id::NULL_ID() ); +} + +std::vector overmap::find_extras( const int z, const std::string &text ) +{ + std::vector extra_locations; + map_layer &this_layer = layer[z + OVERMAP_DEPTH]; + for( const auto &extra : this_layer.extras ) { + const std::string extra_text = extra.id.c_str(); + if( match_include_exclude( extra_text, text ) ) { + extra_locations.push_back( global_base_point() + point( extra.x, extra.y ) ); + } + } + return extra_locations; +} + bool overmap::inbounds( const tripoint &p, int clearance ) { const tripoint overmap_boundary_min( 0, 0, -OVERMAP_DEPTH ); @@ -1957,7 +2036,7 @@ void overmap::place_forest_trails() for( int i = 0; i < OMAPX; i++ ) { for( int j = 0; j < OMAPY; j++ ) { oter_id oter = ter( i, j, 0 ); - if( !is_ot_type( "forest", oter ) ) { + if( !is_ot_prefix( "forest", oter ) ) { continue; } @@ -3500,7 +3579,7 @@ bool overmap::check_overmap_special_type( const overmap_special_id &id, void overmap::good_river( int x, int y, int z ) { - if( !is_ot_type( "river", get_ter( x, y, z ) ) ) { + if( !is_ot_prefix( "river", get_ter( x, y, z ) ) ) { return; } if( ( x == 0 ) || ( x == OMAPX - 1 ) ) { diff --git a/src/overmap.h b/src/overmap.h index 7bae6aa379db8..253323d5f701e 100644 --- a/src/overmap.h +++ b/src/overmap.h @@ -22,6 +22,7 @@ #include "overmap_types.h" // IWYU pragma: keep #include "regional_settings.h" #include "enums.h" +#include "map_extras.h" #include "mongroup.h" #include "optional.h" #include "type_id.h" @@ -35,7 +36,7 @@ class monster; namespace pf { struct path; -} +} // namespace pf struct city { // location of the city (in overmap terrain coordinates) @@ -58,6 +59,12 @@ struct om_note { int y; }; +struct om_map_extra { + string_id id; + int x; + int y; +}; + struct om_vehicle { int x; // overmap x coordinate of tracked vehicle int y; // overmap y coordinate @@ -94,6 +101,7 @@ struct map_layer { bool visible[OMAPX][OMAPY]; bool explored[OMAPX][OMAPY]; std::vector notes; + std::vector extras; }; struct om_special_sectors { @@ -194,6 +202,11 @@ class overmap void add_note( int x, int y, int z, std::string message ); void delete_note( int x, int y, int z ); + bool has_extra( int x, int y, int z ) const; + const string_id &extra( int x, int y, int z ) const; + void add_extra( int x, int y, int z, string_id id ); + void delete_extra( int x, int y, int z ); + /** * Getter for overmap scents. * @returns a reference to a scent_trace from the requested location. @@ -223,6 +236,13 @@ class overmap * coordinates), or empty vector if no matching notes are found. */ std::vector find_notes( const int z, const std::string &text ); + /** + * Return a vector containing the absolute coordinates of + * every matching map extra on the current z level of the current overmap. + * @returns A vector of map extra coordinates (absolute overmap terrain + * coordinates), or empty vector if no matching map extras are found. + */ + std::vector find_extras( const int z, const std::string &text ); /** * Returns whether or not the location has been generated (e.g. mapgen has run). @@ -427,6 +447,7 @@ class overmap bool is_river( const oter_id &ter ); bool is_river_or_lake( const oter_id &ter ); bool is_ot_type( const std::string &otype, const oter_id &oter ); +bool is_ot_prefix( const std::string &otype, const oter_id &oter ); // Matches any oter_id that contains the substring passed in, useful when oter can be a suffix, not just a prefix. bool is_ot_subtype( const char *otype, const oter_id &oter ); diff --git a/src/overmap_connection.cpp b/src/overmap_connection.cpp index d09f46254a6a5..12b2317d0923d 100644 --- a/src/overmap_connection.cpp +++ b/src/overmap_connection.cpp @@ -16,7 +16,7 @@ namespace generic_factory connections( "overmap connection" ); -} +} // namespace static const std::map connection_subtype_flag_map = { diff --git a/src/overmap_connection.h b/src/overmap_connection.h index 1840ffc93b22f..626582a4c7e2b 100644 --- a/src/overmap_connection.h +++ b/src/overmap_connection.h @@ -83,6 +83,6 @@ void reset(); string_id guess_for( const int_id &oter_id ); string_id guess_for( const int_id &oter_id ); -} +} // namespace overmap_connections #endif // OVERMAP_CONNECTION_H diff --git a/src/overmap_location.cpp b/src/overmap_location.cpp index eb40279cb968b..9ca36d2b025f1 100644 --- a/src/overmap_location.cpp +++ b/src/overmap_location.cpp @@ -14,7 +14,7 @@ namespace generic_factory locations( "overmap location" ); -} +} // namespace template<> bool string_id::is_valid() const diff --git a/src/overmap_location.h b/src/overmap_location.h index fa1a137877bb6..428f9659b5ae7 100644 --- a/src/overmap_location.h +++ b/src/overmap_location.h @@ -41,6 +41,6 @@ void load( JsonObject &jo, const std::string &src ); void check_consistency(); void reset(); -} +} // namespace overmap_locations #endif // OVERMAP_LOCATION_H diff --git a/src/overmap_noise.cpp b/src/overmap_noise.cpp index f5084923af53d..10ff4d9405333 100644 --- a/src/overmap_noise.cpp +++ b/src/overmap_noise.cpp @@ -35,4 +35,4 @@ float om_noise_layer_lake::noise_at( const point &local_omt_pos ) const return r; } -} +} // namespace om_noise diff --git a/src/overmap_noise.h b/src/overmap_noise.h index b03f1943a8cb0..95cadbd5134e1 100644 --- a/src/overmap_noise.h +++ b/src/overmap_noise.h @@ -77,6 +77,6 @@ class om_noise_layer_lake : public om_noise_layer float noise_at( const point &local_omt_pos ) const override; }; -} +} // namespace om_noise #endif diff --git a/src/overmap_ui.cpp b/src/overmap_ui.cpp index d588849db7893..1bbfe3829fa21 100644 --- a/src/overmap_ui.cpp +++ b/src/overmap_ui.cpp @@ -59,6 +59,9 @@ static constexpr int UILIST_MAP_NOTE_DELETED = -2047; static constexpr int UILIST_MAP_NOTE_EDITED = -2048; +static constexpr int max_note_length = 450; +static constexpr int max_note_display_length = 45; + /** Note preview map width without borders. Odd number. */ static const int npm_width = 3; /** Note preview map height without borders. Odd number. */ @@ -149,7 +152,8 @@ static void update_note_preview( const std::string ¬e, wrefresh( *w_preview ); werase( *w_preview_title ); - mvwprintz( *w_preview_title, 0, 0, note_color, note_text ); + nc_color default_color = c_unset; + print_colored_text( *w_preview_title, 0, 0, default_color, note_color, note_text ); mvwputch( *w_preview_title, 0, note_text.length(), c_white, LINE_XOXO ); for( size_t i = 0; i < note_text.length(); i++ ) { mvwputch( *w_preview_title, 1, i, c_white, LINE_OXOX ); @@ -335,10 +339,10 @@ class map_notes_callback : public uilist_callback void select( int, uilist *menu ) override { _selected = menu->selected; const auto map_around = get_overmap_neighbors( note_location() ); - const int max_note_length = 45; - catacurses::window w_preview = catacurses::newwin( npm_height + 2, max_note_length - npm_width - 1, + catacurses::window w_preview = catacurses::newwin( npm_height + 2, + max_note_display_length - npm_width - 1, 2, npm_width + 2 ); - catacurses::window w_preview_title = catacurses::newwin( 2, max_note_length + 1, 0, 0 ); + catacurses::window w_preview_title = catacurses::newwin( 2, max_note_display_length + 1, 0, 0 ); catacurses::window w_preview_map = catacurses::newwin( npm_height + 2, npm_width + 2, 2, 0 ); const std::tuple preview_windows = std::make_tuple( &w_preview, &w_preview_title, &w_preview_map ); @@ -811,7 +815,8 @@ void draw( const catacurses::window &w, const catacurses::window &wbar, const tr const auto &pr = corner_text[ i ]; // clear line, print line, print vertical line at the right side. mvwprintz( w, i, 0, c_yellow, spacer ); - mvwprintz( w, i, 0, pr.first, pr.second ); + nc_color default_color = c_unset; + print_colored_text( w, i, 0, default_color, pr.first, pr.second ); mvwputch( w, i, maxlen, c_white, LINE_XOXO ); } for( int i = 0; i <= maxlen; i++ ) { @@ -980,10 +985,10 @@ void create_note( const tripoint &curs ) std::string new_note = old_note; auto map_around = get_overmap_neighbors( curs ); - const int max_note_length = 45; - catacurses::window w_preview = catacurses::newwin( npm_height + 2, max_note_length - npm_width - 1, + catacurses::window w_preview = catacurses::newwin( npm_height + 2, + max_note_display_length - npm_width - 1, 2, npm_width + 2 ); - catacurses::window w_preview_title = catacurses::newwin( 2, max_note_length + 1, 0, 0 ); + catacurses::window w_preview_title = catacurses::newwin( 2, max_note_display_length + 1, 0, 0 ); catacurses::window w_preview_map = catacurses::newwin( npm_height + 2, npm_width + 2, 2, 0 ); std::tuple preview_windows = std::make_tuple( &w_preview, &w_preview_title, &w_preview_map ); @@ -1427,7 +1432,7 @@ static tripoint display( const tripoint &orig, const draw_data_t &data = draw_da return ret; } -} // overmap_ui +} // namespace overmap_ui void ui::omap::display() { diff --git a/src/overmap_ui.h b/src/overmap_ui.h index 9d5cd5e69b458..08c2a85a9402d 100644 --- a/src/overmap_ui.h +++ b/src/overmap_ui.h @@ -7,7 +7,7 @@ namespace catacurses { class window; -} +} // namespace catacurses class input_context; @@ -94,5 +94,5 @@ void draw( const catacurses::window &w, const catacurses::window &wbar, const tr const tripoint &orig, bool blink, bool show_explored, bool fast_scroll, input_context *inp_ctxt, const draw_data_t &data ); void create_note( const tripoint &curs ); -} +} // namespace overmap_ui #endif /* OVERMAP_UI_H */ diff --git a/src/overmapbuffer.cpp b/src/overmapbuffer.cpp index 09d122855dfbf..999eddaf6c73c 100644 --- a/src/overmapbuffer.cpp +++ b/src/overmapbuffer.cpp @@ -19,6 +19,7 @@ #include "game.h" #include "line.h" #include "map.h" +#include "map_extras.h" #include "mongroup.h" #include "monster.h" #include "npc.h" @@ -236,6 +237,20 @@ void overmapbuffer::delete_note( int x, int y, int z ) } } +void overmapbuffer::add_extra( int x, int y, int z, const string_id &id ) +{ + overmap &om = get_om_global( x, y ); + om.add_extra( x, y, z, id ); +} + +void overmapbuffer::delete_extra( int x, int y, int z ) +{ + if( has_extra( x, y, z ) ) { + overmap &om = get_om_global( x, y ); + om.delete_extra( x, y, z ); + } +} + overmap *overmapbuffer::get_existing( int x, int y ) { const point p {x, y}; @@ -361,6 +376,22 @@ const std::string &overmapbuffer::note( int x, int y, int z ) return om->note( x, y, z ); } +bool overmapbuffer::has_extra( int x, int y, int z ) +{ + const overmap *om = get_existing_om_global( x, y ); + return ( om != nullptr ) && om->has_extra( x, y, z ); +} + +const string_id &overmapbuffer::extra( int x, int y, int z ) +{ + const overmap *om = get_existing_om_global( x, y ); + if( om == nullptr ) { + static string_id id; + return id; + } + return om->extra( x, y, z ); +} + bool overmapbuffer::is_explored( int x, int y, int z ) { const overmap *om = get_existing_om_global( x, y ); @@ -1416,6 +1447,34 @@ overmapbuffer::t_notes_vector overmapbuffer::get_notes( int z, const std::string return result; } +overmapbuffer::t_extras_vector overmapbuffer::get_extras( int z, const std::string *pattern ) +{ + overmapbuffer::t_extras_vector result; + for( auto &it : overmaps ) { + const overmap &om = *it.second; + const int offset_x = om.pos().x * OMAPX; + const int offset_y = om.pos().y * OMAPY; + for( int i = 0; i < OMAPX; i++ ) { + for( int j = 0; j < OMAPY; j++ ) { + const string_id &extra = om.extra( i, j, z ); + if( extra.is_null() ) { + continue; + } + const std::string &extra_text = extra.c_str(); + if( pattern != nullptr && lcmatch( extra_text, *pattern ) ) { + // pattern not found in note text + continue; + } + result.push_back( t_point_with_extra( + point( offset_x + i, offset_y + j ), + om.extra( i, j, z ) + ) ); + } + } + } + return result; +} + bool overmapbuffer::is_safe( int x, int y, int z ) { for( auto &mongrp : monsters_at( x, y, z ) ) { diff --git a/src/overmapbuffer.h b/src/overmapbuffer.h index 64906e95fcf11..17b8cc8d33502 100644 --- a/src/overmapbuffer.h +++ b/src/overmapbuffer.h @@ -12,6 +12,7 @@ #include #include "enums.h" +#include "map_extras.h" #include "omdata.h" #include "overmap_types.h" #include "optional.h" @@ -147,6 +148,22 @@ class overmapbuffer void delete_note( const tripoint &p ) { delete_note( p.x, p.y, p.z ); } + bool has_extra( int x, int y, int z ); + bool has_extra( const tripoint &p ) { + return has_extra( p.x, p.y, p.z ); + } + const string_id &extra( int x, int y, int z ); + const string_id &extra( const tripoint &p ) { + return extra( p.x, p.y, p.z ); + } + void add_extra( int x, int y, int z, const string_id &id ); + void add_extra( const tripoint &p, const string_id &id ) { + add_extra( p.x, p.y, p.z, id ); + } + void delete_extra( int x, int y, int z ); + void delete_extra( const tripoint &p ) { + delete_extra( p.x, p.y, p.z ); + } bool is_explored( int x, int y, int z ); void toggle_explored( int x, int y, int z ); bool seen( int x, int y, int z ); @@ -373,6 +390,14 @@ class overmapbuffer t_notes_vector find_notes( int z, const std::string &pattern ) { return get_notes( z, &pattern ); // filter with pattern } + using t_point_with_extra = std::pair>; + using t_extras_vector = std::vector; + t_extras_vector get_all_extras( int z ) { + return get_extras( z, nullptr ); // NULL => don't filter extras + } + t_extras_vector find_extras( int z, const std::string &pattern ) { + return get_extras( z, &pattern ); // filter with pattern + } /** * Signal nearby hordes to move to given location. * @param center The origin of the signal, hordes (that recognize the signal) want to go @@ -491,6 +516,13 @@ class overmapbuffer * If the pattern is NULL, every note matches. */ t_notes_vector get_notes( int z, const std::string *pattern ); + /** + * Get a list of map extras in the (loaded) overmaps. + * @param z only this specific z-level is search for map extras. + * @param pattern only map extras that contain this pattern are returned. + * If the pattern is NULL, every map extra matches. + */ + t_extras_vector get_extras( int z, const std::string *pattern ); public: /** * See overmap::check_ot_type, this uses global diff --git a/src/panels.cpp b/src/panels.cpp index 1b5bfe192c152..b976214475933 100644 --- a/src/panels.cpp +++ b/src/panels.cpp @@ -2016,7 +2016,7 @@ void panel_manager::draw_adm( const catacurses::window &w, size_t column, size_t } } - column == 0 ? max_index = row_indices.size() : max_index = layouts.size(); + max_index = column == 0 ? row_indices.size() : layouts.size(); int vertical_offset = 0; int selected_offset = 0; size_t modified_index = row_indices[index - 1]; diff --git a/src/path_info.h b/src/path_info.h index b5db0a7d3a455..a7ba0caab07ac 100644 --- a/src/path_info.h +++ b/src/path_info.h @@ -29,6 +29,6 @@ void set_standard_filenames(); */ std::string find_translated_file( const std::string &pathid, const std::string &extension, const std::string &fallbackid ); -} +} // namespace PATH_INFO #endif diff --git a/src/pickup.cpp b/src/pickup.cpp index 7e1155eb9ec05..0371395e86f79 100644 --- a/src/pickup.cpp +++ b/src/pickup.cpp @@ -17,6 +17,7 @@ #include "game.h" #include "input.h" #include "item_search.h" +#include "item_location.h" #include "map.h" #include "mapdata.h" #include "messages.h" @@ -28,6 +29,7 @@ #include "translations.h" #include "ui.h" #include "vehicle.h" +#include "vehicle_selector.h" #include "vpart_position.h" #include "vpart_reference.h" #include "character.h" @@ -48,13 +50,9 @@ using ItemCount = std::pair; using PickupMap = std::map; // Pickup helper functions -static bool pick_one_up( const tripoint &pickup_target, item &newit, - vehicle *veh, int cargo_part, int index, int quantity, - bool &got_water, bool &offered_swap, +static bool pick_one_up( item_location &loc, int quantity, bool &got_water, bool &offered_swap, PickupMap &mapPickup, bool autopickup ); -static void remove_from_map_or_vehicle( const tripoint &pos, vehicle *veh, int cargo_part, - int moves_taken, int curmit ); static void show_pickup_message( const PickupMap &mapPickup ); struct pickup_count { @@ -63,12 +61,7 @@ struct pickup_count { int count = 0; }; -struct item_idx { - item _item; - size_t idx; -}; - -static bool select_autopickup_items( std::vector> &here, +static bool select_autopickup_items( std::vector> &here, std::vector &getitem ) { bool bFoundSomething = false; @@ -79,10 +72,10 @@ static bool select_autopickup_items( std::vector> &here, for( size_t iVol = 0, iNumChecked = 0; iNumChecked < here.size(); iVol++ ) { for( size_t i = 0; i < here.size(); i++ ) { bPickup = false; - std::list::iterator begin_iterator = here[i].begin(); - if( begin_iterator->_item.volume() / units::legacy_volume_factor == static_cast( iVol ) ) { + item_stack::iterator begin_iterator = here[i].front(); + if( begin_iterator->volume() / units::legacy_volume_factor == static_cast( iVol ) ) { iNumChecked++; - const std::string sItemName = begin_iterator->_item.tname( 1, false ); + const std::string sItemName = begin_iterator->tname( 1, false ); //Check the Pickup Rules if( get_auto_pickup().check_item( sItemName ) == RULE_WHITELISTED ) { @@ -90,7 +83,7 @@ static bool select_autopickup_items( std::vector> &here, } else if( get_auto_pickup().check_item( sItemName ) != RULE_BLACKLISTED ) { //No prematched pickup rule found //check rules in more detail - get_auto_pickup().create_rule( &begin_iterator->_item ); + get_auto_pickup().create_rule( &*begin_iterator ); if( get_auto_pickup().check_item( sItemName ) == RULE_WHITELISTED ) { bPickup = true; @@ -103,8 +96,8 @@ static bool select_autopickup_items( std::vector> &here, int weight_limit = get_option( "AUTO_PICKUP_WEIGHT_LIMIT" ); int volume_limit = get_option( "AUTO_PICKUP_VOL_LIMIT" ); if( weight_limit && volume_limit ) { - if( begin_iterator->_item.volume() <= units::from_milliliter( volume_limit * 50 ) && - begin_iterator->_item.weight() <= weight_limit * 50_gram && + if( begin_iterator->volume() <= units::from_milliliter( volume_limit * 50 ) && + begin_iterator->weight() <= weight_limit * 50_gram && get_auto_pickup().check_item( sItemName ) != RULE_BLACKLISTED ) { bPickup = true; } @@ -171,15 +164,19 @@ static pickup_answer handle_problematic_pickup( const item &it, bool &offered_sw } // Returns false if pickup caused a prompt and the player selected to cancel pickup -bool pick_one_up( const tripoint &pickup_target, item &newit, vehicle *veh, - int cargo_part, int index, int quantity, bool &got_water, - bool &offered_swap, PickupMap &mapPickup, bool autopickup ) +bool pick_one_up( item_location &loc, int quantity, bool &got_water, bool &offered_swap, + PickupMap &mapPickup, bool autopickup ) { player &u = g->u; int moves_taken = 100; bool picked_up = false; pickup_answer option = CANCEL; + + // We already checked in do_pickup if this was a nullptr + // Make copies so the original remains untouched if we bail out + item newit = *loc.get_item(); item leftovers = newit; + const auto wield_check = u.can_wield( newit ); if( newit.has_owner() && newit.get_owner() != g->faction_manager_ptr->get( faction_id( "your_followers" ) ) ) { @@ -194,8 +191,8 @@ bool pick_one_up( const tripoint &pickup_target, item &newit, vehicle *veh, newit.invlet = '\0'; } + // Handle charges, quantity == 0 means move all if( quantity != 0 && newit.count_by_charges() ) { - // Reinserting leftovers happens after item removal to avoid stacking issues. leftovers.charges = newit.charges - quantity; if( leftovers.charges > 0 ) { newit.charges = quantity; @@ -285,72 +282,46 @@ bool pick_one_up( const tripoint &pickup_target, item &newit, vehicle *veh, } if( picked_up ) { - remove_from_map_or_vehicle( pickup_target, veh, cargo_part, moves_taken, index ); - } - if( leftovers.charges > 0 ) { - bool to_map = veh == nullptr; - if( !to_map ) { - to_map = !veh->add_item( cargo_part, leftovers ); - } - if( to_map ) { - g->m.add_item_or_charges( pickup_target, leftovers ); + // 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 ); + } else { + loc.remove_item(); } + g->u.moves -= moves_taken; } return picked_up || !did_prompt; } -bool Pickup::do_pickup( const tripoint &pickup_target_arg, bool from_vehicle, - std::list &indices, std::list &quantities, bool autopickup ) +bool Pickup::do_pickup( std::vector &targets, std::vector &quantities, + bool autopickup ) { bool got_water = false; - int cargo_part = -1; - vehicle *veh = nullptr; bool weight_is_okay = ( g->u.weight_carried() <= g->u.weight_capacity() ); bool volume_is_okay = ( g->u.volume_carried() <= g->u.volume_capacity() ); bool offered_swap = false; - // Convert from player-relative to map-relative. - tripoint pickup_target = pickup_target_arg + g->u.pos(); + // Map of items picked up so we can output them all at the end and // merge dropping items with the same name. PickupMap mapPickup; - if( from_vehicle ) { - const cata::optional vp = g->m.veh_at( pickup_target ).part_with_feature( "CARGO", - false ); - if( !vp ) { - // Can't find the vehicle! bail out. - add_msg( m_info, _( "Lost track of vehicle." ) ); - return false; - } - veh = &vp->vehicle(); - cargo_part = vp->part_index(); - } - bool problem = false; - while( !problem && g->u.moves >= 0 && !indices.empty() ) { - // Pulling from the back of the (in-order) list of indices insures - // that we pull from the end of the vector. - int index = indices.back(); + while( !problem && g->u.moves >= 0 && !targets.empty() ) { + item_location target = std::move( targets.back() ); int quantity = quantities.back(); // Whether we pick the item up or not, we're done trying to do so, // so remove it from the list. - indices.pop_back(); + targets.pop_back(); quantities.pop_back(); - item *target = nullptr; - if( from_vehicle ) { - target = g->m.item_from( veh, cargo_part, index ); - } else { - target = g->m.item_from( pickup_target, index ); - } - - if( target == nullptr ) { - continue; // No such item. + if( !target ) { + debugmsg( "lost target item of ACT_DROP" ); + continue; } - problem = !pick_one_up( pickup_target, *target, veh, cargo_part, index, quantity, - got_water, offered_swap, mapPickup, autopickup ); + problem = !pick_one_up( target, quantity, got_water, offered_swap, mapPickup, autopickup ); } if( !mapPickup.empty() ) { @@ -427,15 +398,17 @@ void Pickup::pick_up( const tripoint &p, int min, from_where get_items_from ) } // which items are we grabbing? - std::vector here; + std::vector here; if( from_vehicle ) { - auto vehitems = veh->get_items( cargo_part ); - here.resize( vehitems.size() ); - std::copy( vehitems.begin(), vehitems.end(), here.begin() ); + vehicle_stack vehitems = veh->get_items( cargo_part ); + for( item_stack::iterator it = vehitems.begin(); it != vehitems.end(); ++it ) { + here.push_back( it ); + } } else { - auto mapitems = g->m.i_at( p ); - here.resize( mapitems.size() ); - std::copy( mapitems.begin(), mapitems.end(), here.begin() ); + map_stack mapitems = g->m.i_at( p ); + for( item_stack::iterator it = mapitems.begin(); it != mapitems.end(); ++it ) { + here.push_back( it ); + } } if( min == -1 ) { @@ -463,34 +436,35 @@ void Pickup::pick_up( const tripoint &p, int min, from_where get_items_from ) // Not many items, just grab them if( static_cast( here.size() ) <= min && min != -1 ) { g->u.assign_activity( activity_id( "ACT_PICKUP" ) ); - g->u.activity.placement = p - g->u.pos(); - g->u.activity.values.push_back( from_vehicle ); - // Only one item means index is 0. - g->u.activity.values.push_back( 0 ); + if( from_vehicle ) { + g->u.activity.targets.emplace_back( vehicle_cursor( *veh, cargo_part ), &*here.front() ); + } else { + g->u.activity.targets.emplace_back( map_cursor( p ), &*here.front() ); + } // auto-pickup means pick up all. g->u.activity.values.push_back( 0 ); return; } - std::vector> stacked_here; - for( size_t i = 0; i < here.size(); i++ ) { - item &it = here[i]; + std::vector> stacked_here; + for( item_stack::iterator it : here ) { bool found_stack = false; - for( auto &stack : stacked_here ) { - if( stack.begin()->_item.stacks_with( it ) ) { - item_idx el = { it, i }; - stack.push_back( el ); + for( std::list &stack : stacked_here ) { + if( stack.front()->stacks_with( *it ) ) { + stack.push_back( it ); found_stack = true; break; } } if( !found_stack ) { - std::list newstack; - newstack.push_back( { it, i } ); - stacked_here.push_back( newstack ); + stacked_here.emplace_back( std::list( { it } ) ); } } - std::reverse( stacked_here.begin(), stacked_here.end() ); + + // Items are stored unordered in colonies on the map, so sort them for a nice display. + std::sort( stacked_here.begin(), stacked_here.end(), []( const auto & lhs, const auto & rhs ) { + return *lhs.front() < *rhs.front(); + } ); if( min != -1 ) { // don't bother if we're just autopickuping g->temp_exit_fullscreen(); @@ -667,7 +641,7 @@ void Pickup::pick_up( const tripoint &p, int min, from_where get_items_from ) if( idx >= 0 && idx < static_cast( matches.size() ) ) { size_t true_idx = matches[idx]; if( itemcount != 0 || getitem[true_idx].count == 0 ) { - item &temp = stacked_here[true_idx].begin()->_item; + const item &temp = *stacked_here[true_idx].front(); int amount_available = temp.count_by_charges() ? temp.charges : stacked_here[true_idx].size(); if( itemcount >= amount_available ) { itemcount = 0; @@ -695,7 +669,7 @@ void Pickup::pick_up( const tripoint &p, int min, from_where get_items_from ) while( matches.empty() ) { auto filter_func = item_filter_from_string( new_filter ); for( size_t index = 0; index < stacked_here.size(); index++ ) { - if( filter_func( stacked_here[index].begin()->_item ) ) { + if( filter_func( *stacked_here[index].front() ) ) { matches.push_back( index ); } } @@ -727,7 +701,7 @@ void Pickup::pick_up( const tripoint &p, int min, from_where get_items_from ) wrefresh( g->w_terrain ); g->draw_panels( true ); } - item &selected_item = stacked_here[matches[selected]].begin()->_item; + const item &selected_item = *stacked_here[matches[selected]].front(); werase( w_item_info ); if( selected >= 0 && selected <= static_cast( stacked_here.size() ) - 1 ) { @@ -763,7 +737,7 @@ void Pickup::pick_up( const tripoint &p, int min, from_where get_items_from ) " " ); if( cur_it < static_cast( matches.size() ) ) { int true_it = matches[cur_it]; - item &this_item = stacked_here[ true_it ].begin()->_item; + const item &this_item = *stacked_here[true_it].front(); nc_color icolor = this_item.color_in_inventory(); if( cur_it == selected ) { icolor = hilite( c_white ); @@ -802,32 +776,32 @@ void Pickup::pick_up( const tripoint &p, int min, from_where get_items_from ) stealing = true; } } - if( stacked_here[true_it].begin()->_item.ammo_current() == "money" ) { + if( stacked_here[true_it].front()->is_money() ) { //Count charges // TODO: transition to the item_location system used for the inventory unsigned int charges_total = 0; - for( const auto &item : stacked_here[true_it] ) { - charges_total += item._item.charges; + for( const item_stack::iterator &it : stacked_here[true_it] ) { + charges_total += it->charges; } //Picking up none or all the cards in a stack if( !getitem[true_it].pick || getitem[true_it].count == 0 ) { - item_name = stacked_here[true_it].begin()->_item.display_money( stacked_here[true_it].size(), + item_name = stacked_here[true_it].front()->display_money( stacked_here[true_it].size(), charges_total ); } else { unsigned int charges = 0; int c = getitem[true_it].count; - for( auto it = stacked_here[true_it].begin(); it != stacked_here[true_it].end() && - c > 0; ++it, --c ) { - charges += it->_item.charges; + for( std::list::iterator it = stacked_here[true_it].begin(); + it != stacked_here[true_it].end() && c > 0; ++it, --c ) { + charges += ( *it )->charges; } if( stealing ) { //~ %s %s of %s ""!20 Cash Cards of $200" - ! added if stealing. item_name = string_format( _( "%s %s of %s" ), stolen, - stacked_here[true_it].begin()->_item.display_money( getitem[true_it].count, charges ), + stacked_here[true_it].front()->display_money( getitem[true_it].count, charges ), format_money( charges_total ) ); } else { item_name = string_format( _( "%s of %s" ), - stacked_here[true_it].begin()->_item.display_money( getitem[true_it].count, charges ), + stacked_here[true_it].front()->display_money( getitem[true_it].count, charges ), format_money( charges_total ) ); } } @@ -887,7 +861,8 @@ void Pickup::pick_up( const tripoint &p, int min, from_where get_items_from ) units::volume volume_picked_up = 0_ml; for( size_t i = 0; i < getitem.size(); i++ ) { if( getitem[i].pick ) { - item temp = stacked_here[i].begin()->_item; + // Make a copy for calculating weight/volume + item temp = *stacked_here[i].front(); if( temp.count_by_charges() && getitem[i].count < temp.charges && getitem[i].count != 0 ) { temp.charges = getitem[i].count; } @@ -940,63 +915,50 @@ void Pickup::pick_up( const tripoint &p, int min, from_where get_items_from ) // At this point we've selected our items, register an activity to pick them up. g->u.assign_activity( activity_id( "ACT_PICKUP" ) ); - g->u.activity.placement = p - g->u.pos(); - g->u.activity.values.push_back( from_vehicle ); if( min == -1 ) { // Auto pickup will need to auto resume since there can be several of them on the stack. g->u.activity.auto_resume = true; } - std::vector> pick_values; + std::vector> pick_values; for( size_t i = 0; i < stacked_here.size(); i++ ) { - const auto &selection = getitem[i]; + const pickup_count &selection = getitem[i]; if( !selection.pick ) { continue; } - const auto &stack = stacked_here[i]; + const std::list &stack = stacked_here[i]; // Note: items can be both charged and stacked // For robustness, let's assume they can be both in the same stack bool pick_all = selection.count == 0; - size_t count = selection.count; - for( const item_idx &it : stack ) { + int count = selection.count; + for( const item_stack::iterator &it : stack ) { if( !pick_all && count == 0 ) { break; } - if( it._item.count_by_charges() ) { - size_t num_picked = std::min( static_cast( it._item.charges ), count ); - pick_values.push_back( { static_cast( it.idx ), static_cast( num_picked ) } ); + if( it->count_by_charges() ) { + int num_picked = std::min( it->charges, count ); + pick_values.emplace_back( it, num_picked ); count -= num_picked; } else { - size_t num_picked = 1; - pick_values.push_back( { static_cast( it.idx ), 0 } ); - count -= num_picked; + pick_values.emplace_back( it, 0 ); + --count; } } } - // The pickup activity picks up items last-to-first from its values list, so make sure the - // higher indices are at the end. - std::sort( pick_values.begin(), pick_values.end() ); - for( auto &it : pick_values ) { - g->u.activity.values.push_back( it.first ); - g->u.activity.values.push_back( it.second ); + + for( std::pair &iter_qty : pick_values ) { + if( from_vehicle ) { + g->u.activity.targets.emplace_back( vehicle_cursor( *veh, cargo_part ), &*iter_qty.first ); + } else { + g->u.activity.targets.emplace_back( map_cursor( p ), &*iter_qty.first ); + } + g->u.activity.values.push_back( iter_qty.second ); } g->reenter_fullscreen(); } -//helper function for Pickup::pick_up (singular item) -void remove_from_map_or_vehicle( const tripoint &pos, vehicle *veh, int cargo_part, - int moves_taken, int curmit ) -{ - if( veh != nullptr ) { - veh->remove_item( cargo_part, curmit ); - } else { - g->m.i_rem( pos, curmit ); - } - g->u.moves -= moves_taken; -} - //helper function for Pickup::pick_up void show_pickup_message( const PickupMap &mapPickup ) { diff --git a/src/pickup.h b/src/pickup.h index 11a2edc2bf967..345587609b6e1 100644 --- a/src/pickup.h +++ b/src/pickup.h @@ -2,9 +2,10 @@ #ifndef PICKUP_H #define PICKUP_H -#include +#include class item; +class item_location; class Character; class map; struct tripoint; @@ -15,8 +16,8 @@ namespace Pickup * Returns `false` if the player was presented a prompt and decided to cancel the pickup. * `true` in other cases. */ -bool do_pickup( const tripoint &pickup_target_arg, bool from_vehicle, - std::list &indices, std::list &quantities, bool autopickup ); +bool do_pickup( std::vector &targets, std::vector &quantities, + bool autopickup ); enum from_where : int { from_cargo = 0, @@ -39,6 +40,6 @@ int cost_to_move_item( const Character &who, const item &it ); * @param m map they are on */ bool handle_spillable_contents( Character &c, item &it, map &m ); -} +} // namespace Pickup #endif diff --git a/src/pixel_minimap.cpp b/src/pixel_minimap.cpp index 510ae43e77dff..826cc8e21061c 100644 --- a/src/pixel_minimap.cpp +++ b/src/pixel_minimap.cpp @@ -79,7 +79,7 @@ SDL_Color get_critter_color( Creature *critter, int flicker, int mixture ) return result; } -} +} // namespace // a texture pool to avoid recreating textures every time player changes their view // at most 142 out of 144 textures can be in use due to regular player movement diff --git a/src/player.cpp b/src/player.cpp index 13e4bc9500a27..b232009859af3 100644 --- a/src/player.cpp +++ b/src/player.cpp @@ -282,9 +282,6 @@ static const trait_id trait_CHITIN_FUR2( "CHITIN_FUR2" ); static const trait_id trait_CHITIN_FUR3( "CHITIN_FUR3" ); static const trait_id trait_CHLOROMORPH( "CHLOROMORPH" ); static const trait_id trait_CLUMSY( "CLUMSY" ); -static const trait_id trait_COLDBLOOD( "COLDBLOOD" ); -static const trait_id trait_COLDBLOOD2( "COLDBLOOD2" ); -static const trait_id trait_COLDBLOOD3( "COLDBLOOD3" ); static const trait_id trait_COLDBLOOD4( "COLDBLOOD4" ); static const trait_id trait_COMPOUND_EYES( "COMPOUND_EYES" ); static const trait_id trait_DEAF( "DEAF" ); @@ -379,6 +376,7 @@ static const trait_id trait_PRED2( "PRED2" ); static const trait_id trait_PRED3( "PRED3" ); static const trait_id trait_PRED4( "PRED4" ); static const trait_id trait_PROF_DICEMASTER( "PROF_DICEMASTER" ); +static const trait_id trait_PROF_FOODP( "PROF_FOODP" ); static const trait_id trait_PROF_SKATER( "PROF_SKATER" ); static const trait_id trait_PSYCHOPATH( "PSYCHOPATH" ); static const trait_id trait_PYROMANIA( "PYROMANIA" ); @@ -955,6 +953,24 @@ void player::apply_persistent_morale() add_morale( MORALE_PERM_NOMAD, -pen, -pen, 1_minutes, 1_minutes, true ); } } + + if( has_trait( trait_PROF_FOODP ) ) { + // Loosing your face is distressing + if( !( is_wearing( itype_id( "foodperson_mask" ) ) || + is_wearing( itype_id( "foodperson_mask_on" ) ) ) ) { + add_morale( MORALE_PERM_NOFACE, -20, -20, 1_minutes, 1_minutes, true ); + } else if( is_wearing( itype_id( "foodperson_mask" ) ) || + is_wearing( itype_id( "foodperson_mask_on" ) ) ) { + rem_morale( MORALE_PERM_NOFACE ); + } + + if( is_wearing( itype_id( "foodperson_mask_on" ) ) ) { + add_morale( MORALE_PERM_FPMODE_ON, 10, 10, 1_minutes, 1_minutes, true ); + } else { + rem_morale( MORALE_PERM_FPMODE_ON ); + } + } + } void player::update_mental_focus() @@ -1790,14 +1806,12 @@ void player::recalc_speed_bonus() if( has_trait( trait_SUNLIGHT_DEPENDENT ) && !g->is_in_sunlight( pos() ) ) { mod_speed_bonus( -( g->light_level( posz() ) >= 12 ? 5 : 10 ) ); } - /* Cache call to game::get_temperature( player position ) since it can be used several times here */ - const auto player_local_temp = g->weather.get_temperature( pos() ); - if( has_trait( trait_COLDBLOOD4 ) || ( has_trait( trait_COLDBLOOD3 ) && player_local_temp < 65 ) ) { - mod_speed_bonus( ( player_local_temp - 65 ) / 2 ); - } else if( has_trait( trait_COLDBLOOD2 ) && player_local_temp < 65 ) { - mod_speed_bonus( ( player_local_temp - 65 ) / 3 ); - } else if( has_trait( trait_COLDBLOOD ) && player_local_temp < 65 ) { - mod_speed_bonus( ( player_local_temp - 65 ) / 5 ); + const float temperature_speed_modifier = mutation_value( "temperature_speed_modifier" ); + if( temperature_speed_modifier != 0 ) { + const auto player_local_temp = g->weather.get_temperature( pos() ); + if( has_trait( trait_COLDBLOOD4 ) || player_local_temp < 65 ) { + mod_speed_bonus( ( player_local_temp - 65 ) * temperature_speed_modifier ); + } } } @@ -2830,6 +2844,7 @@ void player::pause() search_surroundings(); } + void player::set_movement_mode( const std::string &new_mode ) { if( new_mode == "run" ) { @@ -2955,7 +2970,7 @@ int player::read_speed( bool return_stat_effect ) const // Stat window shows stat effects on based on current stat const int intel = get_int(); /** @EFFECT_INT increases reading speed */ - int ret = to_moves( 1_minutes ) - to_moves( 30_seconds ) * ( intel - 8 ); + int ret = to_moves( 1_minutes ) - to_moves( 3_seconds ) * ( intel - 8 ); if( has_bionic( afs_bio_linguistic_coprocessor ) ) { // Aftershock ret *= .85; @@ -5226,7 +5241,7 @@ void player::suffer() } } - if( has_trait( trait_SHARKTEETH ) && one_in( to_turns( 24_hours ) ) ) { + 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 ); } @@ -5291,11 +5306,11 @@ void player::suffer() } } if( has_trait( trait_CHEMIMBALANCE ) ) { - if( one_in( to_turns( 6_hours ) ) && !has_trait( trait_NOPAIN ) ) { + if( one_turn_in( 6_hours ) && !has_trait( trait_NOPAIN ) ) { add_msg_if_player( m_bad, _( "You suddenly feel sharp pain for no reason." ) ); mod_pain( 3 * rng( 1, 3 ) ); } - if( one_in( to_turns( 6_hours ) ) ) { + if( one_turn_in( 6_hours ) ) { int pkilladd = 5 * rng( -1, 2 ); if( pkilladd > 0 ) { add_msg_if_player( m_bad, _( "You suddenly feel numb." ) ); @@ -5304,11 +5319,11 @@ void player::suffer() } mod_painkiller( pkilladd ); } - if( one_in( to_turns( 6_hours ) ) ) { + if( one_turn_in( 6_hours ) ) { add_msg_if_player( m_bad, _( "You feel dizzy for a moment." ) ); moves -= rng( 10, 30 ); } - if( one_in( to_turns( 6_hours ) ) ) { + if( one_turn_in( 6_hours ) ) { int hungadd = 5 * rng( -1, 3 ); if( hungadd > 0 ) { add_msg_if_player( m_bad, _( "You suddenly feel hungry." ) ); @@ -5317,22 +5332,22 @@ void player::suffer() } mod_hunger( hungadd ); } - if( one_in( to_turns( 6_hours ) ) ) { + if( one_turn_in( 6_hours ) ) { add_msg_if_player( m_bad, _( "You suddenly feel thirsty." ) ); mod_thirst( 5 * rng( 1, 3 ) ); } - if( one_in( to_turns( 6_hours ) ) ) { + if( one_turn_in( 6_hours ) ) { add_msg_if_player( m_good, _( "You feel fatigued all of a sudden." ) ); mod_fatigue( 10 * rng( 2, 4 ) ); } - if( one_in( to_turns( 8_hours ) ) ) { + if( one_turn_in( 8_hours ) ) { if( one_in( 3 ) ) { add_morale( MORALE_FEELING_GOOD, 20, 100 ); } else { add_morale( MORALE_FEELING_BAD, -20, -100 ); } } - if( one_in( to_turns( 6_hours ) ) ) { + if( one_turn_in( 6_hours ) ) { if( one_in( 3 ) ) { add_msg_if_player( m_bad, _( "You suddenly feel very cold." ) ); temp_cur.fill( BODYTEMP_VERY_COLD ); @@ -5341,7 +5356,7 @@ void player::suffer() temp_cur.fill( BODYTEMP_COLD ); } } - if( one_in( to_turns( 6_hours ) ) ) { + if( one_turn_in( 6_hours ) ) { if( one_in( 3 ) ) { add_msg_if_player( m_bad, _( "You suddenly feel very hot." ) ); temp_cur.fill( BODYTEMP_VERY_HOT ); @@ -5355,12 +5370,12 @@ void player::suffer() if( is_player() ) { bool done_effect = false; // Sound - if( one_in( to_turns( 4_hours ) ) ) { + if( one_turn_in( 4_hours ) ) { sound_hallu(); } // Follower turns hostile - if( !done_effect && one_in( to_turns( 4_hours ) ) ) { + if( !done_effect && one_turn_in( 4_hours ) ) { std::vector> followers = overmap_buffer.get_npcs_near_player( 12 ); std::string who_gets_angry = name; @@ -5372,7 +5387,7 @@ void player::suffer() } // Monster dies - if( !done_effect && one_in( to_turns( 6_hours ) ) ) { + if( !done_effect && one_turn_in( 6_hours ) ) { // TODO: move to monster group json static const mtype_id mon_zombie( "mon_zombie" ); @@ -5389,13 +5404,13 @@ void player::suffer() } // Limb Breaks - if( !done_effect && one_in( to_turns( 4_hours ) ) ) { + if( !done_effect && one_turn_in( 4_hours ) ) { add_msg( m_bad, _( "Your limb breaks!" ) ); done_effect = true; } // NPC chat - if( !done_effect && one_in( to_turns( 4_hours ) ) ) { + if( !done_effect && one_turn_in( 4_hours ) ) { std::string i_name = Name::generate( one_in( 2 ) ); std::string i_talk = SNIPPET.random_from_category( "" ); @@ -5406,7 +5421,7 @@ void player::suffer() } // Skill raise - if( !done_effect && one_in( to_turns( 12_hours ) ) ) { + if( !done_effect && one_turn_in( 12_hours ) ) { skill_id raised_skill = Skill::random_skill(); add_msg( m_good, _( "You increase %1$s to level %2$d." ), raised_skill.obj().name(), get_skill_level( raised_skill ) + 1 ); @@ -5414,7 +5429,7 @@ void player::suffer() } // Talk to self - if( !done_effect && one_in( to_turns( 4_hours ) ) ) { + if( !done_effect && one_turn_in( 4_hours ) ) { std::vector talk_s{ _( "Hey, can you hear me?" ), _( "Don't touch me." ), _( "What's your name?" ), @@ -5457,8 +5472,7 @@ void player::suffer() std::string i_talk_w; bool does_talk = false; - if( !mons.empty() && - one_in( to_turns( 12_minutes ) ) ) { + if( !mons.empty() && one_turn_in( 12_minutes ) ) { std::vector mon_near{ _( "Hey, let's go kill that %1$s!" ), _( "Did you see that %1$s!?" ), _( "I want to kill that %1$s!" ), @@ -5480,8 +5494,7 @@ void player::suffer() i_talk_w = string_format( talk_w, random_entry_ref( seen_mons ) ); does_talk = true; } - } else if( has_effect( effect_bleed ) && - one_in( to_turns( 5_minutes ) ) ) { + } else if( has_effect( effect_bleed ) && one_turn_in( 5_minutes ) ) { std::vector bleeding{ _( "Hey, you're bleeding." ), _( "Your wound looks pretty bad." ), _( "Shouldn't you put a bandage on that?" ), @@ -5492,8 +5505,7 @@ void player::suffer() _( "Kill a few more before you bleed out!" ) }; i_talk_w = random_entry_ref( bleeding ); does_talk = true; - } else if( weapon.damage() >= weapon.max_damage() / 3 && - one_in( to_turns( 1_hours ) ) ) { + } else if( weapon.damage() >= weapon.max_damage() / 3 && one_turn_in( 1_hours ) ) { std::vector damaged{ _( "Hey fix me up." ), _( "I need healing!" ), _( "I hurt all over..." ), @@ -5506,7 +5518,7 @@ void player::suffer() _( "Am I gonna die?" ) }; i_talk_w = random_entry_ref( damaged ); does_talk = true; - } else if( one_in( to_turns( 4_hours ) ) ) { + } else if( one_turn_in( 4_hours ) ) { std::vector misc{ _( "Let me kill something already!" ), _( "I'm your best friend, right?" ), _( "I love you!" ), @@ -5525,41 +5537,41 @@ void player::suffer() done_effect = true; } // Bad feeling - if( !done_effect && one_in( to_turns( 4_hours ) ) ) { + if( !done_effect && one_turn_in( 4_hours ) ) { add_msg( m_warning, _( "You get a bad feeling." ) ); add_morale( MORALE_FEELING_BAD, -50, -150 ); done_effect = true; } // Formication - if( !done_effect && one_in( to_turns( 4_hours ) ) ) { + if( !done_effect && one_turn_in( 4_hours ) ) { body_part bp = random_body_part( true ); add_effect( effect_formication, 1_hours, bp ); done_effect = true; } // Numbness - if( !done_effect && one_in( to_turns( 4_hours ) ) ) { + if( !done_effect && one_turn_in( 4_hours ) ) { add_msg( m_bad, _( "You suddenly feel so numb..." ) ); mod_painkiller( 25 ); done_effect = true; } // Hallucination - if( !done_effect && one_in( to_turns( 6_hours ) ) ) { + if( !done_effect && one_turn_in( 6_hours ) ) { add_effect( effect_hallu, 6_hours ); done_effect = true; } // Visuals - if( !done_effect && one_in( to_turns( 2_hours ) ) ) { + if( !done_effect && one_turn_in( 2_hours ) ) { add_effect( effect_visuals, rng( 15_turns, 60_turns ) ); done_effect = true; } // Shaking - if( !done_effect && one_in( to_turns( 4_hours ) ) ) { + if( !done_effect && one_turn_in( 4_hours ) ) { add_msg( m_bad, _( "You start to shake uncontrollably." ) ); add_effect( effect_shakes, rng( 2_minutes, 5_minutes ) ); done_effect = true; } // Shout - if( !done_effect && one_in( to_turns( 4_hours ) ) ) { + if( !done_effect && one_turn_in( 4_hours ) ) { std::vector shouts{ _( "\"Get away from there!\"" ), _( "\"What do you think you're doing?\"" ), _( "\"Stop laughing at me!\"" ), @@ -5581,7 +5593,7 @@ void player::suffer() done_effect = true; } // Drop weapon - if( !done_effect && one_in( to_turns( 2_days ) ) ) { + if( !done_effect && one_turn_in( 2_days ) ) { if( !weapon.is_null() ) { std::string i_name_w = weapon.has_var( "item_label" ) ? weapon.get_var( "item_label" ) : @@ -5607,7 +5619,7 @@ void player::suffer() } if( ( has_trait( trait_NARCOLEPTIC ) || has_artifact_with( AEP_SCHIZO ) ) ) { - if( one_in( to_turns( 8_hours ) ) ) { + if( one_turn_in( 8_hours ) ) { add_msg( m_bad, _( "You're suddenly overcome with the urge to sleep and you pass out." ) ); add_effect( effect_lying_down, 20_minutes ); } @@ -5622,7 +5634,7 @@ void player::suffer() } } - if( has_trait( trait_MOODSWINGS ) && one_in( to_turns( 6_hours ) ) ) { + if( has_trait( trait_MOODSWINGS ) && one_turn_in( 6_hours ) ) { if( rng( 1, 20 ) > 9 ) { // 55% chance add_morale( MORALE_MOODSWING, -100, -500 ); } else { // 45% chance @@ -5630,23 +5642,23 @@ void player::suffer() } } - if( has_trait( trait_VOMITOUS ) && one_in( to_turns( 7_hours ) ) ) { + if( has_trait( trait_VOMITOUS ) && one_turn_in( 7_hours ) ) { vomit(); } - if( has_trait( trait_SHOUT1 ) && one_in( to_turns( 6_hours ) ) ) { + if( has_trait( trait_SHOUT1 ) && one_turn_in( 6_hours ) ) { shout(); } - if( has_trait( trait_SHOUT2 ) && one_in( to_turns( 4_hours ) ) ) { + if( has_trait( trait_SHOUT2 ) && one_turn_in( 4_hours ) ) { shout(); } - if( has_trait( trait_SHOUT3 ) && one_in( to_turns( 3_hours ) ) ) { + if( has_trait( trait_SHOUT3 ) && one_turn_in( 3_hours ) ) { shout(); } - if( has_trait( trait_M_SPORES ) && one_in( to_turns( 4_hours ) ) ) { + if( has_trait( trait_M_SPORES ) && one_turn_in( 4_hours ) ) { spores(); } - if( has_trait( trait_M_BLOSSOMS ) && one_in( to_turns( 3_hours ) ) ) { + if( has_trait( trait_M_BLOSSOMS ) && one_turn_in( 3_hours ) ) { blossoms(); } } // Done with while-awake-only effects @@ -5766,26 +5778,26 @@ void player::suffer() } if( get_pain() > 0 ) { - if( has_trait( trait_PAINREC1 ) && one_in( to_turns( 1_hours ) ) ) { + if( has_trait( trait_PAINREC1 ) && one_turn_in( 1_hours ) ) { mod_pain( -1 ); } - if( has_trait( trait_PAINREC2 ) && one_in( to_turns( 30_minutes ) ) ) { + if( has_trait( trait_PAINREC2 ) && one_turn_in( 30_minutes ) ) { mod_pain( -1 ); } - if( has_trait( trait_PAINREC3 ) && one_in( to_turns( 15_minutes ) ) ) { + if( has_trait( trait_PAINREC3 ) && one_turn_in( 15_minutes ) ) { mod_pain( -1 ); } } if( ( has_trait( trait_ALBINO ) || has_effect( effect_datura ) ) && - g->is_in_sunlight( pos() ) && one_in( to_turns( 1_minutes ) ) ) { + g->is_in_sunlight( pos() ) && one_turn_in( 1_minutes ) ) { // Umbrellas can keep the sun off the skin and sunglasses - off the eyes. if( !weapon.has_flag( "RAIN_PROTECT" ) ) { add_msg_if_player( m_bad, _( "The sunlight is really irritating your skin." ) ); if( has_effect( effect_sleep ) && !has_effect( effect_narcosis ) ) { wake_up(); } - if( one_in( to_turns( 1_minutes ) ) ) { + if( one_turn_in( 1_minutes ) ) { mod_pain( 1 ); } else { focus_pool --; @@ -5795,7 +5807,7 @@ void player::suffer() ( wearing_something_on( bp_eyes ) ) ) && !has_bionic( bionic_id( "bio_sunglasses" ) ) ) { add_msg_if_player( m_bad, _( "The sunlight is really irritating your eyes." ) ); - if( one_in( to_turns( 1_minutes ) ) ) { + if( one_turn_in( 1_minutes ) ) { mod_pain( 1 ); } else { focus_pool --; @@ -5850,45 +5862,45 @@ void player::suffer() } //Web Weavers...weave web if( has_active_mutation( trait_WEB_WEAVER ) && !in_vehicle ) { - g->m.add_field( pos(), fd_web, 1 ); //this adds density to if its not already there. + // this adds intensity to if its not already there. + g->m.add_field( pos(), fd_web, 1 ); } // Blind/Deaf for brief periods about once an hour, // and visuals about once every 30 min. if( has_trait( trait_PER_SLIME ) ) { - if( one_in( to_turns( 1_hours ) ) && !has_effect( effect_deaf ) ) { + if( one_turn_in( 1_hours ) && !has_effect( effect_deaf ) ) { add_msg_if_player( m_bad, _( "Suddenly, you can't hear anything!" ) ); add_effect( effect_deaf, rng( 20_minutes, 60_minutes ) ); } - if( one_in( to_turns( 1_hours ) ) && !( has_effect( effect_blind ) ) ) { + if( one_turn_in( 1_hours ) && !( has_effect( effect_blind ) ) ) { add_msg_if_player( m_bad, _( "Suddenly, your eyes stop working!" ) ); add_effect( effect_blind, rng( 2_minutes, 6_minutes ) ); } // Yes, you can be blind and hallucinate at the same time. // Your post-human biology is truly remarkable. - if( one_in( to_turns( 30_minutes ) ) && !( has_effect( effect_visuals ) ) ) { + if( one_turn_in( 30_minutes ) && !( has_effect( effect_visuals ) ) ) { add_msg_if_player( m_bad, _( "Your visual centers must be acting up..." ) ); add_effect( effect_visuals, rng( 36_minutes, 72_minutes ) ); } } if( has_trait( trait_WEB_SPINNER ) && !in_vehicle && one_in( 3 ) ) { - g->m.add_field( pos(), fd_web, 1 ); //this adds density to if its not already there. + // this adds intensity to if its not already there. + g->m.add_field( pos(), fd_web, 1 ); } - if( has_trait( trait_UNSTABLE ) && !has_trait( trait_CHAOTIC_BAD ) && - one_in( to_turns( 48_hours ) ) ) { + if( has_trait( trait_UNSTABLE ) && !has_trait( trait_CHAOTIC_BAD ) && one_turn_in( 48_hours ) ) { mutate(); } - if( ( has_trait( trait_CHAOTIC ) || has_trait( trait_CHAOTIC_BAD ) ) && - one_in( to_turns( 12_hours ) ) ) { + if( ( has_trait( trait_CHAOTIC ) || has_trait( trait_CHAOTIC_BAD ) ) && one_turn_in( 12_hours ) ) { mutate(); } - if( has_artifact_with( AEP_MUTAGENIC ) && one_in( to_turns( 48_hours ) ) ) { + if( has_artifact_with( AEP_MUTAGENIC ) && one_turn_in( 48_hours ) ) { mutate(); } - if( has_artifact_with( AEP_FORCE_TELEPORT ) && one_in( to_turns( 1_hours ) ) ) { + if( has_artifact_with( AEP_FORCE_TELEPORT ) && one_turn_in( 1_hours ) ) { g->teleport( this ); } const bool needs_fire = !has_morale( MORALE_PYROMANIA_NEARFIRE ) && @@ -6080,8 +6092,7 @@ void player::suffer() } // Negative bionics effects - if( has_bionic( bio_dis_shock ) && one_in( to_turns( 2_hours ) ) && - !has_effect( effect_narcosis ) ) { + if( has_bionic( bio_dis_shock ) && one_turn_in( 2_hours ) && !has_effect( effect_narcosis ) ) { add_msg_if_player( m_bad, _( "You suffer a painful electrical discharge!" ) ); mod_pain( 1 ); moves -= 150; @@ -6097,18 +6108,18 @@ void player::suffer() } sfx::play_variant_sound( "bionics", "elec_discharge", 100 ); } - if( has_bionic( bio_dis_acid ) && one_in( to_turns( 150_minutes ) ) ) { + if( has_bionic( bio_dis_acid ) && one_turn_in( 150_minutes ) ) { 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 ); } - if( has_bionic( bio_drain ) && power_level > 24 && one_in( to_turns( 1_hours ) ) ) { + if( has_bionic( bio_drain ) && power_level > 24 && one_turn_in( 1_hours ) ) { add_msg_if_player( m_bad, _( "Your batteries discharge slightly." ) ); charge_power( -25 ); sfx::play_variant_sound( "bionics", "elec_crackle_low", 100 ); } - if( has_bionic( bio_noise ) && one_in( to_turns( 50_minutes ) ) && + if( has_bionic( bio_noise ) && one_turn_in( 50_minutes ) && !has_effect( effect_narcosis ) ) { // TODO: NPCs with said bionic if( !is_deaf() ) { @@ -6124,14 +6135,14 @@ void player::suffer() power_level >= max_power_level * .75 ) { mod_str_bonus( -3 ); } - if( has_bionic( bio_trip ) && one_in( to_turns( 50_minutes ) ) && + if( has_bionic( bio_trip ) && one_turn_in( 50_minutes ) && !has_effect( effect_visuals ) && !has_effect( effect_narcosis ) && !in_sleep_state() ) { add_msg_if_player( m_bad, _( "Your vision pixelates!" ) ); add_effect( effect_visuals, 10_minutes ); sfx::play_variant_sound( "bionics", "pixelated", 100 ); } - if( has_bionic( bio_spasm ) && one_in( to_turns( 5_hours ) ) && !has_effect( effect_downed ) && + if( has_bionic( bio_spasm ) && one_turn_in( 5_hours ) && !has_effect( effect_downed ) && !has_effect( effect_narcosis ) ) { add_msg_if_player( m_bad, _( "Your malfunctioning bionic causes you to spasm and fall to the floor!" ) ); @@ -6140,27 +6151,25 @@ void player::suffer() add_effect( effect_downed, 1_turns, num_bp, false, 0, true ); sfx::play_variant_sound( "bionics", "elec_crackle_high", 100 ); } - if( has_bionic( bio_shakes ) && power_level > 24 && one_in( to_turns( 2_hours ) ) ) { + if( has_bionic( bio_shakes ) && power_level > 24 && one_turn_in( 2_hours ) ) { add_msg_if_player( m_bad, _( "Your bionics short-circuit, causing you to tremble and shiver." ) ); charge_power( -25 ); add_effect( effect_shakes, 5_minutes ); sfx::play_variant_sound( "bionics", "elec_crackle_med", 100 ); } - if( has_bionic( bio_leaky ) && one_in( to_turns( 6_minutes ) ) ) { + if( has_bionic( bio_leaky ) && one_turn_in( 6_minutes ) ) { mod_healthy_mod( -1, -200 ); } - if( has_bionic( bio_sleepy ) && one_in( to_turns( 50_minutes ) ) && !in_sleep_state() ) { + if( has_bionic( bio_sleepy ) && one_turn_in( 50_minutes ) && !in_sleep_state() ) { mod_fatigue( 1 ); } - if( has_bionic( bio_itchy ) && one_in( to_turns( 50_minutes ) ) && - !has_effect( effect_formication ) && + if( has_bionic( bio_itchy ) && one_turn_in( 50_minutes ) && !has_effect( effect_formication ) && !has_effect( effect_narcosis ) ) { add_msg_if_player( m_bad, _( "Your malfunctioning bionic itches!" ) ); body_part bp = random_body_part( true ); add_effect( effect_formication, 10_minutes, bp ); } - if( has_bionic( bio_glowy ) && !has_effect( effect_glowy_led ) && - one_in( to_turns( 50_minutes ) ) && + if( has_bionic( bio_glowy ) && !has_effect( effect_glowy_led ) && one_turn_in( 50_minutes ) && power_level > 1 ) { add_msg_if_player( m_bad, _( "Your malfunctioning bionic starts to glow!" ) ); add_effect( effect_glowy_led, 5_minutes ); @@ -6174,7 +6183,7 @@ void player::suffer() // Stim +250 kills if( stim > 210 ) { - if( one_in( to_turns( 2_minutes ) ) && !has_effect( effect_downed ) ) { + if( one_turn_in( 2_minutes ) && !has_effect( effect_downed ) ) { add_msg_if_player( m_bad, _( "Your muscles spasm!" ) ); if( !has_effect( effect_downed ) ) { add_msg_if_player( m_bad, _( "You fall to the ground!" ) ); @@ -6195,7 +6204,7 @@ void player::suffer() } } if( stim > 75 ) { - if( !one_in( to_turns( 2_minutes ) ) && !has_effect( effect_nausea ) ) { + if( !one_turn_in( 2_minutes ) && !has_effect( effect_nausea ) ) { add_msg( _( "You feel nauseous..." ) ); add_effect( effect_nausea, 5_minutes ); } @@ -6203,7 +6212,7 @@ void player::suffer() // Stim -200 or painkillers 240 kills if( stim < -160 || pkill > 200 ) { - if( one_in( to_turns( 3_minutes ) ) && !in_sleep_state() ) { + if( one_turn_in( 3_minutes ) && !in_sleep_state() ) { add_msg_if_player( m_bad, _( "You black out!" ) ); const time_duration dur = rng( 30_minutes, 60_minutes ); add_effect( effect_downed, dur ); @@ -6218,7 +6227,7 @@ void player::suffer() } } if( stim < -85 || pkill > 145 ) { - if( one_in( to_turns( 15_seconds ) ) ) { + if( one_turn_in( 15_seconds ) ) { add_msg_if_player( m_bad, _( "You feel dizzy for a moment." ) ); mod_moves( -rng( 10, 30 ) ); if( one_in( 3 ) && !has_effect( effect_downed ) ) { @@ -6246,7 +6255,7 @@ void player::suffer() // Harmless warnings if( sleep_deprivation >= SLEEP_DEPRIVATION_HARMLESS ) { - if( one_in( to_turns( 50_minutes ) ) ) { + if( one_turn_in( 50_minutes ) ) { switch( dice( 1, 4 ) ) { default: case 1: @@ -6270,51 +6279,51 @@ void player::suffer() } // Minor discomfort if( sleep_deprivation >= SLEEP_DEPRIVATION_MINOR ) { - if( one_in( to_turns( 75_minutes ) ) ) { + if( one_turn_in( 75_minutes ) ) { add_msg_if_player( m_warning, _( "You feel lightheaded for a moment." ) ); moves -= 10; } - if( one_in( to_turns( 100_minutes ) ) ) { + if( one_turn_in( 100_minutes ) ) { add_msg_if_player( m_warning, _( "Your muscles spasm uncomfortably." ) ); mod_pain( 2 ); } - if( !has_effect( effect_visuals ) && one_in( to_turns( 150_minutes ) ) ) { + if( !has_effect( effect_visuals ) && one_turn_in( 150_minutes ) ) { add_msg_if_player( m_warning, _( "Your vision blurs a little." ) ); add_effect( effect_visuals, rng( 1_minutes, 5_minutes ) ); } } // Slight disability if( sleep_deprivation >= SLEEP_DEPRIVATION_SERIOUS ) { - if( one_in( to_turns( 75_minutes ) ) ) { + if( one_turn_in( 75_minutes ) ) { add_msg_if_player( m_bad, _( "Your mind lapses into unawareness briefly." ) ); moves -= rng( 20, 80 ); } - if( one_in( to_turns( 125_minutes ) ) ) { + if( one_turn_in( 125_minutes ) ) { add_msg_if_player( m_bad, _( "Your muscles ache in stressfully unpredictable ways." ) ); mod_pain( rng( 2, 10 ) ); } - if( one_in( to_turns( 5_hours ) ) ) { + if( one_turn_in( 5_hours ) ) { add_msg_if_player( m_bad, _( "You have a distractingly painful headache." ) ); mod_pain( rng( 10, 25 ) ); } } // Major disability, high chance of passing out also relevant if( sleep_deprivation >= SLEEP_DEPRIVATION_MAJOR ) { - if( !has_effect( effect_nausea ) && one_in( to_turns( 500_minutes ) ) ) { + if( !has_effect( effect_nausea ) && one_turn_in( 500_minutes ) ) { add_msg_if_player( m_bad, _( "You feel heartburn and an acid taste in your mouth." ) ); mod_pain( 5 ); add_effect( effect_nausea, rng( 5_minutes, 30_minutes ) ); } - if( one_in( to_turns( 5_hours ) ) ) { + if( one_turn_in( 5_hours ) ) { add_msg_if_player( m_bad, _( "Your mind is so tired that you feel you can't trust your eyes anymore." ) ); add_effect( effect_hallu, rng( 5_minutes, 60_minutes ) ); } - if( !has_effect( effect_shakes ) && one_in( to_turns( 425_minutes ) ) ) { + if( !has_effect( effect_shakes ) && one_turn_in( 425_minutes ) ) { add_msg_if_player( m_bad, _( "Your muscles spasm uncontrollably, and you have trouble keeping your balance." ) ); add_effect( effect_shakes, 15_minutes ); - } else if( has_effect( effect_shakes ) && one_in( to_turns( 75_seconds ) ) ) { + } else if( has_effect( effect_shakes ) && one_turn_in( 75_seconds ) ) { moves -= 10; add_msg_player_or_npc( m_warning, _( "Your shaking legs make you stumble." ), _( " stumbles." ) ); @@ -6852,9 +6861,9 @@ void player::check_and_recover_morale() } } -void player::on_worn_item_transform( const item &it ) +void player::on_worn_item_transform( const item &old_it, const item &new_it ) { - morale->on_worn_item_transform( it ); + morale->on_worn_item_transform( old_it, new_it ); } void player::process_active_items() @@ -8586,7 +8595,11 @@ ret_val player::can_takeoff( const item &it, const std::list *res ) _( "You can't take off power armor while wearing other power armor components." ) : _( " can't take off power armor while wearing other power armor components." ) ); } - + if( it.has_flag( "NO_TAKEOFF" ) ) { + return ret_val::make_failure( !is_npc() ? + _( "You can't take that item off." ) : + _( " can't take that item off." ) ); + } return ret_val::make_success(); } @@ -8814,7 +8827,7 @@ bool player::unload( item &it ) } else if( target->ammo_remaining() ) { int qty = target->ammo_remaining(); - if( target->ammo_current() == "plutonium" ) { + if( target->ammo_current() == "plut_cell" ) { qty = target->ammo_remaining() / PLUTONIUM_CHARGES; if( qty > 0 ) { add_msg( _( "You recover %i unused plutonium." ), qty ); @@ -8842,7 +8855,7 @@ bool player::unload( item &it ) // If successful remove appropriate qty of ammo consuming half as much time as required to load it this->moves -= this->item_reload_cost( *target, ammo, qty ) / 2; - if( target->ammo_current() == "plutonium" ) { + if( target->ammo_current() == "plut_cell" ) { qty *= PLUTONIUM_CHARGES; } @@ -9052,7 +9065,7 @@ void player::use( int inventory_position ) item &used = i_at( inventory_position ); auto loc = item_location( *this, &used ); - use( loc.clone() ); + use( loc ); } void player::use( item_location loc ) @@ -9561,7 +9574,7 @@ void player::try_to_sleep( const time_duration &dur ) webforce = true; } if( websleep || webforce ) { - int web = g->m.get_field_strength( pos(), fd_web ); + int web = g->m.get_field_intensity( pos(), fd_web ); if( !webforce ) { // At this point, it's kinda weird, but surprisingly comfy... if( web >= 3 ) { @@ -9648,7 +9661,7 @@ comfort_level player::base_comfort_value( const tripoint &p ) const const ter_id ter_at_pos = tile.get_ter(); const furn_id furn_at_pos = tile.get_furn(); - int web = g->m.get_field_strength( p, fd_web ); + int web = g->m.get_field_intensity( p, fd_web ); // Some mutants have different comfort needs if( !plantsleep && !webforce ) { @@ -9729,13 +9742,13 @@ comfort_level player::base_comfort_value( const tripoint &p ) const } } - if( comfort >= static_cast( comfort_level::very_comfortable ) ) { + if( comfort > static_cast( comfort_level::comfortable ) ) { return comfort_level::very_comfortable; - } else if( comfort >= static_cast( comfort_level::comfortable ) ) { + } else if( comfort > static_cast( comfort_level::slightly_comfortable ) ) { return comfort_level::comfortable; - } else if( comfort >= static_cast( comfort_level::slightly_comfortable ) ) { + } else if( comfort > static_cast( comfort_level::neutral ) ) { return comfort_level::slightly_comfortable; - } else if( comfort >= static_cast( comfort_level::neutral ) ) { + } else if( comfort == static_cast( comfort_level::neutral ) ) { return comfort_level::neutral; } else { return comfort_level::uncomfortable; @@ -11751,6 +11764,10 @@ std::vector player::get_overlay_ids() const if( is_armed() ) { rval.push_back( "wielded_" + weapon.typeId() ); } + + if( move_mode != "walk" ) { + rval.push_back( move_mode ); + } return rval; } @@ -11832,11 +11849,13 @@ bool player::has_item_with_flag( const std::string &flag, bool need_charges ) co void player::on_mutation_gain( const trait_id &mid ) { morale->on_mutation_gain( mid ); + magic.on_mutation_gain( mid, *this ); } void player::on_mutation_loss( const trait_id &mid ) { morale->on_mutation_loss( mid ); + magic.on_mutation_loss( mid ); } void player::on_stat_change( const std::string &stat, int value ) diff --git a/src/player.h b/src/player.h index 3e1beb53be442..32569d1a89fe1 100644 --- a/src/player.h +++ b/src/player.h @@ -83,7 +83,7 @@ struct targeting_data; namespace debug_menu { class mission_debug; -} +} // namespace debug_menu // This tries to represent both rating and // player's decision to respect said rating @@ -334,11 +334,17 @@ class player : public Character const skill_id &important_skill, const skill_id &least_important_skill, int skill_level = -1 ); + /**Is the installation possible*/ + bool can_install_bionics( const itype &type, player &installer, bool autodoc = false, + int skill_level = -1 ); /** Attempts to install bionics, returns false if the player cancels prior to installation */ bool install_bionics( const itype &type, player &installer, bool autodoc = false, int skill_level = -1 ); void bionics_install_failure( player &installer, int difficulty, int success, float adjusted_skill ); + /**Is The uninstallation possible*/ + bool can_uninstall_bionic( const bionic_id &b_id, player &installer, bool autodoc = false, + int skill_level = -1 ); /** Used by the player to perform surgery to remove bionics and possibly retrieve parts */ bool uninstall_bionic( const bionic_id &b_id, player &installer, bool autodoc = false, int skill_level = -1 ); @@ -351,6 +357,8 @@ class player : public Character /**When a monster fails the surgery*/ void bionics_uninstall_failure( monster &installer, player &patient, int difficulty, int success, float adjusted_skill ); + /**Has enough anesthetic for surgery*/ + bool has_enough_anesth( const itype *cbm ); /** Adds the entered amount to the player's bionic power_level */ void charge_power( int amount ); /** Generates and handles the UI for player interaction with installed bionics */ @@ -1233,7 +1241,7 @@ class player : public Character bool has_morale_to_read() const; /** Checks permanent morale for consistency and recovers it when an inconsistency is found. */ void check_and_recover_morale(); - void on_worn_item_transform( const item &it ); + void on_worn_item_transform( const item &old_it, const item &new_it ); /** Get the formatted name of the currently wielded item (if any) * truncated to a number of characters. 0 means it is not truncated @@ -1420,15 +1428,14 @@ class player : public Character ret_val can_disassemble( const item &obj, const inventory &inv ) const; bool disassemble(); - bool disassemble( int pos ); - bool disassemble( item &obj, int pos, bool ground, bool interactive = true ); + bool disassemble( item_location target, bool interactive = true ); void disassemble_all( bool one_pass ); // Disassemble all items on the tile void complete_disassemble(); - void complete_disassemble( int item_pos, const tripoint &loc, - bool from_ground, const recipe &dis ); + void complete_disassemble( item_location &target, const recipe &dis ); // yet more crafting.cpp - const inventory &crafting_inventory(); // includes nearby items + const inventory &crafting_inventory( tripoint src_pos = tripoint_zero, + int radius = PICKUP_RANGE ); // includes nearby items void invalidate_crafting_inventory(); comp_selection select_item_component( const std::vector &components, @@ -1529,13 +1536,9 @@ class player : public Character time_point next_climate_control_check; bool last_climate_control_ret; - int power_level; - int max_power_level; int tank_plut; int reactor_plut; int slow_rad; - int oxygen; - int stamina; double recoil = MAX_RECOIL; std::weak_ptr last_target; cata::optional last_target_pos; @@ -1545,8 +1548,7 @@ class player : public Character int dodges_left; int blocks_left; int stim; - int radiation; - signed long cash; + int cash; int movecounter; std::shared_ptr mounted_creature; bool death_drops;// Turned to false for simulating NPCs on distant missions so they don't drop all their gear in sight diff --git a/src/player_activity.cpp b/src/player_activity.cpp index f97a60cd772aa..7e4bf784c1d01 100644 --- a/src/player_activity.cpp +++ b/src/player_activity.cpp @@ -19,48 +19,6 @@ player_activity::player_activity( activity_id t, int turns, int Index, int pos, { } -player_activity::player_activity( const player_activity &rhs ) - : type( rhs.type ), ignored_distractions( rhs.ignored_distractions ), - moves_total( rhs.moves_total ), moves_left( rhs.moves_left ), - index( rhs.index ), position( rhs.position ), name( rhs.name ), - values( rhs.values ), str_values( rhs.str_values ), - coords( rhs.coords ), monsters( rhs.monsters ), placement( rhs.placement ), - auto_resume( rhs.auto_resume ) -{ - targets.clear(); - targets.reserve( rhs.targets.size() ); - std::transform( rhs.targets.begin(), rhs.targets.end(), std::back_inserter( targets ), - []( const item_location & e ) { - return e.clone(); - } ); -} - -player_activity &player_activity::operator=( const player_activity &rhs ) -{ - type = rhs.type; - moves_total = rhs.moves_total; - moves_left = rhs.moves_left; - index = rhs.index; - position = rhs.position; - name = rhs.name; - ignored_distractions = rhs.ignored_distractions; - values = rhs.values; - str_values = rhs.str_values; - monsters = rhs.monsters; - coords = rhs.coords; - placement = rhs.placement; - auto_resume = rhs.auto_resume; - - targets.clear(); - targets.reserve( rhs.targets.size() ); - std::transform( rhs.targets.begin(), rhs.targets.end(), std::back_inserter( targets ), - []( const item_location & e ) { - return e.clone(); - } ); - - return *this; -} - void player_activity::set_to_null() { type = activity_id::NULL_ID(); diff --git a/src/player_activity.h b/src/player_activity.h index 636f2bb8aa226..12fb4d1bad671 100644 --- a/src/player_activity.h +++ b/src/player_activity.h @@ -53,9 +53,9 @@ class player_activity player_activity( activity_id, int turns = 0, int Index = -1, int pos = INT_MIN, const std::string &name_in = "" ); player_activity( player_activity && ) = default; - player_activity( const player_activity & ); + player_activity( const player_activity & ) = default; player_activity &operator=( player_activity && ) = default; - player_activity &operator=( const player_activity & ); + player_activity &operator=( const player_activity & ) = default; explicit operator bool() const { return !type.is_null(); diff --git a/src/player_display.cpp b/src/player_display.cpp index 6e2253a939009..4013b22990174 100644 --- a/src/player_display.cpp +++ b/src/player_display.cpp @@ -32,6 +32,8 @@ static const std::string title_SKILLS = _( "SKILLS" ); static const std::string title_BIONICS = _( "BIONICS" ); static const std::string title_TRAITS = _( "TRAITS" ); +static const trait_id trait_COLDBLOOD4( "COLDBLOOD4" ); + // use this instead of having to type out 26 spaces like before static const std::string header_spaces( 26, ' ' ); @@ -1037,27 +1039,25 @@ static void draw_initial_windows( const catacurses::window &w_stats, ( pen < 10 ? " " : "" ), pen ); line++; } - /* Cache result of calculation, possibly used multiple times later. */ - const auto player_local_temp = g->weather.get_temperature( you.pos() ); - if( you.has_trait( trait_id( "COLDBLOOD4" ) ) && player_local_temp > 65 ) { - pen = ( player_local_temp - 65 ) / 2; - mvwprintz( w_speed, line, 1, c_green, _( "Cold-Blooded +%s%d%%" ), - ( pen < 10 ? " " : "" ), pen ); - line++; - } - if( ( you.has_trait( trait_id( "COLDBLOOD" ) ) || you.has_trait( trait_id( "COLDBLOOD2" ) ) || - you.has_trait( trait_id( "COLDBLOOD3" ) ) || you.has_trait( trait_id( "COLDBLOOD4" ) ) ) && - player_local_temp < 65 ) { - if( you.has_trait( trait_id( "COLDBLOOD3" ) ) || you.has_trait( trait_id( "COLDBLOOD4" ) ) ) { - pen = ( 65 - player_local_temp ) / 2; - } else if( you.has_trait( trait_id( "COLDBLOOD2" ) ) ) { - pen = ( 65 - player_local_temp ) / 3; - } else { - pen = ( 65 - player_local_temp ) / 5; + + const float temperature_speed_modifier = you.mutation_value( "temperature_speed_modifier" ); + if( temperature_speed_modifier != 0 ) { + nc_color pen_color; + std::string pen_sign; + const auto player_local_temp = g->weather.get_temperature( you.pos() ); + if( you.has_trait( trait_COLDBLOOD4 ) && player_local_temp > 65 ) { + pen_color = c_green; + pen_sign = "+"; + } else if( player_local_temp < 65 ) { + pen_color = c_red; + pen_sign = "-"; + } + if( !pen_sign.empty() ) { + pen = ( player_local_temp - 65 ) * temperature_speed_modifier; + mvwprintz( w_speed, line, 1, pen_color, _( "Cold-Blooded %s%s%d%%" ), pen_sign, + ( pen < 10 ? " " : "" ), pen ); + line++; } - mvwprintz( w_speed, line, 1, c_red, _( "Cold-Blooded -%s%d%%" ), - ( pen < 10 ? " " : "" ), pen ); - line++; } int quick_bonus = static_cast( newmoves - ( newmoves / 1.1 ) ); diff --git a/src/profession.cpp b/src/profession.cpp index 13851b82cf520..a2d949d8d3809 100644 --- a/src/profession.cpp +++ b/src/profession.cpp @@ -24,7 +24,7 @@ namespace { generic_factory all_profs( "profession", "ident" ); const string_id generic_profession_id( "unemployed" ); -} +} // namespace static class json_item_substitution { diff --git a/src/projectile.cpp b/src/projectile.cpp index a7b08eed0222b..c842d498e5912 100644 --- a/src/projectile.cpp +++ b/src/projectile.cpp @@ -160,12 +160,12 @@ void apply_ammo_effects( const tripoint &p, const std::set &effects } if( effects.count( "SMOKE" ) > 0 ) { for( auto &pt : g->m.points_in_radius( p, 1, 0 ) ) { - g->m.add_field( pt, fd_smoke, MAX_FIELD_DENSITY ); + g->m.add_field( pt, fd_smoke, MAX_FIELD_INTENSITY ); } } if( effects.count( "SMOKE_BIG" ) > 0 ) { for( auto &pt : g->m.points_in_radius( p, 6, 0 ) ) { - g->m.add_field( pt, fd_smoke, MAX_FIELD_DENSITY ); + g->m.add_field( pt, fd_smoke, MAX_FIELD_INTENSITY ); } } diff --git a/src/ranged.cpp b/src/ranged.cpp index 988875b6f4d9f..7df00597adc99 100644 --- a/src/ranged.cpp +++ b/src/ranged.cpp @@ -570,7 +570,7 @@ dealt_projectile_attack player::throw_item( const tripoint &target, const item & // Item will burst upon landing, destroying the item, and spilling its contents const bool burst = thrown.has_property( "burst_when_filled" ) && thrown.is_container() && - thrown.get_property_long( "burst_when_filled" ) <= static_cast + thrown.get_property_int64_t( "burst_when_filled" ) <= static_cast ( thrown.get_contained().volume().value() ) / thrown.get_container_capacity().value() * 100; // Add some flags to the projectile @@ -1648,13 +1648,24 @@ std::vector target_handler::target_ui( player &pc, target_mode mode, } } + int new_dx = dst.x - src.x; + int new_dy = dst.y - src.y; + // Make player's sprite flip to face the current target - if( dst.x > src.x ) { - g->u.facing = FD_RIGHT; - } else if( dst.x < src.x ) { - g->u.facing = FD_LEFT; + if( ! tile_iso ) { + if( new_dx > 0 ) { + g->u.facing = FD_RIGHT; + } else if( new_dx < 0 ) { + g->u.facing = FD_LEFT; + } + } else { + if( new_dx >= 0 && new_dy >= 0 ) { + g->u.facing = FD_RIGHT; + } + if( new_dy <= 0 && new_dx <= 0 ) { + g->u.facing = FD_LEFT; + } } - } while( true ); pc.view_offset = old_offset; diff --git a/src/recipe_dictionary.cpp b/src/recipe_dictionary.cpp index 7c3edc3d1cb2c..e0c831110162b 100644 --- a/src/recipe_dictionary.cpp +++ b/src/recipe_dictionary.cpp @@ -38,7 +38,7 @@ void delete_if( std::map &data, } } -} +} // namespace static recipe null_recipe; static std::set null_match; @@ -101,7 +101,7 @@ std::vector recipe_subset::favorite() const std::vector res; std::copy_if( recipes.begin(), recipes.end(), std::back_inserter( res ), [&]( const recipe * r ) { - if( !*r ) { + if( !*r || r->obsolete ) { return false; } return uistate.favorite_recipes.find( r->ident() ) != uistate.favorite_recipes.end(); @@ -110,6 +110,20 @@ std::vector recipe_subset::favorite() const return res; } +std::vector recipe_subset::hidden() const +{ + std::vector res; + + std::copy_if( recipes.begin(), recipes.end(), std::back_inserter( res ), [&]( const recipe * r ) { + if( !*r || r->obsolete ) { + return false; + } + return uistate.hidden_recipes.find( r->ident() ) != uistate.hidden_recipes.end(); + } ); + + return res; +} + std::vector recipe_subset::recent() const { std::vector res; @@ -117,7 +131,7 @@ std::vector recipe_subset::recent() const for( auto rec_id = uistate.recent_recipes.rbegin(); rec_id != uistate.recent_recipes.rend(); ++rec_id ) { std::find_if( recipes.begin(), recipes.end(), [&rec_id, &res]( const recipe * r ) { - if( !*r || *rec_id != r->ident() ) { + if( !*r || *rec_id != r->ident() || r->obsolete ) { return false; } @@ -134,7 +148,7 @@ std::vector recipe_subset::search( const std::string &txt, std::vector res; std::copy_if( recipes.begin(), recipes.end(), std::back_inserter( res ), [&]( const recipe * r ) { - if( !*r ) { + if( !*r || r->obsolete ) { return false; } switch( key ) { @@ -208,6 +222,9 @@ std::vector recipe_subset::search_result( const itype_id &item ) std::vector res; std::copy_if( recipes.begin(), recipes.end(), std::back_inserter( res ), [&]( const recipe * r ) { + if( r->obsolete ) { + return false; + } return item == r->result() || ( r->has_byproducts() && r->byproducts.find( item ) != r->byproducts.end() ); } ); @@ -247,10 +264,16 @@ std::vector recipe_subset::in_category( const std::string &cat, auto iter = category.find( cat ); if( iter != category.end() ) { if( subcat.empty() ) { - res.insert( res.begin(), iter->second.begin(), iter->second.end() ); + std::copy_if( iter->second.begin(), iter->second.end(), + std::back_inserter( res ), [&]( const recipe * e ) { + return !e->obsolete; + } ); } else { std::copy_if( iter->second.begin(), iter->second.end(), std::back_inserter( res ), [&subcat]( const recipe * e ) { + if( e->obsolete ) { + return false; + } return e->subcategory == subcat; } ); } @@ -316,10 +339,14 @@ void recipe_dictionary::finalize_internal( std::map &obj ) } // remove any blacklisted or invalid recipes... delete_if( []( const recipe & elem ) { - if( elem.is_blacklisted() || elem.obsolete ) { + if( elem.is_blacklisted() ) { return true; } + if( elem.obsolete ) { + return false; + } + const std::string error = elem.get_consistency_error(); if( !error.empty() ) { @@ -345,6 +372,10 @@ void recipe_dictionary::finalize() for( auto &e : recipe_dict.recipes ) { auto &r = e.second; + if( r.obsolete ) { + continue; + } + for( const auto &bk : r.booksets ) { const itype *booktype = item::find_type( bk.first ); int req = bk.second > 0 ? bk.second : std::max( booktype->book->req, r.difficulty ); diff --git a/src/recipe_dictionary.h b/src/recipe_dictionary.h index 33dd7f7f80b60..f70a3443f169f 100644 --- a/src/recipe_dictionary.h +++ b/src/recipe_dictionary.h @@ -138,6 +138,9 @@ class recipe_subset /** Find recently used recipes */ std::vector recent() const; + /** Find hidden recipes */ + std::vector hidden() const; + /** Find recipes matching query (left anchored partial matches are supported) */ std::vector search( const std::string &txt, const search_type key = search_type::name ) const; diff --git a/src/recipe_groups.h b/src/recipe_groups.h index 741bc61085d0e..0b65b4898a9b0 100644 --- a/src/recipe_groups.h +++ b/src/recipe_groups.h @@ -17,6 +17,6 @@ void reset(); std::map get_recipes_by_bldg( const std::string &id ); std::map get_recipes_by_id( const std::string &id, const std::string &om_terrain_id = "ANY" ); -} +} // namespace recipe_group #endif diff --git a/src/rng.cpp b/src/rng.cpp index 1a3dcb6217f77..53b7693dd37e0 100644 --- a/src/rng.cpp +++ b/src/rng.cpp @@ -6,6 +6,7 @@ #include #include +#include "calendar.h" #include "cata_utility.h" unsigned int rng_bits() @@ -61,6 +62,11 @@ bool one_in( int chance ) return ( chance <= 1 || rng( 0, chance - 1 ) == 0 ); } +bool one_turn_in( const time_duration &duration ) +{ + return one_in( to_turns( duration ) ); +} + bool x_in_y( double x, double y ) { return rng_float( 0.0, 1.0 ) <= x / y; diff --git a/src/rng.h b/src/rng.h index 5eb3019532544..cdf3466e13469 100644 --- a/src/rng.h +++ b/src/rng.h @@ -12,6 +12,8 @@ #include "optional.h" +class time_duration; + // All PRNG functions use an engine, see the C++11 header // By default, that engine is seeded by time on first call to such a function. // If this function is called with a non-zero seed then the engine will be @@ -25,6 +27,7 @@ unsigned int rng_bits(); int rng( int val1, int val2 ); double rng_float( double val1, double val2 ); bool one_in( int chance ); +bool one_turn_in( const time_duration &duration ); bool x_in_y( double x, double y ); int dice( int number, int sides ); @@ -78,8 +81,9 @@ inline V random_entry( const C &container, D default_value ) * This function handles empty containers without requiring an instance of the * contained type when container is empty. */ -template -inline cata::optional> random_entry_opt( const C &container ) +template +inline auto random_entry_opt( C &container ) -> +cata::optional { if( container.empty() ) { return cata::nullopt; diff --git a/src/rotatable_symbols.h b/src/rotatable_symbols.h index c28af5d333070..97f6095dbc464 100644 --- a/src/rotatable_symbols.h +++ b/src/rotatable_symbols.h @@ -19,6 +19,6 @@ void reset(); uint32_t get( const uint32_t &symbol, int n ); -} +} // namespace rotatable_symbols #endif // ROTATABLE_SYMBOLS_H diff --git a/src/savegame.cpp b/src/savegame.cpp index b063bc4496d4d..5534ef6909e45 100644 --- a/src/savegame.cpp +++ b/src/savegame.cpp @@ -323,7 +323,7 @@ void game::load_shortcuts( std::istream &fin ) std::list &qslist = quick_shortcuts_map[ *it ]; qslist.clear(); while( ja.has_more() ) { - qslist.push_back( input_event( ja.next_long(), CATA_INPUT_KEYBOARD ) ); + qslist.push_back( input_event( ja.next_int(), CATA_INPUT_KEYBOARD ) ); } } } @@ -1121,6 +1121,22 @@ void overmap::unserialize_view( std::istream &fin ) } } jsin.end_array(); + } else if( name == "extras" ) { + jsin.start_array(); + for( int z = 0; z < OVERMAP_LAYERS; ++z ) { + jsin.start_array(); + while( !jsin.end_array() ) { + om_map_extra tmp; + jsin.start_array(); + jsin.read( tmp.x ); + jsin.read( tmp.y ); + jsin.read( tmp.id ); + jsin.end_array(); + + layer[z].extras.push_back( tmp ); + } + } + jsin.end_array(); } } } @@ -1195,6 +1211,22 @@ void overmap::serialize_view( std::ostream &fout ) const } json.end_array(); + json.member( "extras" ); + json.start_array(); + for( int z = 0; z < OVERMAP_LAYERS; ++z ) { + json.start_array(); + for( auto &i : layer[z].extras ) { + json.start_array(); + json.write( i.x ); + json.write( i.y ); + json.write( i.id ); + json.end_array(); + fout << std::endl; + } + json.end_array(); + } + json.end_array(); + json.end_object(); } @@ -1585,7 +1617,19 @@ void faction_manager::serialize( JsonOut &jsout ) const void faction_manager::deserialize( JsonIn &jsin ) { - jsin.read( factions ); + jsin.start_array(); + while( !jsin.end_array() ) { + faction add_fac; + jsin.read( add_fac ); + faction *old_fac = get( add_fac.id ); + if( old_fac ) { + *old_fac = add_fac; + // force a revalidation of add_fac + get( add_fac.id ); + } else { + factions.emplace_back( add_fac ); + } + } } void Creature_tracker::deserialize( JsonIn &jsin ) diff --git a/src/savegame_json.cpp b/src/savegame_json.cpp index a3981409556d4..c8687ea3ab030 100644 --- a/src/savegame_json.cpp +++ b/src/savegame_json.cpp @@ -44,6 +44,7 @@ #include "mtype.h" #include "npc.h" #include "npc_class.h" +#include "optional.h" #include "options.h" #include "player.h" #include "player_activity.h" @@ -380,6 +381,8 @@ void Character::load( JsonObject &data ) data.read( "fatigue", fatigue ); data.read( "sleep_deprivation", sleep_deprivation ); data.read( "stored_calories", stored_calories ); + data.read( "radiation", radiation ); + data.read( "oxygen", oxygen ); // health data.read( "healthy", healthy ); @@ -465,6 +468,10 @@ void Character::load( JsonObject &data ) _skills->clear(); JsonObject pmap = data.get_object( "skills" ); for( const std::string &member : pmap.get_member_names() ) { + // FIXME: Fix corrupted bionic power data loading (see #31627). Temporary. + if( member == "power_level" || member == "max_power_level" ) { + continue; + } pmap.read( member, ( *_skills )[skill_id( member )] ); } @@ -479,6 +486,20 @@ void Character::load( JsonObject &data ) on_stat_change( "hunger", hunger ); on_stat_change( "fatigue", fatigue ); on_stat_change( "sleep_deprivation", sleep_deprivation ); + + // FIXME: Fix corrupted bionic power data loading (see #31627). Temporary. + power_level = pmap.get_int( "power_level", data.get_int( "power_level", 0 ) ); + max_power_level = pmap.get_int( "max_power_level", data.get_int( "max_power_level", 0 ) ); + // Bionic power scale has been changed, savegame version 21 has the new scale + if( savegame_loading_version <= 20 ) { + power_level *= 25; + max_power_level *= 25; + } + + // Bionic power should not be negative! + if( power_level < 0 ) { + power_level = 0; + } } /** @@ -513,9 +534,12 @@ void Character::store( JsonOut &json ) const json.member( "fatigue", fatigue ); json.member( "sleep_deprivation", sleep_deprivation ); json.member( "stored_calories", stored_calories ); + json.member( "radiation", radiation ); + json.member( "stamina", stamina ); // breathing json.member( "underwater", underwater ); + json.member( "oxygen", oxygen ); // traits: permanent 'mutations' more or less json.member( "traits", my_traits ); @@ -531,6 +555,10 @@ void Character::store( JsonOut &json ) const json.member( pair.first.str(), pair.second ); } json.end_object(); + + // npc; unimplemented + json.member( "power_level", power_level ); + json.member( "max_power_level", max_power_level ); } //////////////////////////////////////////////////////////////////////////////////////////////////// @@ -555,16 +583,12 @@ void player::store( JsonOut &json ) const // pain json.member( "pkill", pkill ); // misc levels - json.member( "radiation", radiation ); json.member( "tank_plut", tank_plut ); json.member( "reactor_plut", reactor_plut ); json.member( "slow_rad", slow_rad ); json.member( "scent", static_cast( scent ) ); json.member( "body_wetness", body_wetness ); - // breathing - json.member( "oxygen", oxygen ); - // gender json.member( "male", male ); @@ -580,10 +604,6 @@ void player::store( JsonOut &json ) const json.member( "damage_bandaged", damage_bandaged ); json.member( "damage_disinfected", damage_disinfected ); - // npc; unimplemented - json.member( "power_level", power_level ); - json.member( "max_power_level", max_power_level ); - json.member( "ma_styles", ma_styles ); // "Looks like I picked the wrong week to quit smoking." - Steve McCroskey json.member( "addictions", addictions ); @@ -666,12 +686,10 @@ void player::load( JsonObject &data ) } data.read( "stim", stim ); data.read( "pkill", pkill ); - data.read( "radiation", radiation ); data.read( "tank_plut", tank_plut ); data.read( "reactor_plut", reactor_plut ); data.read( "slow_rad", slow_rad ); data.read( "scent", scent ); - data.read( "oxygen", oxygen ); data.read( "male", male ); data.read( "cash", cash ); data.read( "recoil", recoil ); @@ -681,19 +699,6 @@ void player::load( JsonObject &data ) setID( tmpid ); } - data.read( "power_level", power_level ); - data.read( "max_power_level", max_power_level ); - // Bionic power scale has been changed, savegame version 21 has the new scale - if( savegame_loading_version <= 20 ) { - power_level *= 25; - max_power_level *= 25; - } - - // Bionic power should not be negative! - if( power_level < 0 ) { - power_level = 0; - } - data.read( "ma_styles", ma_styles ); // Fix up old ma_styles that doesn't include fake styles if( std::find( ma_styles.begin(), ma_styles.end(), style_kicks ) == ma_styles.end() && @@ -820,7 +825,6 @@ void avatar::store( JsonOut &json ) const json.member( "style_selected", style_selected ); json.member( "keep_hands_free", keep_hands_free ); - json.member( "stamina", stamina ); json.member( "move_mode", move_mode ); json.member( "magic", magic ); @@ -1527,7 +1531,7 @@ void npc::store( JsonOut &json ) const json.member( "previous_mission", previous_mission ); json.member( "faction_api_ver", faction_api_version ); if( !fac_id.str().empty() ) { // set in constructor - json.member( "my_fac", my_fac->id.c_str() ); + json.member( "my_fac", fac_id.c_str() ); } json.member( "attitude", static_cast( attitude ) ); json.member( "previous_attitude", static_cast( attitude ) ); @@ -1718,6 +1722,8 @@ void monster::load( JsonObject &data ) goal = plans.back(); } + data.read( "summon_time_limit", summon_time_limit ); + // This is relative to the monster so it isn't invalidated by map shifting. tripoint destination; data.read( "destination", destination ); @@ -1801,6 +1807,9 @@ void monster::store( JsonOut &json ) const json.member( "biosignatures", biosignatures ); json.member( "biosig_timer", biosig_timer ); json.member( "last_biosig", last_biosig ); + + json.member( "summon_time_limit", summon_time_limit ); + if( horde_attraction > MHA_NULL && horde_attraction < NUM_MONSTER_HORDE_ATTRACTION ) { json.member( "horde_attraction", horde_attraction ); } @@ -2303,7 +2312,7 @@ void vehicle_part::deserialize( JsonIn &jsin ) const int qty = std::accumulate( items.begin(), items.end(), 0, []( int lhs, const item & rhs ) { return lhs + rhs.charges; } ); - ammo_set( items.front().ammo_current(), qty ); + ammo_set( items.begin()->ammo_current(), qty ); items.clear(); } } @@ -2925,7 +2934,7 @@ void map_memory::load( JsonIn &jsin ) p.x = jsin.get_int(); p.y = jsin.get_int(); p.z = jsin.get_int(); - const long symbol = jsin.get_long(); + const int symbol = jsin.get_int(); memorize_symbol( std::numeric_limits::max(), p, symbol ); jsin.end_array(); } @@ -2950,7 +2959,7 @@ void map_memory::load( JsonObject &jsin ) while( map_memory_curses.has_more() ) { JsonObject pmap = map_memory_curses.next_object(); const tripoint p( pmap.get_int( "x" ), pmap.get_int( "y" ), pmap.get_int( "z" ) ); - memorize_symbol( std::numeric_limits::max(), p, pmap.get_long( "symbol" ) ); + memorize_symbol( std::numeric_limits::max(), p, pmap.get_int( "symbol" ) ); } } @@ -3391,13 +3400,13 @@ void submap::load( JsonIn &jsin, const std::string &member_name, bool rubpow_upd if( tid == "t_rubble" ) { ter[i][j] = ter_id( "t_dirt" ); frn[i][j] = furn_id( "f_rubble" ); - itm[i][j].push_back( rock ); - itm[i][j].push_back( rock ); + itm[i][j].insert( rock ); + itm[i][j].insert( rock ); } else if( tid == "t_wreckage" ) { ter[i][j] = ter_id( "t_dirt" ); frn[i][j] = furn_id( "f_wreckage" ); - itm[i][j].push_back( chunk ); - itm[i][j].push_back( chunk ); + itm[i][j].insert( chunk ); + itm[i][j].insert( chunk ); } else if( tid == "t_ash" ) { ter[i][j] = ter_id( "t_dirt" ); frn[i][j] = furn_id( "f_ash" ); @@ -3479,14 +3488,14 @@ void submap::load( JsonIn &jsin, const std::string &member_name, bool rubpow_upd tmp.visit_items( [ this, &p ]( item * it ) { for( auto &e : it->magazine_convert() ) { - itm[p.x][p.y].push_back( e ); + itm[p.x][p.y].insert( e ); } return VisitResponse::NEXT; } ); - itm[p.x][p.y].push_back( tmp ); + const cata::colony::iterator it = itm[p.x][p.y].insert( tmp ); if( tmp.needs_processing() ) { - active_items.add( std::prev( itm[p.x][p.y].end() ), p ); + active_items.add( it, p ); } } } @@ -3516,12 +3525,12 @@ void submap::load( JsonIn &jsin, const std::string &member_name, bool rubpow_upd jsin.start_array(); while( !jsin.end_array() ) { int type = jsin.get_int(); - int density = jsin.get_int(); + int intensity = jsin.get_int(); int age = jsin.get_int(); if( fld[i][j].find_field( field_id( type ) ) == nullptr ) { field_count++; } - fld[i][j].add_field( field_id( type ), density, time_duration::from_turns( age ) ); + fld[i][j].add_field( field_id( type ), intensity, time_duration::from_turns( age ) ); } } } else if( member_name == "graffiti" ) { @@ -3581,7 +3590,7 @@ void submap::load( JsonIn &jsin, const std::string &member_name, bool rubpow_upd } else if( member_name == "vehicles" ) { jsin.start_array(); while( !jsin.end_array() ) { - std::unique_ptr tmp( new vehicle() ); + std::unique_ptr tmp = std::make_unique(); jsin.read( *tmp ); vehicles.push_back( std::move( tmp ) ); } @@ -3605,7 +3614,8 @@ void submap::load( JsonIn &jsin, const std::string &member_name, bool rubpow_upd } } else if( member_name == "computers" ) { std::string computer_data = jsin.get_string(); - std::unique_ptr new_comp( new computer( "BUGGED_COMPUTER", -100 ) ); + std::unique_ptr new_comp = + std::make_unique( "BUGGED_COMPUTER", -100 ); new_comp->load_data( computer_data ); comp = std::move( new_comp ); } else if( member_name == "camp" ) { diff --git a/src/savegame_legacy.cpp b/src/savegame_legacy.cpp index b99df57f25be5..72335000b5e51 100644 --- a/src/savegame_legacy.cpp +++ b/src/savegame_legacy.cpp @@ -41,7 +41,7 @@ struct hash { return k; // the most trivial hash of them all } }; -} +} // namespace std std::string convert_talk_topic( talk_topic_enum const old_value ) { diff --git a/src/scenario.cpp b/src/scenario.cpp index 6876ab0b3b118..f69cbccbb0f87 100644 --- a/src/scenario.cpp +++ b/src/scenario.cpp @@ -17,7 +17,7 @@ namespace { generic_factory all_scenarios( "scenario", "ident" ); const string_id generic_scenario_id( "evacuee" ); -} +} // namespace /** @relates string_id */ template<> @@ -80,7 +80,7 @@ void scenario::load( JsonObject &jo, const std::string & ) jo.throw_error( "at least one starting location (member \"allowed_locs\") must be defined" ); } optional( jo, was_loaded, "flags", flags, auto_flags_reader<> {} ); - optional( jo, was_loaded, "map_special", _map_special, "mx_null" ); + optional( jo, was_loaded, "map_extra", _map_extra, "mx_null" ); optional( jo, was_loaded, "missions", _missions, auto_flags_reader {} ); } @@ -165,7 +165,7 @@ void scenario::check_definition() const check_traits( _allowed_traits, id ); check_traits( _forced_traits, id ); check_traits( _forbidden_traits, id ); - MapExtras::get_function( _map_special ); // triggers a debug message upon invalid input + MapExtras::get_function( _map_extra ); // triggers a debug message upon invalid input for( auto &m : _missions ) { if( !m.is_valid() ) { @@ -310,13 +310,13 @@ bool scenario::can_pick( const scenario ¤t_scenario, const int points ) co { return point_cost() - current_scenario.point_cost() <= points; } -bool scenario::has_map_special() const +bool scenario::has_map_extra() const { - return _map_special != "mx_null"; + return _map_extra != "mx_null"; } -const std::string &scenario::get_map_special() const +const std::string &scenario::get_map_extra() const { - return _map_special; + return _map_extra; } const std::vector &scenario::missions() const { diff --git a/src/scenario.h b/src/scenario.h index 9bea396d22a1f..c6e6952a509e9 100644 --- a/src/scenario.h +++ b/src/scenario.h @@ -45,7 +45,7 @@ class scenario std::vector _allowed_locs; int _point_cost; std::set flags; // flags for some special properties of the scenario - std::string _map_special; + std::string _map_extra; std::vector _missions; void load( JsonObject &jo, const std::string &src ); @@ -85,8 +85,8 @@ class scenario bool allowed_start( const start_location_id &loc ) const; signed int point_cost() const; - bool has_map_special() const; - const std::string &get_map_special() const; + bool has_map_extra() const; + const std::string &get_map_extra() const; /** * Returns "All", "Limited", or "Almost all" (translated) diff --git a/src/sdltiles.cpp b/src/sdltiles.cpp index d81c832999efd..c72e66541ba3c 100644 --- a/src/sdltiles.cpp +++ b/src/sdltiles.cpp @@ -85,8 +85,8 @@ //*********************************** std::unique_ptr tilecontext; -static unsigned long lastupdate = 0; -static unsigned long interval = 25; +static uint32_t lastupdate = 0; +static uint32_t interval = 25; static bool needupdate = false; // used to replace SDL_RenderFillRect with a more efficient SDL_RenderCopy @@ -721,7 +721,7 @@ static bool quick_shortcuts_enabled = true; // For previewing the terminal size with a transparent rectangle overlay when user is adjusting it in the settings static int preview_terminal_width = -1; static int preview_terminal_height = -1; -static unsigned long preview_terminal_change_time = 0; +static uint32_t preview_terminal_change_time = 0; extern "C" { @@ -817,7 +817,7 @@ void refresh_display() // only update if the set interval has elapsed static void try_sdl_update() { - unsigned long now = SDL_GetTicks(); + uint32_t now = SDL_GetTicks(); if( now - lastupdate >= interval ) { refresh_display(); } else { @@ -1719,20 +1719,20 @@ static float second_finger_down_y = -1.0f; // in pixels static float second_finger_curr_x = -1.0f; // in pixels static float second_finger_curr_y = -1.0f; // in pixels // when did the first finger start touching the screen? 0 if not touching, otherwise the time in milliseconds. -static unsigned long finger_down_time = 0; +static uint32_t finger_down_time = 0; // the last time we repeated input for a finger hold, 0 if not touching, otherwise the time in milliseconds. -static unsigned long finger_repeat_time = 0; +static uint32_t finger_repeat_time = 0; // the last time a single tap was detected. used for double-tap detection. -static unsigned long last_tap_time = 0; +static uint32_t last_tap_time = 0; // when did the hardware back button start being pressed? 0 if not touching, otherwise the time in milliseconds. -static unsigned long ac_back_down_time = 0; +static uint32_t ac_back_down_time = 0; // has a second finger touched the screen while the first was touching? static bool is_two_finger_touch = false; // did this touch start on a quick shortcut? static bool is_quick_shortcut_touch = false; static bool quick_shortcuts_toggle_handled = false; // the current finger repeat delay - will be somewhere between the min/max values depending on user input -unsigned long finger_repeat_delay = 500; +uint32_t finger_repeat_delay = 500; // should we make sure the sdl surface is visible? set to true whenever the SDL window is shown. static bool needs_sdl_surface_visibility_refresh = true; @@ -2058,7 +2058,7 @@ void draw_quick_shortcuts() if( !quick_shortcuts_enabled || SDL_IsTextInputActive() || ( get_option( "ANDROID_HIDE_HOLDS" ) && !is_quick_shortcut_touch && finger_down_time > 0 && - SDL_GetTicks() - finger_down_time >= static_cast( + SDL_GetTicks() - finger_down_time >= static_cast( get_option( "ANDROID_INITIAL_DELAY" ) ) ) ) { // player is swipe + holding in a direction return; } @@ -2132,7 +2132,7 @@ void draw_quick_shortcuts() } hovered = is_quick_shortcut_touch && hovered_quick_shortcut == &event; show_hint = hovered && - SDL_GetTicks() - finger_down_time > static_cast< unsigned long > + SDL_GetTicks() - finger_down_time > static_cast ( get_option( "ANDROID_INITIAL_DELAY" ) ); std::string hint_text; if( show_hint ) { @@ -2248,7 +2248,7 @@ void draw_virtual_joystick() // Bail out if we don't need to draw the joystick if( !get_option( "ANDROID_SHOW_VIRTUAL_JOYSTICK" ) || finger_down_time <= 0 || - SDL_GetTicks() - finger_down_time <= static_cast + SDL_GetTicks() - finger_down_time <= static_cast ( get_option( "ANDROID_INITIAL_DELAY" ) ) || is_quick_shortcut_touch || is_two_finger_touch ) { @@ -2302,9 +2302,9 @@ void update_finger_repeat_delay() std::max( 0.01f, ( get_option( "ANDROID_REPEAT_DELAY_RANGE" ) ) * longest_window_edge ), 0.0f, 1.0f ); finger_repeat_delay = lerp( std::pow( t, get_option( "ANDROID_SENSITIVITY_POWER" ) ), - static_cast( std::max( get_option( "ANDROID_REPEAT_DELAY_MIN" ), + static_cast( std::max( get_option( "ANDROID_REPEAT_DELAY_MIN" ), get_option( "ANDROID_REPEAT_DELAY_MAX" ) ) ), - static_cast( std::min( get_option( "ANDROID_REPEAT_DELAY_MIN" ), + static_cast( std::min( get_option( "ANDROID_REPEAT_DELAY_MIN" ), get_option( "ANDROID_REPEAT_DELAY_MAX" ) ) ) ); } @@ -2323,12 +2323,12 @@ bool is_string_input( input_context &ctx ) int get_key_event_from_string( const std::string &str ) { if( str.length() ) { - return ( long )str[0]; + return str[0]; } return -1; } // This function is triggered on finger up events, OR by a repeating timer for touch hold events. -void handle_finger_input( unsigned long ticks ) +void handle_finger_input( uint32_t ticks ) { float delta_x = finger_curr_x - finger_down_x; @@ -2395,7 +2395,7 @@ void handle_finger_input( unsigned long ticks ) } } } else { - if( ticks - finger_down_time >= static_cast + if( ticks - finger_down_time >= static_cast ( get_option( "ANDROID_INITIAL_DELAY" ) ) ) { // Single tap (repeat) - held, so always treat this as a tap // We only allow repeats for waiting, not confirming in menus as that's a bit silly @@ -2405,7 +2405,7 @@ void handle_finger_input( unsigned long ticks ) } } else { if( last_tap_time > 0 && - ticks - last_tap_time < static_cast( get_option( "ANDROID_INITIAL_DELAY" ) ) ) { + ticks - last_tap_time < static_cast( get_option( "ANDROID_INITIAL_DELAY" ) ) ) { // Double tap last_input = input_event( is_default_mode ? KEY_ESCAPE : KEY_ESCAPE, CATA_INPUT_KEYBOARD ); last_tap_time = 0; @@ -2461,7 +2461,7 @@ static void CheckMessages() visible_display_frame_dirty = false; } - unsigned long ticks = SDL_GetTicks(); + uint32_t ticks = SDL_GetTicks(); // Force text input mode if hardware keyboard is available. if( android_is_hardware_keyboard_available() && !SDL_IsTextInputActive() ) { @@ -2682,7 +2682,7 @@ static void CheckMessages() // Toggle quick shortcuts on/off if( ac_back_down_time > 0 && - ticks - ac_back_down_time > static_cast + ticks - ac_back_down_time > static_cast ( get_option( "ANDROID_INITIAL_DELAY" ) ) ) { if( !quick_shortcuts_toggle_handled ) { quick_shortcuts_enabled = !quick_shortcuts_enabled; @@ -2706,7 +2706,7 @@ static void CheckMessages() // Handle repeating inputs from touch + holds if( !is_quick_shortcut_touch && !is_two_finger_touch && finger_down_time > 0 && - ticks - finger_down_time > static_cast + ticks - finger_down_time > static_cast ( get_option( "ANDROID_INITIAL_DELAY" ) ) ) { if( ticks - finger_repeat_time > finger_repeat_delay ) { handle_finger_input( ticks ); @@ -2717,7 +2717,7 @@ static void CheckMessages() // If we received a first tap and not another one within a certain period, this was a single tap, so trigger the input event if( !is_quick_shortcut_touch && !is_two_finger_touch && last_tap_time > 0 && - ticks - last_tap_time >= static_cast + ticks - last_tap_time >= static_cast ( get_option( "ANDROID_INITIAL_DELAY" ) ) ) { // Single tap last_tap_time = ticks; @@ -2729,7 +2729,7 @@ static void CheckMessages() // ensure hint text pops up even if player doesn't move finger to trigger a FINGERMOTION event if( is_quick_shortcut_touch && finger_down_time > 0 && - ticks - finger_down_time > static_cast + ticks - finger_down_time > static_cast ( get_option( "ANDROID_INITIAL_DELAY" ) ) ) { needupdate = true; } @@ -2833,7 +2833,7 @@ static void CheckMessages() #if defined(__ANDROID__) // Toggle virtual keyboard with Android back button if( ev.key.keysym.sym == SDLK_AC_BACK ) { - if( ticks - ac_back_down_time <= static_cast + if( ticks - ac_back_down_time <= static_cast ( get_option( "ANDROID_INITIAL_DELAY" ) ) ) { if( SDL_IsTextInputActive() ) { SDL_StopTextInput(); @@ -3004,7 +3004,7 @@ static void CheckMessages() // Get the quick shortcut that was originally touched quick_shortcut = get_quick_shortcut_under_finger( true ); if( quick_shortcut && - ticks - finger_down_time <= static_cast( get_option( "ANDROID_INITIAL_DELAY" ) ) + ticks - finger_down_time <= static_cast( get_option( "ANDROID_INITIAL_DELAY" ) ) && finger_curr_y < finger_down_y && finger_down_y - finger_curr_y > std::abs( finger_down_x - finger_curr_x ) ) { @@ -3076,7 +3076,7 @@ static void CheckMessages() } } } - } else if( ticks - finger_down_time <= static_cast( + } else if( ticks - finger_down_time <= static_cast( get_option( "ANDROID_INITIAL_DELAY" ) ) ) { handle_finger_input( ticks ); } @@ -3136,10 +3136,13 @@ static void font_folder_list( std::ofstream &fout, const std::string &path, if( !fnt ) { continue; } + // TTF_FontFaces returns a long, so use that + // NOLINTNEXTLINE(cata-no-long) long nfaces = 0; nfaces = TTF_FontFaces( fnt.get() ); fnt.reset(); + // NOLINTNEXTLINE(cata-no-long) for( long i = 0; i < nfaces; i++ ) { const TTF_Font_Ptr fnt( TTF_OpenFontIndex( f.c_str(), 12, i ) ); if( !fnt ) { @@ -3547,8 +3550,8 @@ input_event input_manager::get_input_event() SDL_Delay( 1 ); } while( last_input.type == CATA_INPUT_ERROR ); } else if( inputdelay > 0 ) { - unsigned long starttime = SDL_GetTicks(); - unsigned long endtime = 0; + uint32_t starttime = SDL_GetTicks(); + uint32_t endtime = 0; bool timedout = false; do { CheckMessages(); diff --git a/src/simple_pathfinding.h b/src/simple_pathfinding.h index 5eaa451868106..951138e916ae7 100644 --- a/src/simple_pathfinding.h +++ b/src/simple_pathfinding.h @@ -202,6 +202,6 @@ inline path straight_path( const point &source, return res; } -} +} // namespace pf #endif diff --git a/src/skill_boost.cpp b/src/skill_boost.cpp index 99b8c47d4ed03..b895144efeb40 100644 --- a/src/skill_boost.cpp +++ b/src/skill_boost.cpp @@ -10,7 +10,7 @@ namespace { generic_factory all_skill_boosts( "skill boost", "stat" ); -} +} // namespace const std::vector &skill_boost::get_all() { diff --git a/src/sounds.cpp b/src/sounds.cpp index 43e1373f54d6a..03e28c7dc4392 100644 --- a/src/sounds.cpp +++ b/src/sounds.cpp @@ -369,13 +369,17 @@ void sounds::process_sound_markers( player *p ) } // skip most movement sounds and our own sounds - if( pos != p->pos() && describe_sound( sound.category ) ) { + // unless our own sound is an alarm + if( ( pos != p->pos() || ( pos == p->pos() && sound.category == sound_t::alarm ) ) && + describe_sound( sound.category ) ) { game_message_type severity = m_info; if( sound.category == sound_t::combat || sound.category == sound_t::alarm ) { severity = m_warning; } // if we can see it, don't print a direction - if( p->sees( pos ) ) { + if( pos == p->pos() ) { + add_msg( severity, _( "From yourself you hear %1$s." ), description ); + } else if( p->sees( pos ) ) { add_msg( severity, _( "You hear %1$s" ), description ); } else { std::string direction = direction_name( direction_from( p->pos(), pos ) ); diff --git a/src/sounds.h b/src/sounds.h index 4882431a8d21d..1f8dbbc1e75bb 100644 --- a/src/sounds.h +++ b/src/sounds.h @@ -72,7 +72,7 @@ std::pair, std::vector> get_monster_sounds(); std::string sound_at( const tripoint &location ); /** Tells us if sound has been enabled in options */ extern bool sound_enabled; -} +} // namespace sounds namespace sfx { @@ -112,6 +112,6 @@ void do_player_death_hurt( const player &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 = "" ); -} +} // namespace sfx #endif diff --git a/src/start_location.cpp b/src/start_location.cpp index d74d958b797b4..0f5a0e5b5486c 100644 --- a/src/start_location.cpp +++ b/src/start_location.cpp @@ -33,7 +33,7 @@ const efftype_id effect_bleed( "bleed" ); namespace { generic_factory all_starting_locations( "starting location", "ident" ); -} +} // namespace /** @relates string_id */ template<> @@ -191,7 +191,7 @@ static void board_up( map &m, const tripoint &start, const tripoint &end ) m.furn_set( fp, f_null ); auto destination_items = m.i_at( bp ); for( const item &moved_item : m.i_at( fp ) ) { - destination_items.push_back( moved_item ); + destination_items.insert( moved_item ); } m.i_clear( fp ); } @@ -395,15 +395,14 @@ void start_location::burn( const tripoint &omtstart, m.save(); } -void start_location::add_map_special( const tripoint &omtstart, - const std::string &map_special ) const +void start_location::add_map_extra( const tripoint &omtstart, + const std::string &map_extra ) const { const tripoint player_location = omt_to_sm_copy( omtstart ); tinymap m; m.load( player_location.x, player_location.y, player_location.z, false ); - const auto ptr = MapExtras::get_function( map_special ); - ptr( m, player_location ); + MapExtras::apply_function( map_extra, m, player_location ); m.save(); } diff --git a/src/start_location.h b/src/start_location.h index 02fceed370ef9..ebf84cdcae893 100644 --- a/src/start_location.h +++ b/src/start_location.h @@ -58,9 +58,9 @@ class start_location void burn( const tripoint &omtstart, const size_t count, const int rad ) const; /** - * Adds a map special, see mapgen.h and mapgen.cpp. Look at the namespace MapExtras. + * Adds a map extra, see map_extras.h and map_extras.cpp. Look at the namespace MapExtras and class map_extras. */ - void add_map_special( const tripoint &omtstart, const std::string &map_special ) const; + void add_map_extra( const tripoint &omtstart, const std::string &map_extra ) const; void handle_heli_crash( player &u ) const; diff --git a/src/string_formatter.h b/src/string_formatter.h index 5c54671750ce7..e6fbb66b22e30 100644 --- a/src/string_formatter.h +++ b/src/string_formatter.h @@ -243,7 +243,8 @@ class string_formatter template void read_conversion( const int format_arg_index, Args &&... args ) { - // Removes the prefix "ll", "l", "h" and "hh", we later add "ll" again and that + // Removes the prefix "ll", "l", "h" and "hh", "z", and "t". + // We later add "ll" again and that // would interfere with the existing prefix. We convert *all* input to (un)signed // long long int and use the "ll" modifier all the time. This will print the // expected value all the time, even when the original modifier did not match. @@ -254,6 +255,7 @@ class string_formatter if( consume_next_input_if( 'h' ) ) { } } else if( consume_next_input_if( 'z' ) ) { + } else if( consume_next_input_if( 't' ) ) { } const char c = consume_next_input(); current_format.push_back( c ); diff --git a/src/string_id.h b/src/string_id.h index f528fc93725e9..06ccc2e30b5c3 100644 --- a/src/string_id.h +++ b/src/string_id.h @@ -206,6 +206,6 @@ struct hash< string_id > { return hash()( v.str() ); } }; -} +} // namespace std #endif diff --git a/src/string_id_null_ids.cpp b/src/string_id_null_ids.cpp index 8f2e563648121..a1c6d1080408f 100644 --- a/src/string_id_null_ids.cpp +++ b/src/string_id_null_ids.cpp @@ -18,6 +18,7 @@ MAKE_NULL_ID( material_type, "null", 0 ) MAKE_NULL_ID( overmap_land_use_code, "", 0 ) MAKE_NULL_ID( overmap_special, "", 0 ) MAKE_NULL_ID( overmap_connection, "", 0 ) +MAKE_NULL_ID( map_extra, "", 0 ) MAKE_NULL_ID( Skill, "none" ) MAKE_NULL_ID( npc_class, "NC_NONE" ) MAKE_NULL_ID( ammunition_type, "NULL" ) @@ -39,6 +40,7 @@ MAKE_NULL_ID2( oter_t, "", 0 ) MAKE_NULL_ID2( oter_type_t, "", 0 ) MAKE_NULL_ID2( ter_t, "t_null", 0 ) MAKE_NULL_ID2( trap, "tr_null" ) +MAKE_NULL_ID2( construction_category, "NULL", 0 ) MAKE_NULL_ID2( field_type, "x_fd_null", 0 ) MAKE_NULL_ID2( furn_t, "f_null", 0 ) MAKE_NULL_ID2( MonsterGroup, "GROUP_NULL" ) diff --git a/src/string_input_popup.cpp b/src/string_input_popup.cpp index 2a71ce6ac6cd2..380dbcc32559d 100644 --- a/src/string_input_popup.cpp +++ b/src/string_input_popup.cpp @@ -280,9 +280,9 @@ int string_input_popup::query_int( const bool loop, const bool draw_only ) return std::atoi( query_string( loop, draw_only ).c_str() ); } -long string_input_popup::query_long( const bool loop, const bool draw_only ) +int64_t string_input_popup::query_int64_t( const bool loop, const bool draw_only ) { - return std::atol( query_string( loop, draw_only ).c_str() ); + return std::atoll( query_string( loop, draw_only ).c_str() ); } const std::string &string_input_popup::query_string( const bool loop, const bool draw_only ) @@ -496,6 +496,7 @@ void string_input_popup::edit( std::string &value ) } } +// NOLINTNEXTLINE(cata-no-long) void string_input_popup::edit( long &value ) { only_digits( true ); diff --git a/src/string_input_popup.h b/src/string_input_popup.h index a0f814d8b83bd..17a0ae62afaf1 100644 --- a/src/string_input_popup.h +++ b/src/string_input_popup.h @@ -219,7 +219,7 @@ class string_input_popup /**@{*/ void query( bool loop = true, bool draw_only = false ); int query_int( bool loop = true, bool draw_only = false ); - long query_long( bool loop = true, bool draw_only = false ); + int64_t query_int64_t( bool loop = true, bool draw_only = false ); const std::string &query_string( bool loop = true, bool draw_only = false ); /**@}*/ /** @@ -244,6 +244,8 @@ class string_input_popup */ /**@{*/ void edit( std::string &value ); + // Acceptable to use long as part of overload set + // NOLINTNEXTLINE(cata-no-long) void edit( long &value ); void edit( int &value ); /**@}*/ diff --git a/src/submap.h b/src/submap.h index 9a3a2b7b53749..3b999410956be 100644 --- a/src/submap.h +++ b/src/submap.h @@ -12,6 +12,7 @@ #include "active_item_cache.h" #include "basecamp.h" #include "calendar.h" +#include "colony.h" #include "computer.h" #include "construction.h" #include "field.h" @@ -47,13 +48,13 @@ struct spawn_point { template struct maptile_soa { - ter_id ter[sx][sy]; // Terrain on each square - furn_id frn[sx][sy]; // Furniture on each square - std::uint8_t lum[sx][sy]; // Number of items emitting light on each square - std::list itm[sx][sy]; // Items on each square - field fld[sx][sy]; // Field on each square - trap_id trp[sx][sy]; // Trap on each square - int rad[sx][sy]; // Irradiation of each square + ter_id ter[sx][sy]; // Terrain on each square + furn_id frn[sx][sy]; // Furniture on each square + std::uint8_t lum[sx][sy]; // Number of items emitting light on each square + cata::colony itm[sx][sy]; // Items on each square + field fld[sx][sy]; // Field on each square + trap_id trp[sx][sy]; // Trap on each square + int rad[sx][sy]; // Irradiation of each square void swap_soa_tile( const point &p1, const point &p2 ); void swap_soa_tile( const point &p, maptile_soa<1, 1> &other ); @@ -254,8 +255,9 @@ struct maptile { return sm->fld[x][y].find_field( field_to_find ); } - bool add_field( const field_id field_to_add, const int new_density, const time_duration &new_age ) { - const bool ret = sm->fld[x][y].add_field( field_to_add, new_density, new_age ); + bool add_field( const field_id field_to_add, const int new_intensity, + const time_duration &new_age ) { + const bool ret = sm->fld[x][y].add_field( field_to_add, new_intensity, new_age ); if( ret ) { sm->field_count++; } @@ -288,8 +290,9 @@ struct maptile { return sm->itm[x][y].size(); } + // Assumes there is at least one item const item &get_uppermost_item() const { - return sm->itm[x][y].back(); + return *std::prev( sm->itm[x][y].cend() ); } }; diff --git a/src/trait_group.cpp b/src/trait_group.cpp index 5e0499506365d..55bd68cccf990 100644 --- a/src/trait_group.cpp +++ b/src/trait_group.cpp @@ -208,14 +208,12 @@ bool Trait_group_creator::has_trait( const trait_id &tid ) const void Trait_group::add_trait_entry( const trait_id &tid, int probability ) { - std::unique_ptr ptr( new Single_trait_creator( tid, probability ) ); - add_entry( ptr ); + add_entry( std::make_unique( tid, probability ) ); } void Trait_group::add_group_entry( const Trait_group_tag &gid, int probability ) { - std::unique_ptr ptr( new Trait_group_creator( gid, probability ) ); - add_entry( ptr ); + add_entry( std::make_unique( gid, probability ) ); } void Trait_group::check_consistency() const @@ -269,7 +267,7 @@ Trait_list Trait_group_collection::create( RecursionList &rec ) const return result; } -void Trait_group_collection::add_entry( std::unique_ptr &ptr ) +void Trait_group_collection::add_entry( std::unique_ptr ptr ) { assert( ptr.get() != nullptr ); if( ptr->probability <= 0 ) { @@ -282,7 +280,7 @@ void Trait_group_collection::add_entry( std::unique_ptr &pt ptr.release(); } -void Trait_group_distribution::add_entry( std::unique_ptr &ptr ) +void Trait_group_distribution::add_entry( std::unique_ptr ptr ) { assert( ptr.get() != nullptr ); if( ptr->probability <= 0 ) { diff --git a/src/trait_group.h b/src/trait_group.h index c949328cabd65..2b7c5921d5d6a 100644 --- a/src/trait_group.h +++ b/src/trait_group.h @@ -61,7 +61,7 @@ Trait_group_tag load_trait_group( JsonIn &stream, const std::string &default_sub */ void debug_spawn(); -} +} // namespace trait_group /** * Base interface for trait generation. @@ -159,7 +159,7 @@ class Trait_group : public Trait_creation_data * @ref mutation_branch::add_entry, @ref add_trait_entry or @ref add_group_entry). Its purpose * is to add a Single_trait_creator or Trait_group_creator to @ref creators. */ - virtual void add_entry( std::unique_ptr &ptr ) = 0; + virtual void add_entry( std::unique_ptr ptr ) = 0; void check_consistency() const override; bool remove_trait( const trait_id &tid ) override; @@ -183,7 +183,7 @@ class Trait_group_collection : public Trait_group ~Trait_group_collection() override = default; trait_group::Trait_list create( RecursionList &rec ) const override; - void add_entry( std::unique_ptr &ptr ) override; + void add_entry( std::unique_ptr ptr ) override; }; /** @@ -199,7 +199,7 @@ class Trait_group_distribution : public Trait_group ~Trait_group_distribution() override = default; trait_group::Trait_list create( RecursionList &rec ) const override; - void add_entry( std::unique_ptr &ptr ) override; + void add_entry( std::unique_ptr ptr ) override; }; #endif diff --git a/src/translations.cpp b/src/translations.cpp index c4655e30929c7..5cd1f4e26aa16 100644 --- a/src/translations.cpp +++ b/src/translations.cpp @@ -76,7 +76,7 @@ const char *pgettext( const char *context, const char *msgid ) } const char *npgettext( const char *const context, const char *const msgid, - const char *const msgid_plural, const unsigned long int n ) + const char *const msgid_plural, const unsigned long long n ) { const std::string context_id = std::string( context ) + '\004' + msgid; const char *const msg_ctxt_id = context_id.c_str(); diff --git a/src/translations.h b/src/translations.h index 38fcff819f552..e6c067b45e678 100644 --- a/src/translations.h +++ b/src/translations.h @@ -55,11 +55,24 @@ inline std::string _( const std::string &msg ) return _( msg.c_str() ); } +// ngettext overload taking an unsigned long long so that people don't need +// to cast at call sites. This is particularly relevant on 64-bit Windows where +// size_t is bigger than unsigned long, so MSVC will try to encourage you to +// add a cast. +template::value>> +ATTRIBUTE_FORMAT_ARG( 1 ) +inline const char *ngettext( const char *msgid, const char *msgid_plural, T n ) +{ + // Leaving this long because it matches the underlying API. + // NOLINTNEXTLINE(cata-no-long) + return ngettext( msgid, msgid_plural, static_cast( n ) ); +} + const char *pgettext( const char *context, const char *msgid ) ATTRIBUTE_FORMAT_ARG( 2 ); // same as pgettext, but supports plural forms like ngettext const char *npgettext( const char *context, const char *msgid, const char *msgid_plural, - unsigned long int n ) ATTRIBUTE_FORMAT_ARG( 2 ); + unsigned long long n ) ATTRIBUTE_FORMAT_ARG( 2 ); #else // !LOCALIZE diff --git a/src/trap.cpp b/src/trap.cpp index 77c5cc20b8984..8da18dea8d9af 100644 --- a/src/trap.cpp +++ b/src/trap.cpp @@ -28,7 +28,7 @@ namespace generic_factory trap_factory( "trap" ); -} +} // namespace /** @relates string_id */ template<> diff --git a/src/trap.h b/src/trap.h index a19a79ad545f4..58f995e9d4656 100644 --- a/src/trap.h +++ b/src/trap.h @@ -58,7 +58,7 @@ void hum( Creature *creature, const tripoint &p ); void shadow( Creature *creature, const tripoint &p ); void drain( Creature *creature, const tripoint &p ); void snake( Creature *creature, const tripoint &p ); -} +} // namespace trapfunc using trap_function = std::function; diff --git a/src/tuple_hash.h b/src/tuple_hash.h index 75c99890e7ef4..3862d1887fd02 100644 --- a/src/tuple_hash.h +++ b/src/tuple_hash.h @@ -39,7 +39,7 @@ struct HashValueImpl { hash_combine( seed, get<0>( tuple ) ); } }; -} +} // namespace template struct hash> { @@ -61,6 +61,6 @@ struct hash> { return seed; } }; -} +} // namespace std #endif diff --git a/src/tutorial.cpp b/src/tutorial.cpp index a70e4f3f4cdfd..f6a072e8e4c85 100644 --- a/src/tutorial.cpp +++ b/src/tutorial.cpp @@ -118,10 +118,10 @@ void tutorial_game::per_turn() } if( !tutorials_seen[LESSON_BUTCHER] ) { - for( size_t i = 0; i < g->m.i_at( g->u.posx(), g->u.posy() ).size(); i++ ) { - if( g->m.i_at( g->u.posx(), g->u.posy() )[i].is_corpse() ) { + for( const item &it : g->m.i_at( g->u.posx(), g->u.posy() ) ) { + if( it.is_corpse() ) { add_message( LESSON_BUTCHER ); - i = g->m.i_at( g->u.posx(), g->u.posy() ).size(); + break; } } } diff --git a/src/type_id.h b/src/type_id.h index 036a566a06d61..fc926659b7bb1 100644 --- a/src/type_id.h +++ b/src/type_id.h @@ -11,6 +11,9 @@ using ammotype = string_id; struct bionic_data; using bionic_id = string_id; +struct construction_category; +using construction_category_id = string_id; + class effect_type; using efftype_id = string_id; @@ -98,7 +101,7 @@ class Trait_group; namespace trait_group { using Trait_group_tag = string_id; -} +} // namespace trait_group struct trap; using trap_id = int_id; diff --git a/src/ui.cpp b/src/ui.cpp index ea03caae644c0..aabb753b3d6f8 100644 --- a/src/ui.cpp +++ b/src/ui.cpp @@ -493,8 +493,8 @@ void uilist::setup() popup( "Can't display menu options, 0 %d available screen rows are occupied\nThis is probably a bug.\n", TERMY ); } else { - popup( "Can't display menu options, %lu %d available screen rows are occupied by\n'%s\n(snip)\n%s'\nThis is probably a bug.\n", - static_cast( textformatted.size() ), TERMY, textformatted[ 0 ].c_str(), + popup( "Can't display menu options, %zu %d available screen rows are occupied by\n'%s\n(snip)\n%s'\nThis is probably a bug.\n", + textformatted.size(), TERMY, textformatted[ 0 ].c_str(), textformatted[ textformatted.size() - 1 ].c_str() ); } } diff --git a/src/veh_interact.cpp b/src/veh_interact.cpp index b41e501c0b1b9..19a4df09d87bd 100644 --- a/src/veh_interact.cpp +++ b/src/veh_interact.cpp @@ -528,15 +528,15 @@ task_reason veh_interact::cant_do( char mode ) if( abs( veh->velocity ) > 100 || g->u.controlling_vehicle ) { return MOVING_VEHICLE; } + if( !valid_target ) { + return INVALID_TARGET; + } if( !enough_morale ) { return LOW_MORALE; } if( !enough_light ) { return LOW_LIGHT; } - if( !valid_target ) { - return INVALID_TARGET; - } if( !has_tools ) { return LACK_TOOLS; } @@ -742,23 +742,11 @@ void veh_interact::move_fuel_cursor( int delta ) bool veh_interact::do_install( std::string &msg ) { - switch( cant_do( 'i' ) ) { - case LOW_MORALE: - msg = _( "Your morale is too low to construct..." ); - return false; - case LOW_LIGHT: - msg = _( "It's too dark to see what you are doing..." ); - return false; - case INVALID_TARGET: - msg = _( "Cannot install any part here." ); - return false; + task_reason reason = cant_do( 'i' ); - case MOVING_VEHICLE: - msg = _( "You can't install parts while driving." ); - return false; - - default: - break; + if( reason == INVALID_TARGET ) { + msg = _( "Cannot install any part here." ); + return false; } set_title( _( "Choose new part to install here:" ) ); @@ -918,6 +906,23 @@ bool veh_interact::do_install( std::string &msg ) } if( action == "INSTALL" || action == "CONFIRM" ) { if( can_install ) { + switch( reason ) { + case LOW_MORALE: + msg = _( "Your morale is too low to construct..." ); + return false; + case LOW_LIGHT: + msg = _( "It's too dark to see what you are doing..." ); + return false; + case MOVING_VEHICLE: + msg = _( "You can't install parts while driving." ); + return false; + default: + break; + } + if( veh->is_foldable() && !sel_vpart_info->has_flag( "FOLDABLE" ) && + !query_yn( _( "Installing this part will make the vehicle unfoldable. Continue?" ) ) ) { + return true; + } const auto &shapes = vpart_shapes[ sel_vpart_info->name() + sel_vpart_info->item ]; int selected_shape = -1; if( shapes.size() > 1 ) { // more than one shape available, display selection @@ -1001,30 +1006,17 @@ bool veh_interact::move_in_list( int &pos, const std::string &action, const int bool veh_interact::do_repair( std::string &msg ) { - switch( cant_do( 'r' ) ) { - case LOW_MORALE: - msg = _( "Your morale is too low to repair..." ); + task_reason reason = cant_do( 'r' ); + + if( reason == INVALID_TARGET ) { + vehicle_part *most_repairable = get_most_repariable_part(); + if( most_repairable ) { + move_cursor( most_repairable->mount.y + ddy, -( most_repairable->mount.x + ddx ) ); return false; - case LOW_LIGHT: - msg = _( "It's too dark to see what you are doing..." ); + } else { + msg = _( "There are no damaged parts on this vehicle." ); return false; - case INVALID_TARGET: { - vehicle_part *most_repairable = get_most_repariable_part(); - if( most_repairable ) { - move_cursor( most_repairable->mount.y + ddy, -( most_repairable->mount.x + ddx ) ); - return false; - } else { - msg = _( "There are no damaged parts on this vehicle." ); - return false; - } } - - case MOVING_VEHICLE: - msg = _( "You can't repair stuff while driving." ); - return false; - - default: - break; } set_title( _( "Choose a part here to repair:" ) ); @@ -1034,27 +1026,27 @@ bool veh_interact::do_repair( std::string &msg ) vehicle_part &pt = veh->parts[parts_here[need_repair[pos]]]; const vpart_info &vp = pt.info(); - std::ostringstream msg; + std::ostringstream nmsg; bool ok; if( pt.is_broken() ) { - ok = format_reqs( msg, vp.install_requirements(), vp.install_skills, vp.install_time( g->u ) ); + ok = format_reqs( nmsg, vp.install_requirements(), vp.install_skills, vp.install_time( g->u ) ); } else { if( !vp.repair_requirements().is_empty() && pt.base.max_damage() > 0 ) { - ok = format_reqs( msg, vp.repair_requirements() * pt.base.damage_level( 4 ), vp.repair_skills, + 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() ); } else { - msg << "" << _( "This part cannot be repaired" ) << ""; + nmsg << "" << _( "This part cannot be repaired" ) << ""; ok = false; } } std::string desc_color = string_format( "", string_from_color( pt.is_broken() ? c_dark_gray : c_light_gray ) ); - vp.format_description( msg, desc_color, getmaxx( w_msg ) - 4 ); + vp.format_description( nmsg, desc_color, getmaxx( w_msg ) - 4 ); werase( w_msg ); - fold_and_print( w_msg, 0, 1, getmaxx( w_msg ) - 2, c_light_gray, msg.str() ); + fold_and_print( w_msg, 0, 1, getmaxx( w_msg ) - 2, c_light_gray, nmsg.str() ); wrefresh( w_msg ); werase( w_parts ); @@ -1064,6 +1056,22 @@ bool veh_interact::do_repair( std::string &msg ) const std::string action = main_context.handle_input(); if( ( action == "REPAIR" || action == "CONFIRM" ) && ok ) { + switch( reason ) { + case LOW_MORALE: + msg = _( "Your morale is too low to repair..." ); + return false; + case LOW_LIGHT: + msg = _( "It's too dark to see what you are doing..." ); + return false; + case MOVING_VEHICLE: + msg = _( "You can't repair stuff while driving." ); + return false; + case INVALID_TARGET: + msg = _( "There are no damaged parts on this vehicle." ); + return false; + default: + break; + } sel_vehicle_part = &pt; sel_vpart_info = &vp; const std::vector helpers = g->u.get_crafting_helpers(); @@ -1101,11 +1109,9 @@ bool veh_interact::do_mend( std::string &msg ) case INVALID_TARGET: msg = _( "No faulty parts require mending." ); return false; - case MOVING_VEHICLE: msg = _( "You can't mend stuff while driving." ); return false; - default: break; } @@ -1618,27 +1624,11 @@ bool veh_interact::can_remove_part( int idx ) bool veh_interact::do_remove( std::string &msg ) { - switch( cant_do( 'o' ) ) { - case LOW_MORALE: - msg = _( "Your morale is too low to construct..." ); - return false; - case LOW_LIGHT: - msg = _( "It's too dark to see what you are doing..." ); - return false; - case INVALID_TARGET: - msg = _( "No parts here." ); - return false; - - case NOT_FREE: - msg = _( "You cannot remove that part while something is attached to it." ); - return false; + task_reason reason = cant_do( 'o' ); - case MOVING_VEHICLE: - msg = _( "Better not remove something while driving." ); - return false; - - default: - break; + if( reason == INVALID_TARGET ) { + msg = _( "No parts here." ); + return false; } set_title( _( "Choose a part here to remove:" ) ); @@ -1667,6 +1657,22 @@ bool veh_interact::do_remove( std::string &msg ) //read input const std::string action = main_context.handle_input(); if( can_remove && ( action == "REMOVE" || action == "CONFIRM" ) ) { + switch( reason ) { + case LOW_MORALE: + msg = _( "Your morale is too low to construct..." ); + return false; + case LOW_LIGHT: + msg = _( "It's too dark to see what you are doing..." ); + return false; + case NOT_FREE: + msg = _( "You cannot remove that part while something is attached to it." ); + return false; + case MOVING_VEHICLE: + msg = _( "Better not remove something while driving." ); + return false; + default: + break; + } const std::vector helpers = g->u.get_crafting_helpers(); for( const npc *np : helpers ) { add_msg( m_info, _( "%s helps with this task..." ), np->name ); diff --git a/src/veh_utils.cpp b/src/veh_utils.cpp index 0ba673b23b74c..58d7e9ac2d991 100644 --- a/src/veh_utils.cpp +++ b/src/veh_utils.cpp @@ -176,4 +176,4 @@ bool repair_part( vehicle &veh, vehicle_part &pt, Character &who_c ) return true; } -} +} // namespace veh_utils diff --git a/src/veh_utils.h b/src/veh_utils.h index 82ef2c2b9e9d8..a4257ea3d71ee 100644 --- a/src/veh_utils.h +++ b/src/veh_utils.h @@ -26,6 +26,6 @@ vehicle_part &most_repairable_part( vehicle &veh, Character &who_arg, * Awards xp and consumes components. */ bool repair_part( vehicle &veh, vehicle_part &part, Character &who ); -} +} // namespace veh_utils #endif diff --git a/src/vehicle.cpp b/src/vehicle.cpp index 403821fc6612d..75803e94fbb12 100644 --- a/src/vehicle.cpp +++ b/src/vehicle.cpp @@ -19,6 +19,7 @@ #include "ammo.h" #include "avatar.h" #include "cata_utility.h" +#include "colony.h" #include "coordinate_conversions.h" #include "creature.h" #include "debug.h" @@ -80,22 +81,16 @@ inline int modulo( int v, int m ); point vehicles::cardinal_d[5] = { point( -1, 0 ), point( 1, 0 ), point( 0, -1 ), point( 0, 1 ), point_zero }; // Vehicle stack methods. -std::list::iterator vehicle_stack::erase( std::list::iterator it ) +vehicle_stack::iterator vehicle_stack::erase( vehicle_stack::const_iterator it ) { return myorigin->remove_item( part_num, it ); } -void vehicle_stack::push_back( const item &newitem ) +void vehicle_stack::insert( const item &newitem ) { myorigin->add_item( part_num, newitem ); } -void vehicle_stack::insert_at( std::list::iterator index, - const item &newitem ) -{ - myorigin->add_item_at( part_num, index, newitem ); -} - units::volume vehicle_stack::max_volume() const { if( myorigin->part_flag( part_num, "CARGO" ) && myorigin->parts[part_num].is_available() ) { @@ -3249,20 +3244,20 @@ bool vehicle::do_environmental_effects() return needed; } -void vehicle::spew_smoke( double joules, int part, int density ) +void vehicle::spew_smoke( double joules, int part, int intensity ) { if( rng( 1, 10000 ) > joules ) { return; } point p = parts[part].mount; - density = std::max( joules / 10000, static_cast( density ) ); + intensity = std::max( joules / 10000, static_cast( intensity ) ); // Move back from engine/muffler until we find an open space while( relative_parts.find( p ) != relative_parts.end() ) { p.x += ( velocity < 0 ? 1 : -1 ); } point q = coord_translate( p ); const tripoint dest = global_pos3() + tripoint( q.x, q.y, 0 ); - g->m.adjust_field_strength( dest, fd_smoke, density ); + g->m.adjust_field_intensity( dest, fd_smoke, intensity ); } /** @@ -3324,7 +3319,7 @@ void vehicle::noise_and_smoke( int load, time_duration time ) } if( ( exhaust_part == -1 ) && engine_on ) { - spew_smoke( j, p, bad_filter ? MAX_FIELD_DENSITY : 1 ); + spew_smoke( j, p, bad_filter ? MAX_FIELD_INTENSITY : 1 ); } else { mufflesmoke += j; } @@ -3336,7 +3331,7 @@ void vehicle::noise_and_smoke( int load, time_duration time ) } if( ( exhaust_part != -1 ) && engine_on && has_engine_type_not( fuel_type_muscle, true ) ) { // No engine, no smoke - spew_smoke( mufflesmoke, exhaust_part, bad_filter ? MAX_FIELD_DENSITY : 1 ); + spew_smoke( mufflesmoke, exhaust_part, bad_filter ? MAX_FIELD_INTENSITY : 1 ); } // Cap engine noise to avoid deafening. noise = std::min( noise, 100.0 ); @@ -4387,94 +4382,81 @@ int vehicle::add_charges( int part, const item &itm ) return add_item( part, itm_copy ) ? ret : 0; } -bool vehicle::add_item( int part, const item &itm ) +cata::optional vehicle::add_item( vehicle_part &pt, const item &obj ) +{ + int idx = index_of_part( &pt ); + if( idx < 0 ) { + debugmsg( "Tried to add item to invalid part" ); + return cata::nullopt; + } + return add_item( idx, obj ); +} + +cata::optional vehicle::add_item( int part, const item &itm ) { if( part < 0 || part >= static_cast( parts.size() ) ) { debugmsg( "int part (%d) is out of range", part ); - return false; + return cata::nullopt; } // const int max_weight = ?! // TODO: weight limit, calculation per vpart & vehicle stats, not a hard user limit. // add creaking sounds and damage to overloaded vpart, outright break it past a certain point, or when hitting bumps etc if( parts[ part ].base.is_gun() ) { if( !itm.is_ammo() || !parts[ part ].base.ammo_types().count( itm.ammo_type() ) ) { - return false; + return cata::nullopt; } } bool charge = itm.count_by_charges(); vehicle_stack istack = get_items( part ); const int to_move = istack.amount_can_fit( itm ); if( to_move == 0 || ( charge && to_move < itm.charges ) ) { - return false; // @add_charges should be used in the latter case + return cata::nullopt; // @add_charges should be used in the latter case } if( charge ) { item *here = istack.stacks_with( itm ); if( here ) { invalidate_mass(); - return here->merge_charges( itm ); + if( !here->merge_charges( itm ) ) { + return cata::nullopt; + } else { + return cata::optional( istack.get_iterator_from_pointer( here ) ); + } } } - return add_item_at( part, parts[part].items.end(), itm ); -} -bool vehicle::add_item( vehicle_part &pt, const item &obj ) -{ - int idx = index_of_part( &pt ); - if( idx < 0 ) { - debugmsg( "Tried to add item to invalid part" ); - return false; - } - return add_item( idx, obj ); -} + item itm_copy = itm; -bool vehicle::add_item_at( int part, std::list::iterator index, item itm ) -{ - if( itm.is_bucket_nonempty() ) { - for( auto &elem : itm.contents ) { + if( itm_copy.is_bucket_nonempty() ) { + for( auto &elem : itm_copy.contents ) { g->m.add_item_or_charges( global_part_pos3( part ), elem ); } - itm.contents.clear(); + itm_copy.contents.clear(); } - const auto new_pos = parts[part].items.insert( index, itm ); - if( itm.needs_processing() ) { + const vehicle_stack::iterator new_pos = parts[part].items.insert( itm_copy ); + if( itm_copy.needs_processing() ) { active_items.add( new_pos, parts[part].mount ); } invalidate_mass(); - return true; + return cata::optional( new_pos ); } -bool vehicle::remove_item( int part, int itemdex ) +bool vehicle::remove_item( int part, item *it ) { - if( itemdex < 0 || itemdex >= static_cast( parts[part].items.size() ) ) { + const cata::colony &veh_items = parts[part].items; + const cata::colony::const_iterator iter = veh_items.get_iterator_from_pointer( it ); + if( iter == veh_items.end() ) { return false; } - - remove_item( part, std::next( parts[part].items.begin(), itemdex ) ); + remove_item( part, iter ); return true; } -bool vehicle::remove_item( int part, const item *it ) -{ - bool rc = false; - std::list &veh_items = parts[part].items; - - for( auto iter = veh_items.begin(); iter != veh_items.end(); iter++ ) { - //delete the item if the pointer memory addresses are the same - if( it == &*iter ) { - remove_item( part, iter ); - rc = true; - break; - } - } - return rc; -} - -std::list::iterator vehicle::remove_item( int part, std::list::iterator it ) +vehicle_stack::iterator vehicle::remove_item( int part, vehicle_stack::const_iterator it ) { - std::list &veh_items = parts[part].items; + cata::colony &veh_items = parts[part].items; if( active_items.has( it, parts[part].mount ) ) { active_items.remove( it, parts[part].mount ); @@ -5532,8 +5514,8 @@ void vehicle::update_time( const time_point &update_to ) if( pt.is_unavailable() || ( !pt.enabled ) ) { continue; } - int density = abs( pt.info().epower ) * 2; - g->m.adjust_field_strength( global_part_pos3( pt ), fd_hot_air3, density ); + int intensity = abs( pt.info().epower ) * 2; + g->m.adjust_field_intensity( global_part_pos3( pt ), fd_hot_air3, intensity ); discharge_battery( pt.info().epower ); } // coolers emitting cold air @@ -5542,8 +5524,8 @@ void vehicle::update_time( const time_point &update_to ) if( pt.is_unavailable() || ( !pt.enabled ) ) { continue; } - int density = abs( pt.info().epower ) * 5; - g->m.adjust_field_strength( global_part_pos3( pt ), fd_cold_air3, density ); + int intensity = abs( pt.info().epower ) * 5; + g->m.adjust_field_intensity( global_part_pos3( pt ), fd_cold_air3, intensity ); discharge_battery( pt.info().epower ); } // Get one weather data set per vehicle, they don't differ much across vehicle area diff --git a/src/vehicle.h b/src/vehicle.h index 6d380aa44e574..60de5643ffab0 100644 --- a/src/vehicle.h +++ b/src/vehicle.h @@ -5,7 +5,6 @@ #include #include #include -#include #include #include #include @@ -17,6 +16,7 @@ #include "active_item_cache.h" #include "calendar.h" +#include "colony.h" #include "clzones.h" #include "damage.h" #include "game_constants.h" @@ -61,7 +61,7 @@ extern point cardinal_d[5]; // ratio of constant rolling resistance to the part that varies with velocity constexpr double rolling_constant_to_variable = 33.33; constexpr float vmiph_per_tile = 400.0f; -} +} // namespace vehicles struct rider_data { Creature *psg = nullptr; int prt = -1; @@ -118,11 +118,10 @@ class vehicle_stack : public item_stack vehicle *myorigin; int part_num; public: - vehicle_stack( std::list *newstack, point newloc, vehicle *neworigin, int part ) : + vehicle_stack( cata::colony *newstack, point newloc, vehicle *neworigin, int part ) : item_stack( newstack ), location( newloc ), myorigin( neworigin ), part_num( part ) {} - std::list::iterator erase( std::list::iterator it ) override; - void push_back( const item &newitem ) override; - void insert_at( std::list::iterator index, const item &newitem ) override; + iterator erase( const_iterator it ) override; + void insert( const item &newitem ) override; int count_limit() const override { return MAX_ITEM_IN_VEHICLE_STORAGE; } @@ -384,7 +383,7 @@ struct vehicle_part { mutable const vpart_info *info_cache = nullptr; item base; - std::list items; // inventory + cata::colony items; // inventory /** Preferred ammo type when multiple are available */ itype_id ammo_pref = "null"; @@ -1110,7 +1109,7 @@ class vehicle int safe_velocity( bool fueled = true ) const; // Generate smoke from a part, either at front or back of vehicle depending on velocity. - void spew_smoke( double joules, int part, int density = 1 ); + void spew_smoke( double joules, int part, int intensity = 1 ); // Loop through engines and generate noise and smoke for each one void noise_and_smoke( int load, time_duration time = 1_turns ); @@ -1253,28 +1252,23 @@ class vehicle /** * Try to add an item to part's cargo. * - * @returns False if it can't be put here (not a cargo part, adding this would violate + * @returns cata::nullopt if it can't be put here (not a cargo part, adding this would violate * the volume limit or item count limit, not all charges can fit, etc.) + * Otherwise, returns an iterator to the added item in the vehicle stack */ - bool add_item( int part, const item &obj ); + cata::optional add_item( int part, const item &obj ); /** Like the above */ - bool add_item( vehicle_part &pt, const item &obj ); + cata::optional add_item( vehicle_part &pt, const item &obj ); /** * Add an item counted by charges to the part's cargo. * * @returns The number of charges added. */ int add_charges( int part, const item &itm ); - /** - * Position specific item insertion that skips a bunch of safety checks - * since it should only ever be used by item processing code. - */ - bool add_item_at( int part, std::list::iterator index, item itm ); // remove item from part's cargo - bool remove_item( int part, int itemdex ); - bool remove_item( int part, const item *it ); - std::list::iterator remove_item( int part, std::list::iterator it ); + bool remove_item( int part, item *it ); + vehicle_stack::iterator remove_item( int part, vehicle_stack::const_iterator it ); vehicle_stack get_items( int part ) const; vehicle_stack get_items( int part ); diff --git a/src/vehicle_group.cpp b/src/vehicle_group.cpp index b83e156ba969f..fa3109ba3bee8 100644 --- a/src/vehicle_group.cpp +++ b/src/vehicle_group.cpp @@ -283,7 +283,7 @@ static void builtin_parkinglot( map &m, const std::string & ) } } -}// end of VehicleSpawnFunction namespace +} // namespace VehicleSpawnFunction VehicleSpawn::FunctionMap VehicleSpawn::builtin_functions = { { "no_vehicles", VehicleSpawnFunction::builtin_no_vehicles }, diff --git a/src/vehicle_move.cpp b/src/vehicle_move.cpp index 6fe30ddea6b3a..743c5dc12f833 100644 --- a/src/vehicle_move.cpp +++ b/src/vehicle_move.cpp @@ -18,6 +18,7 @@ #include "mapdata.h" #include "material.h" #include "messages.h" +#include "options.h" #include "sounds.h" #include "translations.h" #include "trap.h" @@ -290,7 +291,7 @@ void vehicle::turn( int deg ) if( deg == 0 ) { return; } - if( velocity < 0 ) { + if( velocity < 0 && !::get_option( "REVERSE_STEERING" ) ) { deg = -deg; } last_turn = deg; diff --git a/src/vehicle_use.cpp b/src/vehicle_use.cpp index 719f3cf81c9b3..646e370c7da1a 100644 --- a/src/vehicle_use.cpp +++ b/src/vehicle_use.cpp @@ -1117,30 +1117,32 @@ void vehicle::operate_reaper() 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 || - !g->m.has_items( reaper_pos ) ) { + if( g->m.furn( reaper_pos ) != f_plant_harvest ) { continue; } - const item &seed = g->m.i_at( reaper_pos ).front(); - if( seed.typeId() == "fungal_seeds" || - seed.typeId() == "marloss_seed" ) { + // Can't use item_stack::only_item() since there might be fertilizer + map_stack items = g->m.i_at( reaper_pos ); + map_stack::iterator seed = std::find_if( items.begin(), items.end(), []( const item & it ) { + return it.is_seed(); + } ); + if( seed == items.end() || seed->typeId() == "fungal_seeds" || + seed->typeId() == "marloss_seed" ) { // Otherworldly plants, the earth-made reaper can not handle those. continue; } g->m.furn_set( reaper_pos, f_null ); g->m.i_clear( reaper_pos ); for( auto &i : iexamine::get_harvest_items( - *seed.type, plant_produced, seed_produced, false ) ) { + *seed->type, plant_produced, seed_produced, false ) ) { g->m.add_item_or_charges( reaper_pos, i ); } sounds::sound( reaper_pos, rng( 10, 25 ), sounds::sound_t::combat, _( "Swish" ), false, "vehicle", "reaper" ); if( vp.has_feature( "CARGO" ) ) { - map_stack stack( g->m.i_at( reaper_pos ) ); - for( auto iter = stack.begin(); iter != stack.end(); ) { + for( map_stack::iterator iter = items.begin(); iter != items.end(); ) { if( ( iter->volume() <= max_pickup_volume ) && add_item( reaper_id, *iter ) ) { - iter = stack.erase( iter ); + iter = items.erase( iter ); } else { ++iter; } @@ -1209,18 +1211,16 @@ void vehicle::operate_scoop() continue; } item *that_item_there = nullptr; - const map_stack q = g->m.i_at( position ); + map_stack items = g->m.i_at( position ); if( g->m.has_flag( "SEALED", position ) ) { // Ignore it. Street sweepers are not known for their ability to harvest crops. continue; } - size_t itemdex = 0; - for( const item &it : q ) { + for( item &it : items ) { if( it.volume() < max_pickup_volume ) { - that_item_there = g->m.item_from( position, itemdex ); + that_item_there = ⁢ break; } - itemdex++; } if( !that_item_there ) { continue; @@ -1235,7 +1235,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, itemdex ); + g->m.i_rem( position, that_item_there ); } else { break; } diff --git a/src/visitable.cpp b/src/visitable.cpp index 03ea17c66bc14..a2d7968b58b0b 100644 --- a/src/visitable.cpp +++ b/src/visitable.cpp @@ -659,7 +659,8 @@ std::list visitable::remove_items_with( const sub->update_lum_rem( offset, *iter ); // finally remove the item - res.splice( res.end(), sub->itm[ offset.x ][ offset.y ], iter++ ); + res.push_back( *iter ); + iter = sub->itm[ offset.x ][ offset.y ].erase( iter ); if( --count == 0 ) { return res; @@ -715,7 +716,10 @@ std::list visitable::remove_items_with( const if( cur->veh.active_items.has( iter, part.mount ) ) { cur->veh.active_items.remove( iter, part.mount ); } - res.splice( res.end(), part.items, iter++ ); + + res.push_back( *iter ); + iter = part.items.erase( iter ); + if( --count == 0 ) { return res; } diff --git a/src/weather.h b/src/weather.h index 48e62c8b316fa..57284f99fbfa5 100644 --- a/src/weather.h +++ b/src/weather.h @@ -146,7 +146,7 @@ int light_modifier( weather_type const type ); int sound_attn( weather_type const type ); bool dangerous( weather_type const type ); weather_effect_fn effect( weather_type const type ); -} +} // namespace weather std::string get_shortdirstring( int angle ); diff --git a/src/weather_data.cpp b/src/weather_data.cpp index 61759767e6b0b..3bb426da577d8 100644 --- a/src/weather_data.cpp +++ b/src/weather_data.cpp @@ -169,6 +169,6 @@ weather_effect_fn effect( weather_type const type ) { return weather_data_internal( type ).datum.effect; } -} +} // namespace weather ///@} diff --git a/src/worldfactory.cpp b/src/worldfactory.cpp index 399237114a26b..afced5826b310 100644 --- a/src/worldfactory.cpp +++ b/src/worldfactory.cpp @@ -125,7 +125,7 @@ WORLDPTR worldfactory::add_world( std::unique_ptr retworld ) WORLDPTR worldfactory::make_new_world( const std::vector &mods ) { - std::unique_ptr retworld( new WORLD() ); + std::unique_ptr retworld = std::make_unique(); retworld->active_mod_order = mods; return add_world( std::move( retworld ) ); } @@ -133,7 +133,7 @@ WORLDPTR worldfactory::make_new_world( const std::vector &mods ) WORLDPTR worldfactory::make_new_world( bool show_prompt, const std::string &world_to_copy ) { // World to return after generating - std::unique_ptr retworld( new WORLD() ); + std::unique_ptr retworld = std::make_unique(); if( !world_to_copy.empty() ) { retworld->COPY_WORLD( world_generator->get_world( world_to_copy ) ); @@ -190,7 +190,7 @@ WORLDPTR worldfactory::make_new_world( special_game_id special_type ) return all_worlds[worldname].get(); } - std::unique_ptr special_world( new WORLD() ); + std::unique_ptr special_world = std::make_unique(); special_world->world_name = worldname; special_world->WORLD_OPTIONS["WORLD_END"].setValue( "delete" ); @@ -298,7 +298,7 @@ void worldfactory::init() if( has_world( "save" ) ) { const WORLD &old_world = *all_worlds["save"]; - std::unique_ptr newworld( new WORLD() ); + std::unique_ptr newworld = std::make_unique(); newworld->world_name = get_next_valid_worldname(); // save world as conversion world @@ -665,7 +665,7 @@ void worldfactory::draw_mod_list( const catacurses::window &w, int &start, size_ if( w_shift ) { // get shift information for the active item std::string shift_display; - const long iPos = std::distance( mods.begin(), iter ); + const size_t iPos = std::distance( mods.begin(), iter ); if( mman_ui->can_shift_up( iPos, mods ) ) { shift_display += "+ "; diff --git a/tests/behavior_test.cpp b/tests/behavior_test.cpp index 4846cc4040e0a..388b84b1b14c7 100644 --- a/tests/behavior_test.cpp +++ b/tests/behavior_test.cpp @@ -12,7 +12,7 @@ namespace behavior extern sequential_t default_sequential; extern fallback_t default_fallback; extern sequential_until_done_t default_until_done; -} +} // namespace behavior static behavior::node_t make_test_node( std::string goal, behavior::status_t *status ) { diff --git a/tests/colony_test.cpp b/tests/colony_test.cpp index 0d0bc9d698498..02c159ba5ed14 100644 --- a/tests/colony_test.cpp +++ b/tests/colony_test.cpp @@ -27,7 +27,7 @@ static unsigned int xor_rand() TEST_CASE( "colony basics", "[colony]" ) { - colony test_colony; + cata::colony test_colony; // Starts empty CHECK( test_colony.empty() ); @@ -55,7 +55,7 @@ TEST_CASE( "colony basics", "[colony]" ) int count = 0; int sum = 0; - for( colony::iterator it = test_colony.begin(); it < test_colony.end(); ++it ) { + for( cata::colony::iterator it = test_colony.begin(); it < test_colony.end(); ++it ) { ++count; sum += **it; } @@ -65,8 +65,8 @@ TEST_CASE( "colony basics", "[colony]" ) // Iterator access CHECK( sum == 6000 ); - colony::iterator plus_20 = test_colony.begin(); - colony::iterator plus_200 = test_colony.begin(); + cata::colony::iterator plus_20 = test_colony.begin(); + cata::colony::iterator plus_200 = test_colony.begin(); test_colony.advance( plus_20, 20 ); test_colony.advance( plus_200, 200 ); @@ -75,24 +75,24 @@ TEST_CASE( "colony basics", "[colony]" ) // Iterator - distance CHECK( test_colony.distance( plus_200, test_colony.begin() ) == -200 ); - colony::iterator next_iterator = test_colony.next( test_colony.begin(), 5 ); - colony::const_iterator cprev_iterator = test_colony.prev( test_colony.cend(), 300 ); + cata::colony::iterator next_iterator = test_colony.next( test_colony.begin(), 5 ); + cata::colony::const_iterator cprev_iterator = test_colony.prev( test_colony.cend(), 300 ); // Iterator next CHECK( test_colony.distance( test_colony.begin(), next_iterator ) == 5 ); // Const iterator prev CHECK( test_colony.distance( test_colony.cend(), cprev_iterator ) == -300 ); - colony::iterator prev_iterator = test_colony.prev( test_colony.end(), 300 ); + cata::colony::iterator prev_iterator = test_colony.prev( test_colony.end(), 300 ); // Iterator/const iterator equality operator CHECK( cprev_iterator == prev_iterator ); - colony test_colony_2; + cata::colony test_colony_2; test_colony_2 = test_colony; - colony test_colony_3( test_colony ); - colony test_colony_4( test_colony_2, test_colony_2.get_allocator() ); + cata::colony test_colony_3( test_colony ); + cata::colony test_colony_4( test_colony_2, test_colony_2.get_allocator() ); // Copy CHECK( test_colony_2.size() == 400 ); @@ -113,7 +113,8 @@ TEST_CASE( "colony basics", "[colony]" ) count = 0; sum = 0; - for( colony::reverse_iterator it = test_colony.rbegin(); it != test_colony.rend(); ++it ) { + for( cata::colony::reverse_iterator it = test_colony.rbegin(); it != test_colony.rend(); + ++it ) { ++count; sum += **it; } @@ -123,20 +124,20 @@ TEST_CASE( "colony basics", "[colony]" ) // Reverse iterator access CHECK( sum == 6000 ); - colony::reverse_iterator r_iterator = test_colony.rbegin(); + cata::colony::reverse_iterator r_iterator = test_colony.rbegin(); test_colony.advance( r_iterator, 50 ); // Reverse iterator advance and distance test CHECK( test_colony.distance( test_colony.rbegin(), r_iterator ) == 50 ); - colony::reverse_iterator r_iterator2 = test_colony.next( r_iterator, 2 ); + cata::colony::reverse_iterator r_iterator2 = test_colony.next( r_iterator, 2 ); // Reverse iterator next and distance test CHECK( test_colony.distance( test_colony.rbegin(), r_iterator2 ) == 52 ); count = 0; sum = 0; - for( colony::iterator it = test_colony.begin(); it < test_colony.end(); + for( cata::colony::iterator it = test_colony.begin(); it < test_colony.end(); test_colony.advance( it, 2 ) ) { ++count; sum += **it; @@ -149,7 +150,8 @@ TEST_CASE( "colony basics", "[colony]" ) count = 0; sum = 0; - for( colony::const_iterator it = test_colony.cbegin(); it != test_colony.cend(); ++it ) { + for( cata::colony::const_iterator it = test_colony.cbegin(); it != test_colony.cend(); + ++it ) { ++count; sum += **it; } @@ -161,8 +163,8 @@ TEST_CASE( "colony basics", "[colony]" ) count = 0; sum = 0; - for( colony::const_reverse_iterator it = --colony::const_reverse_iterator( - test_colony.crend() ); it != colony::const_reverse_iterator( test_colony.crbegin() ); + for( cata::colony::const_reverse_iterator it = --cata::colony::const_reverse_iterator( + test_colony.crend() ); it != cata::colony::const_reverse_iterator( test_colony.crbegin() ); --it ) { ++count; sum += **it; @@ -174,7 +176,7 @@ TEST_CASE( "colony basics", "[colony]" ) CHECK( sum == 5980 ); count = 0; - for( colony::iterator it = ++colony::iterator( test_colony.begin() ); + for( cata::colony::iterator it = ++cata::colony::iterator( test_colony.begin() ); it < test_colony.end(); ++it ) { ++count; it = test_colony.erase( it ); @@ -192,9 +194,10 @@ TEST_CASE( "colony basics", "[colony]" ) CHECK( test_colony.capacity() == 200 ); count = 0; - for( colony::reverse_iterator it = test_colony.rbegin(); it != test_colony.rend(); ++it ) { + for( cata::colony::reverse_iterator it = test_colony.rbegin(); it != test_colony.rend(); + ++it ) { ++count; - colony::iterator temp = it.base(); + cata::colony::iterator temp = it.base(); it = test_colony.erase( --temp ); } @@ -210,7 +213,7 @@ TEST_CASE( "colony basics", "[colony]" ) } count = 0; - for( colony::iterator it = --colony::iterator( test_colony.end() ); + for( cata::colony::iterator it = --cata::colony::iterator( test_colony.end() ); it != test_colony.begin(); --it ) { ++count; } @@ -219,7 +222,7 @@ TEST_CASE( "colony basics", "[colony]" ) CHECK( count == 399 ); count = 0; - for( colony::iterator it = --( colony::iterator( test_colony.end() ) ); + for( cata::colony::iterator it = --( cata::colony::iterator( test_colony.end() ) ); it != test_colony.begin(); test_colony.advance( it, -2 ) ) { ++count; } @@ -237,8 +240,8 @@ TEST_CASE( "colony basics", "[colony]" ) // Insert to post-moved-colony test CHECK( test_colony.size() == 1 ); - colony test_colony_5( test_colony_2 ); - colony test_colony_6( std::move( test_colony_5 ), test_colony_2.get_allocator() ); + cata::colony test_colony_5( test_colony_2 ); + cata::colony test_colony_6( std::move( test_colony_5 ), test_colony_2.get_allocator() ); // Allocator-extended move construct test CHECK( test_colony_6.size() == 400 ); @@ -266,7 +269,7 @@ TEST_CASE( "colony basics", "[colony]" ) TEST_CASE( "insert and erase", "[colony]" ) { - colony test_colony; + cata::colony test_colony; for( int i = 0; i < 500000; ++i ) { test_colony.insert( i ); @@ -275,15 +278,16 @@ TEST_CASE( "insert and erase", "[colony]" ) // Size after insert CHECK( test_colony.size() == 500000 ); - colony::iterator found = std::find( test_colony.begin(), test_colony.end(), 5000 ); - colony::reverse_iterator found2 = std::find( test_colony.rbegin(), test_colony.rend(), 5000 ); + cata::colony::iterator found = std::find( test_colony.begin(), test_colony.end(), 5000 ); + cata::colony::reverse_iterator found2 = std::find( test_colony.rbegin(), test_colony.rend(), + 5000 ); // std::find reverse_iterator CHECK( *found == 5000 ); // std::find iterator CHECK( *found2 == 5000 ); - for( colony::iterator it = test_colony.begin(); it != test_colony.end(); ++it ) { + for( cata::colony::iterator it = test_colony.begin(); it != test_colony.end(); ++it ) { it = test_colony.erase( it ); } @@ -291,7 +295,7 @@ TEST_CASE( "insert and erase", "[colony]" ) CHECK( test_colony.size() == 250000 ); do { - for( colony::iterator it = test_colony.begin(); it != test_colony.end(); ) { + for( cata::colony::iterator it = test_colony.begin(); it != test_colony.end(); ) { if( ( xor_rand() & 7 ) == 0 ) { it = test_colony.erase( it ); } else { @@ -316,7 +320,7 @@ TEST_CASE( "insert and erase", "[colony]" ) int count = 0; do { - for( colony::iterator it = test_colony.begin(); it != test_colony.end(); ) { + for( cata::colony::iterator it = test_colony.begin(); it != test_colony.end(); ) { if( ( xor_rand() & 7 ) == 0 ) { it = test_colony.erase( it ); ++count; @@ -328,7 +332,7 @@ TEST_CASE( "insert and erase", "[colony]" ) } while( count < 15000 ); // Erase randomly till half-empty - CHECK( test_colony.size() == static_cast( 30000 - count ) ); + CHECK( test_colony.size() == static_cast( 30000 - count ) ); for( int i = 0; i < count; ++i ) { test_colony.insert( 1 ); @@ -338,7 +342,7 @@ TEST_CASE( "insert and erase", "[colony]" ) CHECK( test_colony.size() == 30000 ); count = 0; - for( colony::iterator it = test_colony.begin(); it != test_colony.end(); ) { + for( cata::colony::iterator it = test_colony.begin(); it != test_colony.end(); ) { if( ++count == 3 ) { count = 0; it = test_colony.erase( it ); @@ -352,7 +356,7 @@ TEST_CASE( "insert and erase", "[colony]" ) CHECK( test_colony.size() == 45001 ); do { - for( colony::iterator it = test_colony.begin(); it != test_colony.end(); ) { + for( cata::colony::iterator it = test_colony.begin(); it != test_colony.end(); ) { if( ( xor_rand() & 3 ) == 0 ) { ++it; test_colony.insert( 1 ); @@ -372,7 +376,7 @@ TEST_CASE( "insert and erase", "[colony]" ) // Insert post-erase CHECK( test_colony.size() == 500000 ); - colony::iterator it = test_colony.begin(); + cata::colony::iterator it = test_colony.begin(); test_colony.advance( it, 250000 ); for( ; it != test_colony.end(); ) { @@ -386,10 +390,10 @@ TEST_CASE( "insert and erase", "[colony]" ) test_colony.insert( 10 ); } - colony::iterator end_it = test_colony.end(); + cata::colony::iterator end_it = test_colony.end(); test_colony.advance( end_it, -250000 ); - for( colony::iterator it = test_colony.begin(); it != end_it; ) { + for( cata::colony::iterator it = test_colony.begin(); it != end_it; ) { it = test_colony.erase( it ); } @@ -401,7 +405,7 @@ TEST_CASE( "insert and erase", "[colony]" ) } int sum = 0; - for( colony::iterator it = test_colony.begin(); it != test_colony.end(); ++it ) { + for( cata::colony::iterator it = test_colony.begin(); it != test_colony.end(); ++it ) { sum += *it; } @@ -410,10 +414,10 @@ TEST_CASE( "insert and erase", "[colony]" ) end_it = test_colony.end(); test_colony.advance( end_it, -50001 ); - colony::iterator begin_it = test_colony.begin(); + cata::colony::iterator begin_it = test_colony.begin(); test_colony.advance( begin_it, 300000 ); - for( colony::iterator it = begin_it; it != end_it; ) { + for( cata::colony::iterator it = begin_it; it != end_it; ) { it = test_colony.erase( it ); } @@ -427,7 +431,7 @@ TEST_CASE( "insert and erase", "[colony]" ) begin_it = test_colony.begin(); test_colony.advance( begin_it, 300001 ); - for( colony::iterator it = begin_it; it != test_colony.end(); ) { + for( cata::colony::iterator it = begin_it; it != test_colony.end(); ) { it = test_colony.erase( it ); } @@ -450,7 +454,7 @@ TEST_CASE( "insert and erase", "[colony]" ) // Advance + iterator-to-index test CHECK( index == 500 ); - colony::iterator it2 = test_colony.get_iterator_from_pointer( &( *it ) ); + cata::colony::iterator it2 = test_colony.get_iterator_from_pointer( &( *it ) ); // Pointer-to-iterator test CHECK( it2 != test_colony.end() ); @@ -460,7 +464,7 @@ TEST_CASE( "insert and erase", "[colony]" ) // Index-to-iterator test CHECK( it2 == it ); - for( colony::iterator it = test_colony.begin(); it != test_colony.end(); ) { + for( cata::colony::iterator it = test_colony.begin(); it != test_colony.end(); ) { it = test_colony.erase( it ); } @@ -485,7 +489,7 @@ TEST_CASE( "insert and erase", "[colony]" ) } } int count2 = 0; - for( colony::iterator it = test_colony.begin(); it != test_colony.end(); ) { + for( cata::colony::iterator it = test_colony.begin(); it != test_colony.end(); ) { if( ( xor_rand() & 7 ) == 0 ) { it = test_colony.erase( it ); --count; @@ -497,20 +501,20 @@ TEST_CASE( "insert and erase", "[colony]" ) } // Multiple sequential small insert/erase commands - CHECK( test_colony.size() == static_cast( count ) ); + CHECK( test_colony.size() == static_cast( count ) ); } TEST_CASE( "range erase", "[colony]" ) { - colony test_colony; + cata::colony test_colony; int count = 0; for( ; count != 1000; ++count ) { test_colony.insert( count ); } - colony::iterator it1 = test_colony.begin(); - colony::iterator it2 = test_colony.begin(); + cata::colony::iterator it1 = test_colony.begin(); + cata::colony::iterator it2 = test_colony.begin(); test_colony.advance( it1, 500 ); test_colony.advance( it2, 800 ); @@ -518,7 +522,7 @@ TEST_CASE( "range erase", "[colony]" ) test_colony.erase( it1, it2 ); count = 0; - for( colony::iterator it = test_colony.begin(); it != test_colony.end(); ++it ) { + for( cata::colony::iterator it = test_colony.begin(); it != test_colony.end(); ++it ) { ++count; } @@ -535,7 +539,7 @@ TEST_CASE( "range erase", "[colony]" ) test_colony.erase( it1, it2 ); count = 0; - for( colony::iterator it = test_colony.begin(); it != test_colony.end(); ++it ) { + for( cata::colony::iterator it = test_colony.begin(); it != test_colony.end(); ++it ) { ++count; } @@ -551,7 +555,7 @@ TEST_CASE( "range erase", "[colony]" ) test_colony.erase( it1, it2 ); count = 0; - for( colony::iterator it = test_colony.begin(); it != test_colony.end(); ++it ) { + for( cata::colony::iterator it = test_colony.begin(); it != test_colony.end(); ++it ) { ++count; } @@ -567,7 +571,7 @@ TEST_CASE( "range erase", "[colony]" ) test_colony.erase( it1, it2 ); count = 0; - for( colony::iterator it = test_colony.begin(); it != test_colony.end(); ++it ) { + for( cata::colony::iterator it = test_colony.begin(); it != test_colony.end(); ++it ) { ++count; } @@ -583,7 +587,7 @@ TEST_CASE( "range erase", "[colony]" ) test_colony.erase( it1, it2 ); count = 0; - for( colony::iterator it = test_colony.begin(); it != test_colony.end(); ++it ) { + for( cata::colony::iterator it = test_colony.begin(); it != test_colony.end(); ++it ) { ++count; } @@ -597,7 +601,7 @@ TEST_CASE( "range erase", "[colony]" ) test_colony.insert( count ); } - for( colony::iterator it = test_colony.begin(); it < test_colony.end(); ++it ) { + for( cata::colony::iterator it = test_colony.begin(); it < test_colony.end(); ++it ) { it = test_colony.erase( it ); } @@ -609,7 +613,7 @@ TEST_CASE( "range erase", "[colony]" ) test_colony.erase( it1, it2 ); count = 0; - for( colony::iterator it = test_colony.begin(); it != test_colony.end(); ++it ) { + for( cata::colony::iterator it = test_colony.begin(); it != test_colony.end(); ++it ) { ++count; } @@ -623,7 +627,7 @@ TEST_CASE( "range erase", "[colony]" ) test_colony.insert( count ); } - for( colony::iterator it = test_colony.begin(); it < test_colony.end(); ++it ) { + for( cata::colony::iterator it = test_colony.begin(); it < test_colony.end(); ++it ) { if( ( xor_rand() & 1 ) == 0 ) { it = test_colony.erase( it ); } @@ -643,7 +647,7 @@ TEST_CASE( "range erase", "[colony]" ) count = 0; - for( colony::iterator it = test_colony.begin(); it != test_colony.end(); ++it ) { + for( cata::colony::iterator it = test_colony.begin(); it != test_colony.end(); ++it ) { ++count; } @@ -674,7 +678,7 @@ TEST_CASE( "range erase", "[colony]" ) test_colony.erase( it1, it2 ); count = 0; - for( colony::iterator it = test_colony.begin(); it != test_colony.end(); ++it ) { + for( cata::colony::iterator it = test_colony.begin(); it != test_colony.end(); ++it ) { ++count; } @@ -714,7 +718,7 @@ TEST_CASE( "range erase", "[colony]" ) test_colony.erase( it1, it2 ); count = 0; - for( colony::iterator it = test_colony.begin(); it != test_colony.end(); ++it ) { + for( cata::colony::iterator it = test_colony.begin(); it != test_colony.end(); ++it ) { ++count; } @@ -732,7 +736,7 @@ TEST_CASE( "range erase", "[colony]" ) CHECK( test_colony.size() == static_cast( count ) + extra_size ); count = 0; - for( colony::iterator it = test_colony.begin(); it != test_colony.end(); ++it ) { + for( cata::colony::iterator it = test_colony.begin(); it != test_colony.end(); ++it ) { ++count; } @@ -761,7 +765,7 @@ TEST_CASE( "range erase", "[colony]" ) TEST_CASE( "sort", "[colony]" ) { - colony test_colony; + cata::colony test_colony; test_colony.reserve( 50000 ); @@ -774,7 +778,7 @@ TEST_CASE( "sort", "[colony]" ) bool sorted = true; int prev = 0; - for( colony::iterator cur = test_colony.begin(); cur != test_colony.end(); ++cur ) { + for( cata::colony::iterator cur = test_colony.begin(); cur != test_colony.end(); ++cur ) { if( prev > *cur ) { sorted = false; break; @@ -789,7 +793,7 @@ TEST_CASE( "sort", "[colony]" ) prev = 65536; - for( colony::iterator cur = test_colony.begin(); cur != test_colony.end(); ++cur ) { + for( cata::colony::iterator cur = test_colony.begin(); cur != test_colony.end(); ++cur ) { if( prev < *cur ) { sorted = false; break; @@ -803,17 +807,17 @@ TEST_CASE( "sort", "[colony]" ) TEST_CASE( "insertion methods", "[colony]" ) { - colony test_colony = {1, 2, 3}; + cata::colony test_colony = {1, 2, 3}; // Initializer-list constructor CHECK( test_colony.size() == 3 ); - colony test_colony_2( test_colony.begin(), test_colony.end() ); + cata::colony test_colony_2( test_colony.begin(), test_colony.end() ); // Range constructor CHECK( test_colony_2.size() == 3 ); - colony test_colony_3( 5000, 2, 100, 1000 ); + cata::colony test_colony_3( 5000, 2, 100, 1000 ); // Fill construction CHECK( test_colony_3.size() == 5000 ); @@ -837,7 +841,7 @@ TEST_CASE( "insertion methods", "[colony]" ) int sum = 0; - for( colony::iterator it = test_colony_2.begin(); it != test_colony_2.end(); ++it ) { + for( cata::colony::iterator it = test_colony_2.begin(); it != test_colony_2.end(); ++it ) { sum += *it; } @@ -851,7 +855,7 @@ TEST_CASE( "insertion methods", "[colony]" ) sum = 0; - for( colony::iterator it = test_colony_2.begin(); it != test_colony_2.end(); ++it ) { + for( cata::colony::iterator it = test_colony_2.begin(); it != test_colony_2.end(); ++it ) { sum += *it; } @@ -863,7 +867,7 @@ TEST_CASE( "insertion methods", "[colony]" ) sum = 0; - for( colony::iterator it = test_colony_2.begin(); it != test_colony_2.end(); ++it ) { + for( cata::colony::iterator it = test_colony_2.begin(); it != test_colony_2.end(); ++it ) { sum += *it; } @@ -875,7 +879,7 @@ TEST_CASE( "insertion methods", "[colony]" ) test_colony_2.insert( 6000, 1 ); sum = 0; - for( colony::iterator it = test_colony_2.begin(); it != test_colony_2.end(); ++it ) { + for( cata::colony::iterator it = test_colony_2.begin(); it != test_colony_2.end(); ++it ) { sum += *it; } @@ -898,7 +902,7 @@ struct perfect_forwarding_test { TEST_CASE( "perfect forwarding", "[colony]" ) { - colony test_colony; + cata::colony test_colony; int lvalue = 0; int &lvalueref = lvalue; @@ -923,7 +927,7 @@ struct small_struct { TEST_CASE( "emplace", "[colony]" ) { - colony test_colony; + cata::colony test_colony; int sum1 = 0, sum2 = 0; for( int i = 0; i < 100; ++i ) { @@ -931,7 +935,8 @@ TEST_CASE( "emplace", "[colony]" ) sum1 += i; } - for( colony::iterator it = test_colony.begin(); it != test_colony.end(); ++it ) { + for( cata::colony::iterator it = test_colony.begin(); it != test_colony.end(); + ++it ) { sum2 += it->number; } @@ -943,7 +948,7 @@ TEST_CASE( "emplace", "[colony]" ) TEST_CASE( "group size and capacity", "[colony]" ) { - colony test_colony; + cata::colony test_colony; test_colony.change_group_sizes( 50, 100 ); test_colony.insert( 27 ); @@ -986,7 +991,7 @@ TEST_CASE( "group size and capacity", "[colony]" ) TEST_CASE( "splice", "[colony]" ) { - colony test_colony_1, test_colony_2; + cata::colony test_colony_1, test_colony_2; SECTION( "small splice 1" ) { int i = 0; @@ -998,7 +1003,7 @@ TEST_CASE( "splice", "[colony]" ) test_colony_1.splice( test_colony_2 ); i = 0; - for( colony::iterator it = test_colony_1.begin(); it < test_colony_1.end(); ++it ) { + for( cata::colony::iterator it = test_colony_1.begin(); it < test_colony_1.end(); ++it ) { CHECK( i++ == *it ); } } @@ -1013,7 +1018,7 @@ TEST_CASE( "splice", "[colony]" ) test_colony_1.splice( test_colony_2 ); i = 0; - for( colony::iterator it = test_colony_1.begin(); it != test_colony_1.end(); ++it ) { + for( cata::colony::iterator it = test_colony_1.begin(); it != test_colony_1.end(); ++it ) { CHECK( i++ == *it ); } } @@ -1028,7 +1033,7 @@ TEST_CASE( "splice", "[colony]" ) test_colony_1.splice( test_colony_2 ); i = 0; - for( colony::iterator it = test_colony_1.begin(); it != test_colony_1.end(); ++it ) { + for( cata::colony::iterator it = test_colony_1.begin(); it != test_colony_1.end(); ++it ) { CHECK( i++ == *it ); } } @@ -1039,7 +1044,7 @@ TEST_CASE( "splice", "[colony]" ) test_colony_2.insert( i + 100 ); } - for( colony::iterator it = test_colony_2.begin(); it != test_colony_2.end(); ) { + for( cata::colony::iterator it = test_colony_2.begin(); it != test_colony_2.end(); ) { if( ( xor_rand() & 7 ) == 0 ) { it = test_colony_2.erase( it ); } else { @@ -1050,7 +1055,7 @@ TEST_CASE( "splice", "[colony]" ) test_colony_1.splice( test_colony_2 ); int prev = -1; - for( colony::iterator it = test_colony_1.begin(); it != test_colony_1.end(); ++it ) { + for( cata::colony::iterator it = test_colony_1.begin(); it != test_colony_1.end(); ++it ) { CHECK( prev < *it ); prev = *it; } @@ -1062,7 +1067,7 @@ TEST_CASE( "splice", "[colony]" ) test_colony_2.insert( i + 100 ); } - for( colony::iterator it = test_colony_2.begin(); it != test_colony_2.end(); ) { + for( cata::colony::iterator it = test_colony_2.begin(); it != test_colony_2.end(); ) { if( ( xor_rand() & 3 ) == 0 ) { it = test_colony_2.erase( it ); } else { @@ -1070,7 +1075,7 @@ TEST_CASE( "splice", "[colony]" ) } } - for( colony::iterator it = test_colony_1.begin(); it != test_colony_1.end(); ) { + for( cata::colony::iterator it = test_colony_1.begin(); it != test_colony_1.end(); ) { if( ( xor_rand() & 1 ) == 0 ) { it = test_colony_1.erase( it ); } else { @@ -1081,7 +1086,7 @@ TEST_CASE( "splice", "[colony]" ) test_colony_1.splice( test_colony_2 ); int prev = -1; - for( colony::iterator it = test_colony_1.begin(); it != test_colony_1.end(); ++it ) { + for( cata::colony::iterator it = test_colony_1.begin(); it != test_colony_1.end(); ++it ) { CHECK( prev < *it ); prev = *it; } @@ -1102,7 +1107,7 @@ TEST_CASE( "splice", "[colony]" ) test_colony_1.splice( test_colony_2 ); int prev = -1; - for( colony::iterator it = test_colony_1.begin(); it != test_colony_1.end(); ++it ) { + for( cata::colony::iterator it = test_colony_1.begin(); it != test_colony_1.end(); ++it ) { CHECK( prev < *it ); prev = *it; } @@ -1123,7 +1128,7 @@ TEST_CASE( "splice", "[colony]" ) test_colony_1.splice( test_colony_2 ); int prev = 255; - for( colony::iterator it = test_colony_1.begin(); it != test_colony_1.end(); ++it ) { + for( cata::colony::iterator it = test_colony_1.begin(); it != test_colony_1.end(); ++it ) { CHECK( prev >= *it ); prev = *it; } @@ -1138,7 +1143,7 @@ TEST_CASE( "splice", "[colony]" ) test_colony_2.insert( i ); } - for( colony::iterator it = test_colony_2.begin(); it != test_colony_2.end(); ) { + for( cata::colony::iterator it = test_colony_2.begin(); it != test_colony_2.end(); ) { if( ( xor_rand() & 1 ) == 0 ) { it = test_colony_2.erase( it ); } else { @@ -1146,7 +1151,7 @@ TEST_CASE( "splice", "[colony]" ) } } - for( colony::iterator it = test_colony_1.begin(); it != test_colony_1.end(); ) { + for( cata::colony::iterator it = test_colony_1.begin(); it != test_colony_1.end(); ) { if( ( xor_rand() & 1 ) == 0 ) { it = test_colony_1.erase( it ); } else { @@ -1161,13 +1166,13 @@ TEST_CASE( "splice", "[colony]" ) test_colony_1.splice( test_colony_2 ); int prev = -1; - for( colony::iterator it = test_colony_1.begin(); it != test_colony_1.end(); ++it ) { + for( cata::colony::iterator it = test_colony_1.begin(); it != test_colony_1.end(); ++it ) { CHECK( prev < *it ); prev = *it; } do { - for( colony::iterator it = test_colony_1.begin(); it != test_colony_1.end(); ) { + for( cata::colony::iterator it = test_colony_1.begin(); it != test_colony_1.end(); ) { if( ( xor_rand() & 3 ) == 0 ) { it = test_colony_1.erase( it ); } else if( ( xor_rand() & 7 ) == 0 ) { diff --git a/tests/invlet_test.cpp b/tests/invlet_test.cpp index 479fc0f1b197c..52ab096f6ea52 100644 --- a/tests/invlet_test.cpp +++ b/tests/invlet_test.cpp @@ -46,6 +46,35 @@ enum test_action { TEST_ACTION_NUM, }; +// This is a massive hack that makes this test work without totally rewriting it after #31406 +// The number of null items in item.components is used as a unique id for the purposes of this test +// +// The reason components is used instead of some other property of items is that this isn't checked +// when determining if two items stack and therefore has no side effects. +static void set_id( item &it, int id ) +{ + it.components = std::list( static_cast( id ), item() ); +} + +static int get_id( const item &it ) +{ + return static_cast( it.components.size() ); +} + +template +static item *retrieve_item( const T &sel, int id ) +{ + item *obj = nullptr; + sel.visit_items( [&id, &obj]( const item * e ) { + if( get_id( *e ) == id ) { + obj = const_cast( e ); + return VisitResponse::ABORT; + } + return VisitResponse::NEXT; + } ); + return obj; +} + static std::string location_desc( const inventory_location loc ) { switch( loc ) { @@ -206,43 +235,63 @@ static invlet_state check_invlet( player &p, item &it, const char invlet ) return UNEXPECTED; } -static void drop_at_feet( player &p, const int pos ) +static void drop_at_feet( player &p, const int id ) { - auto size_before = g->m.i_at( p.pos() ).size(); + size_t size_before = g->m.i_at( p.pos() ).size(); + + item *found = retrieve_item( p, id ); + REQUIRE( found ); + int pos = p.get_item_position( found ); p.moves = 100; p.drop( pos, p.pos() ); p.activity.do_turn( p ); + REQUIRE( g->m.i_at( p.pos() ).size() == size_before + 1 ); } -static void pick_up_from_feet( player &p, int pos ) +static void pick_up_from_feet( player &p, int id ) { - auto size_before = g->m.i_at( p.pos() ).size(); - REQUIRE( size_before > pos ); + map_stack items = g->m.i_at( p.pos() ); + size_t size_before = items.size(); + + item *found = retrieve_item( map_cursor( p.pos() ), id ); + REQUIRE( found ); + p.moves = 100; p.assign_activity( activity_id( "ACT_PICKUP" ) ); - p.activity.placement = tripoint( 0, 0, 0 ); - p.activity.values.push_back( false ); // not from vehicle - p.activity.values.push_back( pos ); // index of item to pick up + p.activity.targets.emplace_back( map_cursor( p.pos() ), found ); p.activity.values.push_back( 0 ); p.activity.do_turn( p ); - REQUIRE( g->m.i_at( p.pos() ).size() == size_before - 1 ); + + REQUIRE( items.size() == size_before - 1 ); } -static void wear_from_feet( player &p, int pos ) +static void wear_from_feet( player &p, int id ) { - auto size_before = g->m.i_at( p.pos() ).size(); - REQUIRE( size_before > pos ); - p.wear_item( g->m.i_at( p.pos() )[pos], false ); - g->m.i_rem( p.pos(), pos ); + map_stack items = g->m.i_at( p.pos() ); + size_t size_before = items.size(); + + item *found = retrieve_item( map_cursor( p.pos() ), id ); + REQUIRE( found ); + + p.wear_item( *found, false ); + g->m.i_rem( p.pos(), found ); + + REQUIRE( items.size() == size_before - 1 ); } -static void wield_from_feet( player &p, int pos ) +static void wield_from_feet( player &p, int id ) { - auto size_before = g->m.i_at( p.pos() ).size(); - REQUIRE( size_before > pos ); - p.wield( g->m.i_at( p.pos() )[pos] ); - g->m.i_rem( p.pos(), pos ); + map_stack items = g->m.i_at( p.pos() ); + size_t size_before = items.size(); + + item *found = retrieve_item( map_cursor( p.pos() ), id ); + REQUIRE( found ); + + p.wield( *found ); + g->m.i_rem( p.pos(), found ); + + REQUIRE( items.size() == size_before - 1 ); } static void add_item( player &p, item &it, const inventory_location loc ) @@ -258,7 +307,7 @@ static void add_item( player &p, item &it, const inventory_location loc ) p.wear_item( it ); break; case WIELDED_OR_WORN: - if( p.weapon.is_null() ) { + if( !p.is_armed() ) { p.wield( it ); } else { // since we can only wield one item, wear the item instead @@ -271,17 +320,21 @@ static void add_item( player &p, item &it, const inventory_location loc ) } } -static item &item_at( player &p, const int pos, const inventory_location loc ) +static item &item_at( player &p, const int id, const inventory_location loc ) { switch( loc ) { - case GROUND: - return g->m.i_at( p.pos() )[pos]; + case GROUND: { + item *found = retrieve_item( map_cursor( p.pos() ), id ); + REQUIRE( found ); + return *found; + } case INVENTORY: - return p.i_at( pos ); case WORN: - return p.i_at( -2 - pos ); - case WIELDED_OR_WORN: - return p.i_at( -1 - pos ); + case WIELDED_OR_WORN: { + item *found = retrieve_item( p, id ); + REQUIRE( found ); + return *found; + } default: FAIL( "unimplemented" ); break; @@ -289,7 +342,7 @@ static item &item_at( player &p, const int pos, const inventory_location loc ) return null_item_reference(); } -static void move_item( player &p, const int pos, const inventory_location from, +static void move_item( player &p, const int id, const inventory_location from, const inventory_location to ) { switch( from ) { @@ -300,17 +353,17 @@ static void move_item( player &p, const int pos, const inventory_location from, FAIL( "unimplemented" ); break; case INVENTORY: - pick_up_from_feet( p, pos ); + pick_up_from_feet( p, id ); break; case WORN: - wear_from_feet( p, pos ); + wear_from_feet( p, id ); break; case WIELDED_OR_WORN: if( p.weapon.is_null() ) { - wield_from_feet( p, pos ); + wield_from_feet( p, id ); } else { // since we can only wield one item, wear the item instead - wear_from_feet( p, pos ); + wear_from_feet( p, id ); } break; } @@ -318,21 +371,21 @@ static void move_item( player &p, const int pos, const inventory_location from, case INVENTORY: switch( to ) { case GROUND: - drop_at_feet( p, pos ); + drop_at_feet( p, id ); break; case INVENTORY: default: FAIL( "unimplemented" ); break; case WORN: - p.wear( pos, false ); + p.wear( item_at( p, id, from ), false ); break; case WIELDED_OR_WORN: if( p.weapon.is_null() ) { - p.wield( p.i_at( pos ) ); + p.wield( item_at( p, id, from ) ); } else { // since we can only wield one item, wear the item instead - p.wear( pos, false ); + p.wear( item_at( p, id, from ), false ); } break; } @@ -340,10 +393,10 @@ static void move_item( player &p, const int pos, const inventory_location from, case WORN: switch( to ) { case GROUND: - drop_at_feet( p, -2 - pos ); + drop_at_feet( p, id ); break; case INVENTORY: - p.takeoff( -2 - pos ); + p.takeoff( item_at( p, id, from ) ); break; case WORN: case WIELDED_OR_WORN: @@ -355,21 +408,21 @@ static void move_item( player &p, const int pos, const inventory_location from, case WIELDED_OR_WORN: switch( to ) { case GROUND: - drop_at_feet( p, -1 - pos ); - if( pos == 0 && !p.worn.empty() ) { + drop_at_feet( p, id ); + if( !p.is_armed() && !p.worn.empty() ) { // wield the first worn item - p.wield( p.i_at( -2 ) ); + p.wield( p.worn.front() ); } break; case INVENTORY: - if( pos == 0 ) { - p.i_add( p.i_rem( -1 ) ); + if( p.is_wielding( item_at( p, id, from ) ) ) { + p.i_add( p.i_rem( &item_at( p, id, from ) ) ); } else { - p.takeoff( -1 - pos ); + p.takeoff( item_at( p, id, from ) ); } - if( pos == 0 && !p.worn.empty() ) { + if( !p.is_armed() && !p.worn.empty() ) { // wield the first worn item - p.wield( p.i_at( -2 ) ); + p.wield( p.worn.front() ); } break; case WORN: @@ -414,40 +467,43 @@ static void invlet_test( player &dummy, const inventory_location from, const inv item tshirt( "tshirt" ); item jeans( "jeans" ); + set_id( tshirt, 1 ); + set_id( jeans, 2 ); + // add the items to the starting position add_item( dummy, tshirt, to ); add_item( dummy, jeans, to ); // assign invlet to the first item - assign_invlet( dummy, item_at( dummy, 0, to ), invlet, first_invlet_state ); + assign_invlet( dummy, item_at( dummy, 1, to ), invlet, first_invlet_state ); // remove the first item - move_item( dummy, 0, to, from ); + move_item( dummy, 1, to, from ); // assign invlet to the second item - assign_invlet( dummy, item_at( dummy, 0, to ), invlet, second_invlet_state ); + assign_invlet( dummy, item_at( dummy, 2, to ), invlet, second_invlet_state ); item *final_first = nullptr; item *final_second = nullptr; switch( action ) { case REMOVE_1ST_REMOVE_2ND_ADD_1ST_ADD_2ND: - move_item( dummy, 0, to, from ); - move_item( dummy, 0, from, to ); - move_item( dummy, 0, from, to ); - final_first = &item_at( dummy, 0, to ); - final_second = &item_at( dummy, 1, to ); + move_item( dummy, 2, to, from ); + move_item( dummy, 1, from, to ); + move_item( dummy, 2, from, to ); + final_first = &item_at( dummy, 1, to ); + final_second = &item_at( dummy, 2, to ); break; case REMOVE_1ST_REMOVE_2ND_ADD_2ND_ADD_1ST: - move_item( dummy, 0, to, from ); + move_item( dummy, 2, to, from ); + move_item( dummy, 2, from, to ); move_item( dummy, 1, from, to ); - move_item( dummy, 0, from, to ); final_first = &item_at( dummy, 1, to ); - final_second = &item_at( dummy, 0, to ); + final_second = &item_at( dummy, 2, to ); break; case REMOVE_1ST_ADD_1ST: - move_item( dummy, 0, from, to ); + move_item( dummy, 1, from, to ); final_first = &item_at( dummy, 1, to ); - final_second = &item_at( dummy, 0, to ); + final_second = &item_at( dummy, 2, to ); break; default: FAIL( "unimplemented" ); @@ -489,17 +545,21 @@ static void stack_invlet_test( player &dummy, inventory_location from, inventory g->m.i_clear( dummy.pos() ); // some stackable item that can be wielded and worn - item tshirt( "tshirt" ); + item tshirt1( "tshirt" ); + item tshirt2( "tshirt" ); + + set_id( tshirt1, 1 ); + set_id( tshirt2, 2 ); // add two such items to the starting position - add_item( dummy, tshirt, from ); - add_item( dummy, tshirt, from ); + add_item( dummy, tshirt1, from ); + add_item( dummy, tshirt2, from ); // assign the stack with invlet - assign_invlet( dummy, item_at( dummy, 0, from ), invlet, CACHED ); + assign_invlet( dummy, item_at( dummy, 1, from ), invlet, CACHED ); - // wield or wear one of the items - move_item( dummy, 0, from, to ); + // wield or wear the first item + move_item( dummy, 1, from, to ); std::stringstream ss; ss << "1. add a stack of two same items to " << location_desc( from ) << std::endl; @@ -507,17 +567,17 @@ static void stack_invlet_test( player &dummy, inventory_location from, inventory ss << "3. " << move_action_desc( 0, from, to ) << std::endl; ss << "expect the two items to have different invlets" << std::endl; ss << "actually the two items have " << - ( item_at( dummy, 0, to ).invlet != item_at( dummy, 0, from ).invlet ? "different" : "the same" ) << + ( item_at( dummy, 1, to ).invlet != item_at( dummy, 2, from ).invlet ? "different" : "the same" ) << " invlets" << std::endl; INFO( ss.str() ); - REQUIRE( item_at( dummy, 0, from ).typeId() == tshirt.typeId() ); - REQUIRE( item_at( dummy, 0, to ).typeId() == tshirt.typeId() ); + REQUIRE( item_at( dummy, 1, to ).typeId() == tshirt1.typeId() ); + REQUIRE( item_at( dummy, 2, from ).typeId() == tshirt2.typeId() ); // the wielded/worn item should have different invlet from the remaining item - CHECK( item_at( dummy, 0, to ).invlet != item_at( dummy, 0, from ).invlet ); + CHECK( item_at( dummy, 1, to ).invlet != item_at( dummy, 2, from ).invlet ); // clear invlets - assign_invlet( dummy, item_at( dummy, 0, from ), invlet, NONE ); - assign_invlet( dummy, item_at( dummy, 0, to ), invlet, NONE ); + assign_invlet( dummy, item_at( dummy, 1, to ), invlet, NONE ); + assign_invlet( dummy, item_at( dummy, 2, from ), invlet, NONE ); } static void swap_invlet_test( player &dummy, inventory_location loc ) @@ -540,25 +600,28 @@ static void swap_invlet_test( player &dummy, inventory_location loc ) item tshirt2( "tshirt" ); tshirt2.mod_damage( -1 ); + set_id( tshirt1, 1 ); + set_id( tshirt2, 2 ); + // add the items add_item( dummy, tshirt1, loc ); add_item( dummy, tshirt2, loc ); // assign the items with invlets - assign_invlet( dummy, item_at( dummy, 0, loc ), invlet_1, CACHED ); - assign_invlet( dummy, item_at( dummy, 1, loc ), invlet_2, CACHED ); + assign_invlet( dummy, item_at( dummy, 1, loc ), invlet_1, CACHED ); + assign_invlet( dummy, item_at( dummy, 2, loc ), invlet_2, CACHED ); // swap the invlets (invoking twice to make the invlet non-player-assigned) - dummy.reassign_item( item_at( dummy, 0, loc ), invlet_2 ); - dummy.reassign_item( item_at( dummy, 0, loc ), invlet_2 ); + dummy.reassign_item( item_at( dummy, 1, loc ), invlet_2 ); + dummy.reassign_item( item_at( dummy, 1, loc ), invlet_2 ); // drop the items - move_item( dummy, 0, loc, GROUND ); - move_item( dummy, 0, loc, GROUND ); + move_item( dummy, 1, loc, GROUND ); + move_item( dummy, 2, loc, GROUND ); // get them again - move_item( dummy, 0, GROUND, loc ); - move_item( dummy, 0, GROUND, loc ); + move_item( dummy, 1, GROUND, loc ); + move_item( dummy, 2, GROUND, loc ); std::stringstream ss; ss << "1. add two items of the same type to " << location_desc( loc ) << @@ -569,23 +632,23 @@ static void swap_invlet_test( player &dummy, inventory_location loc ) ss << "4. move the items to " << location_desc( GROUND ) << std::endl; ss << "5. move the items to " << location_desc( loc ) << " again" << std::endl; ss << "expect the items to keep their swapped invlets" << std::endl; - if( item_at( dummy, 0, loc ).invlet == invlet_2 && item_at( dummy, 1, loc ).invlet == invlet_1 ) { + if( item_at( dummy, 1, loc ).invlet == invlet_2 && item_at( dummy, 2, loc ).invlet == invlet_1 ) { ss << "the items actually keep their swapped invlets" << std::endl; } else { ss << "the items actually does not keep their swapped invlets" << std::endl; } INFO( ss.str() ); - REQUIRE( item_at( dummy, 0, loc ).typeId() == tshirt1.typeId() ); - REQUIRE( item_at( dummy, 1, loc ).typeId() == tshirt2.typeId() ); + REQUIRE( item_at( dummy, 1, loc ).typeId() == tshirt1.typeId() ); + REQUIRE( item_at( dummy, 2, loc ).typeId() == tshirt2.typeId() ); // invlets should not disappear and should still be swapped - CHECK( item_at( dummy, 0, loc ).invlet == invlet_2 ); - CHECK( item_at( dummy, 1, loc ).invlet == invlet_1 ); - CHECK( check_invlet( dummy, item_at( dummy, 0, loc ), invlet_2 ) == CACHED ); - CHECK( check_invlet( dummy, item_at( dummy, 1, loc ), invlet_1 ) == CACHED ); + CHECK( item_at( dummy, 1, loc ).invlet == invlet_2 ); + CHECK( item_at( dummy, 2, loc ).invlet == invlet_1 ); + CHECK( check_invlet( dummy, item_at( dummy, 1, loc ), invlet_2 ) == CACHED ); + CHECK( check_invlet( dummy, item_at( dummy, 2, loc ), invlet_1 ) == CACHED ); // clear invlets - assign_invlet( dummy, item_at( dummy, 0, loc ), invlet_2, NONE ); - assign_invlet( dummy, item_at( dummy, 1, loc ), invlet_1, NONE ); + assign_invlet( dummy, item_at( dummy, 1, loc ), invlet_2, NONE ); + assign_invlet( dummy, item_at( dummy, 2, loc ), invlet_1, NONE ); } static void merge_invlet_test( player &dummy, inventory_location from ) @@ -617,20 +680,24 @@ static void merge_invlet_test( player &dummy, inventory_location from ) g->m.i_clear( dummy.pos() ); // some stackable item - item tshirt( "tshirt" ); + item tshirt1( "tshirt" ); + item tshirt2( "tshirt" ); + + set_id( tshirt1, 1 ); + set_id( tshirt2, 2 ); // add the item - add_item( dummy, tshirt, INVENTORY ); - add_item( dummy, tshirt, from ); + add_item( dummy, tshirt1, INVENTORY ); + add_item( dummy, tshirt2, from ); // assign the items with invlets - assign_invlet( dummy, item_at( dummy, 0, INVENTORY ), invlet_1, first_invlet_state ); - assign_invlet( dummy, item_at( dummy, 0, from ), invlet_2, second_invlet_state ); + assign_invlet( dummy, item_at( dummy, 1, INVENTORY ), invlet_1, first_invlet_state ); + assign_invlet( dummy, item_at( dummy, 2, from ), invlet_2, second_invlet_state ); // merge the second item into inventory - move_item( dummy, 0, from, INVENTORY ); + move_item( dummy, 2, from, INVENTORY ); - item &merged_item = item_at( dummy, 0, INVENTORY ); + item &merged_item = item_at( dummy, 1, INVENTORY ); invlet_state merged_invlet_state = check_invlet( dummy, merged_item, expected_merged_invlet ); char merged_invlet = merged_item.invlet; @@ -646,7 +713,7 @@ static void merge_invlet_test( player &dummy, inventory_location from ) ss << "the stack actually has " << invlet_state_desc( merged_invlet_state ) << " invlet " << merged_invlet << std::endl; INFO( ss.str() ); - REQUIRE( merged_item.typeId() == tshirt.typeId() ); + REQUIRE( merged_item.typeId() == tshirt1.typeId() ); CHECK( merged_invlet_state == expected_merged_invlet_state ); CHECK( merged_invlet == expected_merged_invlet ); } @@ -654,25 +721,25 @@ static void merge_invlet_test( player &dummy, inventory_location from ) #define invlet_test_autoletter_off( name, dummy, from, to ) \ SECTION( std::string( name ) + " (auto letter off)" ) { \ - get_options().get_option( "AUTO_INV_ASSIGN" ).setValue( "false" ); \ + get_options().get_option( "AUTO_INV_ASSIGN" ).setValue( "disabled" ); \ invlet_test( dummy, from, to ); \ } #define stack_invlet_test_autoletter_off( name, dummy, from, to ) \ SECTION( std::string( name ) + " (auto letter off)" ) { \ - get_options().get_option( "AUTO_INV_ASSIGN" ).setValue( "false" ); \ + get_options().get_option( "AUTO_INV_ASSIGN" ).setValue( "disabled" ); \ stack_invlet_test( dummy, from, to ); \ } #define swap_invlet_test_autoletter_off( name, dummy, loc ) \ SECTION( std::string( name ) + " (auto letter off)" ) { \ - get_options().get_option( "AUTO_INV_ASSIGN" ).setValue( "false" ); \ + get_options().get_option( "AUTO_INV_ASSIGN" ).setValue( "disabled" ); \ swap_invlet_test( dummy, loc ); \ } #define merge_invlet_test_autoletter_off( name, dummy, from ) \ SECTION( std::string( name ) + " (auto letter off)" ) { \ - get_options().get_option( "AUTO_INV_ASSIGN" ).setValue( "false" ); \ + get_options().get_option( "AUTO_INV_ASSIGN" ).setValue( "disabled" ); \ merge_invlet_test( dummy, from ); \ } diff --git a/tests/item_test.cpp b/tests/item_test.cpp index 1f156353dcff2..8d27eba4a5fb2 100644 --- a/tests/item_test.cpp +++ b/tests/item_test.cpp @@ -49,6 +49,16 @@ TEST_CASE( "gun_layer", "[item]" ) CHECK( gun.get_layer() == BELTED_LAYER ); } +TEST_CASE( "stacking_cash_cards", "[item]" ) +{ + // Differently-charged cash cards should stack if neither is zero. + item cash0( "cash_card", calendar::time_of_cataclysm, 0 ); + item cash1( "cash_card", calendar::time_of_cataclysm, 1 ); + item cash2( "cash_card", calendar::time_of_cataclysm, 2 ); + CHECK( !cash0.stacks_with( cash1 ) ); + CHECK( cash1.stacks_with( cash2 ) ); +} + // second minute hour day week season year TEST_CASE( "stacking_over_time", "[item]" ) diff --git a/tests/line_test.cpp b/tests/line_test.cpp index ab3fbc4bb3b4c..754d6b0fe49c8 100644 --- a/tests/line_test.cpp +++ b/tests/line_test.cpp @@ -1,3 +1,4 @@ +#include #include #include #include @@ -316,14 +317,14 @@ static void line_to_comparison( const int iterations ) const int y2 = rng( -COORDINATE_RANGE, COORDINATE_RANGE ); const int t1 = 0; const int t2 = 0; - long count1 = 0; + int count1 = 0; const auto start1 = std::chrono::high_resolution_clock::now(); while( count1 < iterations ) { line_to( x1, y1, x2, y2, t1 ); count1++; } const auto end1 = std::chrono::high_resolution_clock::now(); - long count2 = 0; + int count2 = 0; const auto start2 = std::chrono::high_resolution_clock::now(); while( count2 < iterations ) { canonical_line_to( x1, y1, x2, y2, t2 ); @@ -332,12 +333,14 @@ static void line_to_comparison( const int iterations ) const auto end2 = std::chrono::high_resolution_clock::now(); if( iterations > 1 ) { - const long diff1 = std::chrono::duration_cast( end1 - start1 ).count(); - const long diff2 = std::chrono::duration_cast( end2 - start2 ).count(); + const long long diff1 = + std::chrono::duration_cast( end1 - start1 ).count(); + const long long diff2 = + std::chrono::duration_cast( end2 - start2 ).count(); - printf( "line_to() executed %d times in %ld microseconds.\n", + printf( "line_to() executed %d times in %lld microseconds.\n", iterations, diff1 ); - printf( "canonical_line_to() executed %d times in %ld microseconds.\n", + printf( "canonical_line_to() executed %d times in %lld microseconds.\n", iterations, diff2 ); } } diff --git a/tests/map_memory.cpp b/tests/map_memory.cpp index 82ca3ee9be39e..afb2d186d1ea8 100644 --- a/tests/map_memory.cpp +++ b/tests/map_memory.cpp @@ -102,8 +102,9 @@ TEST_CASE( "lru_cache_perf", "[.]" ) } } const auto end1 = std::chrono::high_resolution_clock::now(); - const long diff1 = std::chrono::duration_cast( end1 - start1 ).count(); - printf( "completed %d insertions in %ld microseconds.\n", max_size, diff1 ); + const long long diff1 = std::chrono::duration_cast + ( end1 - start1 ).count(); + printf( "completed %d insertions in %lld microseconds.\n", max_size, diff1 ); /* * Original tripoint hash completed 1000000 insertions in 96136925 microseconds. * Table based interleave v1 completed 1000000 insertions in 41435604 microseconds. @@ -166,56 +167,56 @@ TEST_CASE( "shift_map_memory_seen_cache" ) GIVEN( "all bits are set" ) { test_cache.set(); WHEN( "positive x shift" ) { - shift_map_memory_seen_cache( test_cache, 1, 0 ); + shift_bitset_cache( test_cache, 1, 0 ); THEN( "last 12 columns are 0, rest are 1" ) { check_quadrants( test_cache, last_twelve, 0, true, false, true, false ); } } WHEN( "negative x shift" ) { - shift_map_memory_seen_cache( test_cache, -1, 0 ); + shift_bitset_cache( test_cache, -1, 0 ); THEN( "first 12 columns are 0, rest are 1" ) { check_quadrants( test_cache, first_twelve, 0, false, true, false, true ); } } WHEN( "positive y shift" ) { - shift_map_memory_seen_cache( test_cache, 0, 1 ); + shift_bitset_cache( test_cache, 0, 1 ); THEN( "last 12 rows are 0, rest are 1" ) { check_quadrants( test_cache, 0, last_twelve, true, true, false, false ); } } WHEN( "negative y shift" ) { - shift_map_memory_seen_cache( test_cache, 0, -1 ); + shift_bitset_cache( test_cache, 0, -1 ); THEN( "first 12 rows are 0, rest are 1" ) { check_quadrants( test_cache, 0, first_twelve, false, false, true, true ); } } WHEN( "positive x, positive y shift" ) { - shift_map_memory_seen_cache( test_cache, 1, 1 ); + shift_bitset_cache( test_cache, 1, 1 ); THEN( "last 12 columns and rows are 0, rest are 1" ) { check_quadrants( test_cache, last_twelve, last_twelve, true, false, false, false ); } } WHEN( "positive x, negative y shift" ) { - shift_map_memory_seen_cache( test_cache, 1, -1 ); + shift_bitset_cache( test_cache, 1, -1 ); THEN( "last 12 columns and first 12 rows are 0, rest are 1" ) { check_quadrants( test_cache, last_twelve, first_twelve, false, false, true, false ); } } WHEN( "negative x, positive y shift" ) { - shift_map_memory_seen_cache( test_cache, -1, 1 ); + shift_bitset_cache( test_cache, -1, 1 ); THEN( "first 12 columns and last 12 rows are 0, rest are 1" ) { check_quadrants( test_cache, first_twelve, last_twelve, false, true, false, false ); } } WHEN( "negative x, negative y shift" ) { - shift_map_memory_seen_cache( test_cache, -1, -1 ); + shift_bitset_cache( test_cache, -1, -1 ); THEN( "first 12 columns and rows are 0, rest are 1" ) { check_quadrants( test_cache, first_twelve, first_twelve, false, false, false, true ); diff --git a/tests/new_character_test.cpp b/tests/new_character_test.cpp index 4d0b2e061f9ae..7746f13e4184e 100644 --- a/tests/new_character_test.cpp +++ b/tests/new_character_test.cpp @@ -91,7 +91,7 @@ struct less { return lhs.prof < rhs.prof; } }; -} +} // namespace std // TODO: According to profiling (interrupt, backtrace, wait a few seconds, repeat) with a sample // size of 20, 70% of the time is due to the call to Character::set_mutation in try_set_traits. diff --git a/tests/npc_talk_test.cpp b/tests/npc_talk_test.cpp index ab01eadbb8fff..677458683b429 100644 --- a/tests/npc_talk_test.cpp +++ b/tests/npc_talk_test.cpp @@ -458,21 +458,22 @@ TEST_CASE( "npc_talk_test" ) effects.apply( d ); CHECK( !talker_npc.has_trait( trait_PROF_FED ) ); // buying and spending + talker_npc.op_of_u.owed = 1000; REQUIRE( !has_beer_bottle( g->u, 2 ) ); - REQUIRE( g->u.cash == 1000 ); + REQUIRE( talker_npc.op_of_u.owed == 1000 ); effects = d.responses[9].success; effects.apply( d ); - CHECK( g->u.cash == 500 ); + CHECK( talker_npc.op_of_u.owed == 500 ); CHECK( has_beer_bottle( g->u, 2 ) ); REQUIRE( !has_item( g->u, "bottle_plastic", 1 ) ); effects = d.responses[10].success; effects.apply( d ); CHECK( has_item( g->u, "bottle_plastic", 1 ) ); - CHECK( g->u.cash == 500 ); + CHECK( talker_npc.op_of_u.owed == 500 ); effects = d.responses[11].success; effects.apply( d ); - CHECK( g->u.cash == 0 ); - g->u.cash = 1000; + CHECK( talker_npc.op_of_u.owed == 0 ); + talker_npc.op_of_u.owed = 1000; // effect chains REQUIRE( !g->u.has_effect( effect_infected ) ); REQUIRE( !talker_npc.has_effect( effect_infected ) ); @@ -486,7 +487,7 @@ TEST_CASE( "npc_talk_test" ) CHECK( talker_npc.get_effect( effect_infected ).is_permanent() ); CHECK( g->u.has_trait( trait_PROF_SWAT ) ); CHECK( talker_npc.has_trait( trait_PROF_SWAT ) ); - CHECK( g->u.cash == 0 ); + CHECK( talker_npc.op_of_u.owed == 0 ); CHECK( talker_npc.get_attitude() == NPCATT_KILL ); // opinion changes talker_npc.op_of_u = npc_opinion(); @@ -603,56 +604,56 @@ TEST_CASE( "npc_talk_test" ) CHECK( d.responses[1].text == "This is a u_has_bionics bio_ads test response." ); CHECK( d.responses[2].text == "This is a npc_has_bionics ANY response." ); - // speaker effects just use cash because I don't want to do anything complicated - g->u.cash = 2000; - CHECK( g->u.cash == 2000 ); + // speaker effects just use are owed because I don't want to do anything complicated + talker_npc.op_of_u.owed = 2000; + CHECK( talker_npc.op_of_u.owed == 2000 ); d.add_topic( "TALK_TEST_SPEAKER_EFFECT_SIMPLE" ); d.apply_speaker_effects( d.topic_stack.back() ); - REQUIRE( g->u.cash == 1500 ); + REQUIRE( talker_npc.op_of_u.owed == 1500 ); d.apply_speaker_effects( d.topic_stack.back() ); - REQUIRE( g->u.cash == 1000 ); + REQUIRE( talker_npc.op_of_u.owed == 1000 ); d.add_topic( "TALK_TEST_SPEAKER_EFFECT_SIMPLE_CONDITIONAL" ); d.apply_speaker_effects( d.topic_stack.back() ); - REQUIRE( g->u.cash == 500 ); + REQUIRE( talker_npc.op_of_u.owed == 500 ); d.apply_speaker_effects( d.topic_stack.back() ); - REQUIRE( g->u.cash == 500 ); - g->u.cash = 2000; - CHECK( g->u.cash == 2000 ); + REQUIRE( talker_npc.op_of_u.owed == 0 ); + talker_npc.op_of_u.owed = 2000; + CHECK( talker_npc.op_of_u.owed == 2000 ); d.add_topic( "TALK_TEST_SPEAKER_EFFECT_SENTINEL" ); d.apply_speaker_effects( d.topic_stack.back() ); - REQUIRE( g->u.cash == 1500 ); + REQUIRE( talker_npc.op_of_u.owed == 1500 ); d.apply_speaker_effects( d.topic_stack.back() ); - REQUIRE( g->u.cash == 1500 ); + REQUIRE( talker_npc.op_of_u.owed == 1500 ); d.add_topic( "TALK_TEST_SPEAKER_EFFECT_SENTINEL_CONDITIONAL" ); d.apply_speaker_effects( d.topic_stack.back() ); - REQUIRE( g->u.cash == 1000 ); + REQUIRE( talker_npc.op_of_u.owed == 1000 ); d.apply_speaker_effects( d.topic_stack.back() ); - REQUIRE( g->u.cash == 1000 ); + REQUIRE( talker_npc.op_of_u.owed == 1000 ); - g->u.cash = 4500; - CHECK( g->u.cash == 4500 ); + talker_npc.op_of_u.owed = 4500; + CHECK( talker_npc.op_of_u.owed == 4500 ); d.add_topic( "TALK_TEST_SPEAKER_EFFECT_COMPOUND" ); d.apply_speaker_effects( d.topic_stack.back() ); - REQUIRE( g->u.cash == 3500 ); + REQUIRE( talker_npc.op_of_u.owed == 3500 ); d.apply_speaker_effects( d.topic_stack.back() ); - REQUIRE( g->u.cash == 2500 ); + REQUIRE( talker_npc.op_of_u.owed == 2500 ); d.add_topic( "TALK_TEST_SPEAKER_EFFECT_COMPOUND_CONDITIONAL" ); d.apply_speaker_effects( d.topic_stack.back() ); - REQUIRE( g->u.cash == 1000 ); + REQUIRE( talker_npc.op_of_u.owed == 1000 ); d.apply_speaker_effects( d.topic_stack.back() ); - REQUIRE( g->u.cash == 500 ); - g->u.cash = 3500; - CHECK( g->u.cash == 3500 ); + REQUIRE( talker_npc.op_of_u.owed == 500 ); + talker_npc.op_of_u.owed = 3500; + CHECK( talker_npc.op_of_u.owed == 3500 ); d.add_topic( "TALK_TEST_SPEAKER_EFFECT_COMPOUND_SENTINEL" ); d.apply_speaker_effects( d.topic_stack.back() ); - REQUIRE( g->u.cash == 2750 ); + REQUIRE( talker_npc.op_of_u.owed == 2750 ); d.apply_speaker_effects( d.topic_stack.back() ); - REQUIRE( g->u.cash == 2250 ); + REQUIRE( talker_npc.op_of_u.owed == 2250 ); d.add_topic( "TALK_TEST_SPEAKER_EFFECT_COMPOUND_SENTINEL_CONDITIONAL" ); d.apply_speaker_effects( d.topic_stack.back() ); - REQUIRE( g->u.cash == 1500 ); + REQUIRE( talker_npc.op_of_u.owed == 1500 ); d.apply_speaker_effects( d.topic_stack.back() ); - REQUIRE( g->u.cash == 1500 ); + REQUIRE( talker_npc.op_of_u.owed == 1500 ); // test change class REQUIRE( talker_npc.myclass == npc_class_id( "NC_TEST_CLASS" ) ); diff --git a/tests/npc_test.cpp b/tests/npc_test.cpp index 74a77137139f3..02265af1d050f 100644 --- a/tests/npc_test.cpp +++ b/tests/npc_test.cpp @@ -337,7 +337,7 @@ TEST_CASE( "npc-movement" ) if( type == 'A' || type == 'R' || type == 'W' || type == 'M' || type == 'B' || type == 'C' ) { - g->m.add_field( p, fd_acid, MAX_FIELD_DENSITY ); + g->m.add_field( p, fd_acid, MAX_FIELD_INTENSITY ); } // spawn rubbles if( type == 'R' ) { @@ -358,8 +358,11 @@ TEST_CASE( "npc-movement" ) || type == 'B' || type == 'C' ) { std::shared_ptr guy = std::make_shared(); - guy->normalize(); - guy->randomize(); + do { + guy->normalize(); + guy->randomize(); + // Repeat until we get an NPC vulnerable to acid + } while( guy->is_immune_field( fd_acid ) ); guy->spawn_at_precise( {g->get_levx(), g->get_levy()}, p ); // Set the shopkeep mission; this means that // the NPC deems themselves to be guarding and stops them diff --git a/tests/overmap_test.cpp b/tests/overmap_test.cpp index 49ed96f04b49b..aa331ade02f91 100644 --- a/tests/overmap_test.cpp +++ b/tests/overmap_test.cpp @@ -15,7 +15,7 @@ TEST_CASE( "set_and_get_overmap_scents" ) { - std::unique_ptr test_overmap = std::unique_ptr( new overmap( 0, 0 ) ); + std::unique_ptr test_overmap = std::make_unique( 0, 0 ); // By default there are no scents set. for( int x = 0; x < 180; ++x ) { diff --git a/tests/rng_test.cpp b/tests/rng_test.cpp index b2638e3691c3d..29af5c9883ac0 100644 --- a/tests/rng_test.cpp +++ b/tests/rng_test.cpp @@ -62,3 +62,16 @@ TEST_CASE( "x_in_y_distribution" ) } } } + +TEST_CASE( "random_entry_preserves_constness" ) +{ + const std::vector v0{ 4321 }; + int i0 = *random_entry_opt( v0 ); + CHECK( i0 == 4321 ); + + std::vector v1{ 1234 }; + int &i1 = *random_entry_opt( v1 ); + CHECK( i1 == 1234 ); + i1 = 5678; + CHECK( v1[0] == 5678 ); +} diff --git a/tests/savegame_test.cpp b/tests/savegame_test.cpp index 2855ef21441dc..266c2723d5a5e 100644 --- a/tests/savegame_test.cpp +++ b/tests/savegame_test.cpp @@ -222,7 +222,7 @@ TEST_CASE( "Reading a legacy overmap save." ) std::string legacy_save_name = "tests/data/legacy_0.C_overmap.sav"; std::string new_save_name = "tests/data/jsionized_overmap.sav"; - std::unique_ptr test_map = std::unique_ptr( new overmap( 0, 0 ) ); + std::unique_ptr test_map = std::make_unique( 0, 0 ); std::ifstream fin; fin.open( legacy_save_name.c_str(), std::ifstream::binary ); @@ -238,7 +238,7 @@ TEST_CASE( "Reading a legacy overmap save." ) test_map->serialize( fout ); fout.close(); - std::unique_ptr test_map_2 = std::unique_ptr( new overmap( 0, 0 ) ); + std::unique_ptr test_map_2 = std::make_unique( 0, 0 ); fin.open( new_save_name.c_str(), std::ifstream::binary ); REQUIRE( fin.is_open() ); diff --git a/tests/shadowcasting_test.cpp b/tests/shadowcasting_test.cpp index 8006252a1f5b3..6571c6cf94084 100644 --- a/tests/shadowcasting_test.cpp +++ b/tests/shadowcasting_test.cpp @@ -256,11 +256,13 @@ static void shadowcasting_runoff( const int iterations, const bool test_bresenha const auto end2 = std::chrono::high_resolution_clock::now(); if( iterations > 1 ) { - const long diff1 = std::chrono::duration_cast( end1 - start1 ).count(); - const long diff2 = std::chrono::duration_cast( end2 - start2 ).count(); - printf( "oldCastLight() executed %d times in %ld microseconds.\n", + const long long diff1 = std::chrono::duration_cast + ( end1 - start1 ).count(); + const long long diff2 = std::chrono::duration_cast + ( end2 - start2 ).count(); + printf( "oldCastLight() executed %d times in %lld microseconds.\n", iterations, diff1 ); - printf( "castLight() executed %d times in %ld microseconds.\n", + printf( "castLight() executed %d times in %lld microseconds.\n", iterations, diff2 ); } @@ -316,13 +318,15 @@ static void shadowcasting_float_quad( const auto end2 = std::chrono::high_resolution_clock::now(); if( iterations > 1 ) { - const long diff1 = std::chrono::duration_cast( end1 - start1 ).count(); - const long diff2 = std::chrono::duration_cast( end2 - start2 ).count(); + const long long diff1 = std::chrono::duration_cast + ( end1 - start1 ).count(); + const long long diff2 = std::chrono::duration_cast + ( end2 - start2 ).count(); printf( "castLight on four_quadrants (denominator %u) " - "executed %d times in %ld microseconds.\n", + "executed %d times in %lld microseconds.\n", denominator, iterations, diff1 ); printf( "castLight on floats (denominator %u) " - "executed %d times in %ld microseconds.\n", + "executed %d times in %lld microseconds.\n", denominator, iterations, diff2 ); } @@ -379,11 +383,13 @@ static void shadowcasting_3d_2d( const int iterations ) const auto end2 = std::chrono::high_resolution_clock::now(); if( iterations > 1 ) { - const long diff1 = std::chrono::duration_cast( end1 - start1 ).count(); - const long diff2 = std::chrono::duration_cast( end2 - start2 ).count(); - printf( "castLight() executed %d times in %ld microseconds.\n", + const long long diff1 = + std::chrono::duration_cast( end1 - start1 ).count(); + const long long diff2 = + std::chrono::duration_cast( end2 - start2 ).count(); + printf( "castLight() executed %d times in %lld microseconds.\n", iterations, diff1 ); - printf( "cast_zlight() executed %d times in %ld microseconds.\n", + printf( "cast_zlight() executed %d times in %lld microseconds.\n", iterations, diff2 ); printf( "new/old execution time ratio: %.02f.\n", static_cast( diff2 ) / diff1 ); } diff --git a/tests/string_formatter_test.cpp b/tests/string_formatter_test.cpp index c164a67e86e66..b0fcf29fe56db 100644 --- a/tests/string_formatter_test.cpp +++ b/tests/string_formatter_test.cpp @@ -109,6 +109,8 @@ TEST_CASE( "string_formatter" ) test_typed_printf( "%i", nullptr ); test_typed_printf( "%u", nullptr ); + test_typed_printf( "%zu", "%u" ); + test_typed_printf( "%td", "%d" ); #if !defined(__USE_MINGW_ANSI_STDIO) && (defined(__MINGW32__) || defined(__MINGW64__)) mingw_test( "%I32i", "%i", std::numeric_limits::max() ); diff --git a/tests/vehicle_drag.cpp b/tests/vehicle_drag.cpp index b806dd22d837b..b7b1e6e1461cb 100644 --- a/tests/vehicle_drag.cpp +++ b/tests/vehicle_drag.cpp @@ -77,7 +77,7 @@ static vehicle *setup_drag_test( const vproto_id &veh_id ) // Remove all items from cargo to normalize weight. // turn everything on for( const vpart_reference vp : veh_ptr->get_all_parts() ) { - while( veh_ptr->remove_item( vp.part_index(), 0 ) ); + veh_ptr->get_items( vp.part_index() ).clear(); veh_ptr->toggle_specific_part( vp.part_index(), true ); } // close the doors diff --git a/tests/vehicle_efficiency.cpp b/tests/vehicle_efficiency.cpp index 5ef56be3430c7..de451eb2b8f5c 100644 --- a/tests/vehicle_efficiency.cpp +++ b/tests/vehicle_efficiency.cpp @@ -35,7 +35,7 @@ class monster; -using efficiency_stat = statistics; +using efficiency_stat = statistics; const efftype_id effect_blind( "blind" ); @@ -71,7 +71,7 @@ static void clear_game( const ter_id &terrain ) // Returns how much fuel did it provide // But contains only fuels actually used by engines -static std::map set_vehicle_fuel( vehicle &v, const float veh_fuel_mult ) +static std::map set_vehicle_fuel( vehicle &v, const float veh_fuel_mult ) { // First we need to find the fuels to set // That is, fuels actually used by some engine @@ -102,7 +102,7 @@ static std::map set_vehicle_fuel( vehicle &v, const float veh_fu // Set fuel to a given percentage // Batteries are special cased because they aren't liquid fuel - std::map ret; + std::map ret; for( const vpart_reference vp : v.get_all_parts() ) { vehicle_part &pt = vp.part(); @@ -134,9 +134,9 @@ static std::map set_vehicle_fuel( vehicle &v, const float veh_fu // Returns the lowest percentage of fuel left // ie. 1 means no fuel was used, 0 means at least one dry tank -static float fuel_percentage_left( vehicle &v, const std::map &started_with ) +static float fuel_percentage_left( vehicle &v, const std::map &started_with ) { - std::map fuel_amount; + std::map fuel_amount; std::set consumed_fuels; for( const vpart_reference vp : v.get_all_parts() ) { vehicle_part &pt = vp.part(); @@ -177,13 +177,13 @@ const int cycle_limit = 100; // Rescale the recorded number of tiles based on fuel percentage left // (ie. 0% fuel left means no scaling, 50% fuel left means double the effective distance) // Return the rescaled number -static long test_efficiency( const vproto_id &veh_id, int &expected_mass, - const ter_id &terrain, - const int reset_velocity_turn, const long target_distance, - const bool smooth_stops = false, const bool test_mass = true ) +static int test_efficiency( const vproto_id &veh_id, int &expected_mass, + const ter_id &terrain, + const int reset_velocity_turn, const int target_distance, + const bool smooth_stops = false, const bool test_mass = true ) { - long min_dist = target_distance * 0.99; - long max_dist = target_distance * 1.01; + int min_dist = target_distance * 0.99; + int max_dist = target_distance * 1.01; clear_game( terrain ); const tripoint map_starting_point( 60, 60, 0 ); @@ -198,7 +198,7 @@ static long test_efficiency( const vproto_id &veh_id, int &expected_mass, // Remove all items from cargo to normalize weight. for( const vpart_reference vp : veh.get_all_parts() ) { - while( veh.remove_item( vp.part_index(), 0 ) ); + veh_ptr->get_items( vp.part_index() ).clear(); vp.part().ammo_consume( vp.part().ammo_remaining(), vp.pos() ); } for( const vpart_reference vp : veh.get_avail_parts( "OPENABLE" ) ) { @@ -231,7 +231,7 @@ static long test_efficiency( const vproto_id &veh_id, int &expected_mass, veh.velocity = target_velocity; } int reset_counter = 0; - long tiles_travelled = 0; + int tiles_travelled = 0; int cycles_left = cycle_limit; bool accelerating = true; CHECK( veh.safe_velocity() > 0 ); @@ -271,7 +271,7 @@ static long test_efficiency( const vproto_id &veh_id, int &expected_mass, float fuel_left = fuel_percentage_left( veh, starting_fuel ); REQUIRE( starting_fuel_per - fuel_left > 0.0001f ); const float fuel_percentage_used = fuel_level * ( starting_fuel_per - fuel_left ); - long adjusted_tiles_travelled = tiles_travelled / fuel_percentage_used; + int adjusted_tiles_travelled = tiles_travelled / fuel_percentage_used; if( target_distance >= 0 ) { CHECK( adjusted_tiles_travelled >= min_dist ); CHECK( adjusted_tiles_travelled <= max_dist ); @@ -295,9 +295,9 @@ static efficiency_stat find_inner( static void print_stats( const efficiency_stat &st ) { if( st.min() == st.max() ) { - printf( "All results %ld.\n", st.min() ); + printf( "All results %d.\n", st.min() ); } else { - printf( "Min %ld, Max %ld, Midpoint %f.\n", st.min(), st.max(), + printf( "Min %d, Max %d, Midpoint %f.\n", st.min(), st.max(), ( st.min() + st.max() ) / 2.0 ); } } @@ -336,8 +336,8 @@ static void print_test_strings( const std::string &type ) std::ostringstream ss; int expected_mass = 0; ss << " test_vehicle( \"" << type << "\", "; - const long d_pave = average_from_stat( find_inner( type, expected_mass, "t_pavement", -1, - false, false ) ); + const int d_pave = average_from_stat( find_inner( type, expected_mass, "t_pavement", -1, + false, false ) ); ss << expected_mass << ", " << d_pave << ", "; ss << average_from_stat( find_inner( type, expected_mass, "t_dirt", -1, false, false ) ) << ", "; @@ -353,9 +353,9 @@ static void print_test_strings( const std::string &type ) static void test_vehicle( std::string type, int expected_mass, - const long pavement_target, const long dirt_target, - const long pavement_target_w_stops, const long dirt_target_w_stops, - const long pavement_target_smooth_stops = 0, const long dirt_target_smooth_stops = 0 ) + const int pavement_target, const int dirt_target, + const int pavement_target_w_stops, const int dirt_target_w_stops, + const int pavement_target_smooth_stops = 0, const int dirt_target_smooth_stops = 0 ) { SECTION( type + " on pavement" ) { test_efficiency( vproto_id( type ), expected_mass, ter_id( "t_pavement" ), -1, diff --git a/tests/visitable_remove.cpp b/tests/visitable_remove.cpp index a32ad5e6f6eaf..60af686b56e5e 100644 --- a/tests/visitable_remove.cpp +++ b/tests/visitable_remove.cpp @@ -423,9 +423,7 @@ TEST_CASE( "visitable_remove", "[visitable]" ) const int part = vp->part_index(); REQUIRE( part >= 0 ); // Empty the vehicle of any cargo. - while( !v->get_items( part ).empty() ) { - v->remove_item( part, 0 ); - } + v->get_items( part ).clear(); for( int i = 0; i != count; ++i ) { v->add_item( part, obj ); } diff --git a/tools/astyle_all_changes.sh b/tools/astyle_all_changes.sh deleted file mode 100755 index 9cc67ca5df529..0000000000000 --- a/tools/astyle_all_changes.sh +++ /dev/null @@ -1,7 +0,0 @@ -#!/bin/bash - -git diff -U0 master | grep -E '\+\+\+' | grep -Eo 'src/\D+' | while read line -do - echo "tools/astyle_file_changes.sh $line" - tools/astyle_file_changes.sh $line -done diff --git a/tools/astyle_file_changes.sh b/tools/astyle_file_changes.sh deleted file mode 100755 index 18b95ade88c5a..0000000000000 --- a/tools/astyle_file_changes.sh +++ /dev/null @@ -1,32 +0,0 @@ -#!/bin/bash -if [ "$#" -gt 0 ] -then - echo "Making backup at $1.bak" - cp $1 $1.bak - EXTRA=$(echo 0) - WC=$(wc -l $1 | grep -Eo '\d+') - git diff -U0 master $1 | grep -E '@@' | grep -Eo '\+\d+,?\d+ @@' | grep -Eo '\d+,?\d+' | while read line - do - ALPHA=$(echo $line | awk -F"," '{print $1}') - DELTA=$(echo $line | awk -F"," '{print $2}') - ALPHA=$(($ALPHA+$EXTRA)) - if [ "$(($DELTA))" -lt 1 ] - then - DELTA=$(echo 1) - fi - DELTA=$(($DELTA-1)) - OMEGA=$(($ALPHA+$DELTA)) - sed -e '1,'$ALPHA'd;'$OMEGA'q' $1 > to_format.cpp - astyle --options=.astylerc -n to_format.cpp - sed -e $ALPHA'q' $1 > buffer - cat to_format.cpp >> buffer - sed -e '1,'$OMEGA'd' $1 >> buffer - cp buffer $1 - - WCL=$(wc -l $1 | grep -Eo '\d+') - EXTRA=$(($WCL+$WC)) - echo "Finished styling lines $ALPHA through $OMEGA." - done - rm buffer to_format.cpp -# diff $1 $1.bak -fi diff --git a/tools/astyle_lines.sh b/tools/astyle_lines.sh deleted file mode 100755 index 5dde9a43f91ef..0000000000000 --- a/tools/astyle_lines.sh +++ /dev/null @@ -1,13 +0,0 @@ -#!/bin/bash -if [ "$#" -gt 2 ] -then - echo "Making backup at $1.bak" - sed -e $2'q' $1 >> temp.cpp - sed -e '1,'$2'd;'$3'q' $1 > to_format.cpp - astyle --options=.astylerc -n to_format.cpp - cat to_format.cpp >> temp.cpp - sed -e '1,'$3'd' $1 >> temp.cpp - echo "Finished styling lines $2 through $3." - cp temp.cpp $1 - rm temp.cpp to_format.cpp -fi diff --git a/tools/clang-tidy-plugin/CMakeLists.txt b/tools/clang-tidy-plugin/CMakeLists.txt new file mode 100644 index 0000000000000..30dab7b30abce --- /dev/null +++ b/tools/clang-tidy-plugin/CMakeLists.txt @@ -0,0 +1,54 @@ +include(ExternalProject) + +find_package(LLVM REQUIRED CONFIG) +find_package(Clang REQUIRED CONFIG) + +add_library( + CataAnalyzerPlugin MODULE + CataTidyModule.cpp NoLongCheck.cpp) + +target_include_directories( + CataAnalyzerPlugin SYSTEM PRIVATE + ${LLVM_INCLUDE_DIRS} ${CLANG_INCLUDE_DIRS}) + +if ("${CATA_CLANG_TIDY_INCLUDE_DIR}" STREQUAL "") + SET(ctps_releases + https://github.com/jbytheway/clang-tidy-plugin-support/releases/download) + SET(ctps_version llvm-8.0.1-r12) + SET(ctps_src + ${CMAKE_CURRENT_BINARY_DIR}/clang-tidy-plugin-support) + + ExternalProject_Add( + clang-tidy-plugin-support + URL ${ctps_releases}/${ctps_version}/clang-tidy-plugin-support-${ctps_version}.tar.xz + URL_HASH SHA256=00ffab0df11250f394830735514c62ae787bd2eb6eb9d5e97471206d270c54e2 + SOURCE_DIR ${ctps_src} + CONFIGURE_COMMAND "" + BUILD_COMMAND "" + INSTALL_COMMAND "" + TEST_COMMAND "" + ) + + add_dependencies(CataAnalyzerPlugin clang-tidy-plugin-support) + target_include_directories( + CataAnalyzerPlugin SYSTEM PRIVATE ${ctps_src}/include) +else() + target_include_directories( + CataAnalyzerPlugin SYSTEM PRIVATE ${CATA_CLANG_TIDY_INCLUDE_DIR}) +endif() + +target_compile_definitions( + CataAnalyzerPlugin PRIVATE ${LLVM_DEFINITIONS}) + +# We need to turn off exceptions and RTTI to match the LLVM build. +# I feel there ought to be a way to extract these flags from the +# LLVMConfig.cmake as we have done for e.g. LLVM_INCLUDE_DIRS above, but I +# haven't found one. +if(MSVC) +else() + target_compile_options( + CataAnalyzerPlugin PRIVATE -fno-exceptions -fno-rtti) +endif() + +configure_file(test/lit.site.cfg.in test/lit.site.cfg @ONLY) +configure_file(test/.clang-tidy test/.clang-tidy COPYONLY) diff --git a/tools/clang-tidy-plugin/CataTidyModule.cpp b/tools/clang-tidy-plugin/CataTidyModule.cpp new file mode 100644 index 0000000000000..34e78038051c0 --- /dev/null +++ b/tools/clang-tidy-plugin/CataTidyModule.cpp @@ -0,0 +1,28 @@ +#include "ClangTidy.h" +#include "ClangTidyModule.h" +#include "ClangTidyModuleRegistry.h" +#include "NoLongCheck.h" + +namespace clang +{ +namespace tidy +{ +namespace cata +{ + +class CataModule : public ClangTidyModule +{ + public: + void addCheckFactories( ClangTidyCheckFactories &CheckFactories ) override { + CheckFactories.registerCheck( "cata-no-long" ); + } +}; + +} // namespace cata + +// Register the MiscTidyModule using this statically initialized variable. +static ClangTidyModuleRegistry::Add +X( "cata-module", "Adds Cataclysm-DDA checks." ); + +} // namespace tidy +} // namespace clang diff --git a/tools/clang-tidy-plugin/NoLongCheck.cpp b/tools/clang-tidy-plugin/NoLongCheck.cpp new file mode 100644 index 0000000000000..2113f98a57bdd --- /dev/null +++ b/tools/clang-tidy-plugin/NoLongCheck.cpp @@ -0,0 +1,157 @@ +#include "NoLongCheck.h" +#include "clang/AST/ASTContext.h" +#include "clang/ASTMatchers/ASTMatchFinder.h" +#include "clang/Frontend/CompilerInstance.h" + +using namespace clang::ast_matchers; + +namespace clang +{ +namespace tidy +{ +namespace cata +{ + +class NoLongMacrosCallbacks : public PPCallbacks +{ + public: + NoLongMacrosCallbacks( NoLongCheck *Check ) : + Check( Check ) {} + + void MacroExpands( const Token &MacroNameTok, + const MacroDefinition &, + SourceRange Range, + const MacroArgs * ) override { + StringRef MacroName = MacroNameTok.getIdentifierInfo()->getName(); + if( MacroName == "LONG_MIN" || MacroName == "LONG_MAX" || MacroName == "ULONG_MAX" ) { + Check->diag( Range.getBegin(), "Use of long-specific macro %0" ) << MacroName; + } + } + private: + NoLongCheck *Check; +}; + +void NoLongCheck::registerPPCallbacks( CompilerInstance &Compiler ) +{ + Compiler.getPreprocessor().addPPCallbacks( + llvm::make_unique( this ) ); +} + +void NoLongCheck::registerMatchers( MatchFinder *Finder ) +{ + using TypeMatcher = clang::ast_matchers::internal::Matcher; + const TypeMatcher isIntegerOrRef = + qualType( anyOf( isInteger(), references( isInteger() ) ), + unless( autoType() ), unless( references( autoType() ) ) ); + Finder->addMatcher( valueDecl( hasType( isIntegerOrRef ) ).bind( "decl" ), this ); + Finder->addMatcher( functionDecl( returns( isIntegerOrRef ) ).bind( "return" ), this ); + Finder->addMatcher( cxxStaticCastExpr( hasDestinationType( isIntegerOrRef ) ).bind( "cast" ), + this ); +} + +static std::string AlternativesFor( QualType Type ) +{ + Type = Type.getNonReferenceType(); + Type = Type.getLocalUnqualifiedType(); + std::string name = Type.getAsString(); + if( name == "long" ) { + return "Prefer int or int64_t to long"; + } else if( name == "unsigned long" ) { + return "Prefer unsigned int, size_t, or uint64_t to unsigned long"; + } else { + return {}; + } +} + +static void CheckDecl( NoLongCheck &Check, const MatchFinder::MatchResult &Result ) +{ + const ValueDecl *MatchedDecl = Result.Nodes.getNodeAs( "decl" ); + if( !MatchedDecl || !MatchedDecl->getLocation().isValid() ) { + return; + } + QualType Type = MatchedDecl->getType(); + std::string alternatives = AlternativesFor( Type ); + if( alternatives.empty() ) { + return; + } + if( MatchedDecl->getName().startswith( "__" ) ) { + // Can happen for e.g. compiler-generated code inside an implicitly + // generated function + return; + } + Decl::Kind contextKind = MatchedDecl->getDeclContext()->getDeclKind(); + if( contextKind == Decl::Function || contextKind == Decl::CXXMethod || + contextKind == Decl::CXXConstructor || contextKind == Decl::CXXConversion || + contextKind == Decl::CXXDestructor || contextKind == Decl::CXXDeductionGuide ) { + TemplateSpecializationKind tsk = + static_cast( + MatchedDecl->getDeclContext() )->getTemplateSpecializationKind(); + if( tsk == TSK_ImplicitInstantiation ) { + // This happens for e.g. a parameter 'T a' to an instantiated + // template function where T is long. We don't want to report such + // cases. + return; + } + } + Check.diag( + MatchedDecl->getLocation(), "Variable %0 declared as %1. %2." ) << + MatchedDecl << Type << alternatives; +} + +static void CheckReturn( NoLongCheck &Check, const MatchFinder::MatchResult &Result ) +{ + const FunctionDecl *MatchedDecl = Result.Nodes.getNodeAs( "return" ); + if( !MatchedDecl || !MatchedDecl->getLocation().isValid() ) { + return; + } + QualType Type = MatchedDecl->getDeclaredReturnType(); + std::string alternatives = AlternativesFor( Type ); + if( alternatives.empty() ) { + return; + } + if( MatchedDecl->isTemplateInstantiation() ) { + return; + } + + Decl::Kind contextKind = MatchedDecl->getDeclContext()->getDeclKind(); + if( contextKind == Decl::ClassTemplateSpecialization ) { + TemplateSpecializationKind tsk = + static_cast( + MatchedDecl->getDeclContext() )->getTemplateSpecializationKind(); + if( tsk == TSK_ImplicitInstantiation ) { + // This happens for e.g. a parameter 'T a' to an instantiated + // template function where T is long. We don't want to report such + // cases. + return; + } + } + Check.diag( + MatchedDecl->getLocation(), "Function %0 declared as returning %1. %2." ) << + MatchedDecl << Type << alternatives; +} + +static void CheckCast( NoLongCheck &Check, const MatchFinder::MatchResult &Result ) +{ + const CXXStaticCastExpr *MatchedDecl = Result.Nodes.getNodeAs( "cast" ); + if( !MatchedDecl ) { + return; + } + QualType Type = MatchedDecl->getType(); + std::string alternatives = AlternativesFor( Type ); + if( alternatives.empty() ) { + return; + } + SourceLocation location = MatchedDecl->getTypeInfoAsWritten()->getTypeLoc().getBeginLoc(); + Check.diag( location, "Static cast to %0. %1." ) << Type << alternatives; +} + +void NoLongCheck::check( const MatchFinder::MatchResult &Result ) +{ + CheckDecl( *this, Result ); + CheckReturn( *this, Result ); + CheckCast( *this, Result ); +} + +} // namespace cata +} // namespace tidy +} // namespace clang diff --git a/tools/clang-tidy-plugin/NoLongCheck.h b/tools/clang-tidy-plugin/NoLongCheck.h new file mode 100644 index 0000000000000..e6c6c489f2ae4 --- /dev/null +++ b/tools/clang-tidy-plugin/NoLongCheck.h @@ -0,0 +1,27 @@ +#ifndef CATA_TOOLS_CLANG_TIDY_NOLONGCHECK_H +#define CATA_TOOLS_CLANG_TIDY_NOLONGCHECK_H + +#include "ClangTidy.h" + +namespace clang +{ +namespace tidy +{ +namespace cata +{ + +class NoLongCheck : public ClangTidyCheck +{ + public: + NoLongCheck( StringRef Name, ClangTidyContext *Context ) + : ClangTidyCheck( Name, Context ) {} + void registerPPCallbacks( CompilerInstance &Compiler ) override; + void registerMatchers( ast_matchers::MatchFinder *Finder ) override; + void check( const ast_matchers::MatchFinder::MatchResult &Result ) override; +}; + +} // namespace cata +} // namespace tidy +} // namespace clang + +#endif // CATA_TOOLS_CLANG_TIDY_NOLONGCHECK_H diff --git a/tools/clang-tidy-plugin/test/.clang-tidy b/tools/clang-tidy-plugin/test/.clang-tidy new file mode 100644 index 0000000000000..6179a0c5c0836 --- /dev/null +++ b/tools/clang-tidy-plugin/test/.clang-tidy @@ -0,0 +1 @@ +WarningsAsErrors: '-*' diff --git a/tools/clang-tidy-plugin/test/lit.cfg b/tools/clang-tidy-plugin/test/lit.cfg new file mode 100644 index 0000000000000..bf660481acf60 --- /dev/null +++ b/tools/clang-tidy-plugin/test/lit.cfg @@ -0,0 +1,24 @@ +import sys +import os +import lit.formats + +config.name = 'clang-tidy-cata' +config.test_format = lit.formats.ShTest(True) +config.test_source_root = os.path.dirname(__file__) +config.test_exec_root = os.path.join( + config.plugin_build_root, 'test') + +config.suffixes = ['.cpp'] + +if config.cata_check_clang_tidy: + check_clang_tidy = config.cata_check_clang_tidy +else: + check_clang_tidy = os.path.join( + config.plugin_build_root, 'clang-tidy-plugin-support', 'bin', + 'check_clang_tidy.py') + +cata_plugin = os.path.join( + config.plugin_build_root, 'libCataAnalyzerPlugin.so') + +config.substitutions.append(('%check_clang_tidy', check_clang_tidy)) +config.substitutions.append(('%cata_plugin', cata_plugin)) diff --git a/tools/clang-tidy-plugin/test/lit.site.cfg.in b/tools/clang-tidy-plugin/test/lit.site.cfg.in new file mode 100644 index 0000000000000..aae4d01870d78 --- /dev/null +++ b/tools/clang-tidy-plugin/test/lit.site.cfg.in @@ -0,0 +1,7 @@ +import os + +config.plugin_build_root = "@CMAKE_CURRENT_BINARY_DIR@" +config.cata_check_clang_tidy = "@CATA_CHECK_CLANG_TIDY@" + +lit_config.load_config( + config, os.path.join("@CMAKE_CURRENT_SOURCE_DIR@", "test", "lit.cfg")) diff --git a/tools/clang-tidy-plugin/test/no-long.cpp b/tools/clang-tidy-plugin/test/no-long.cpp new file mode 100644 index 0000000000000..9ea4b1b0c9643 --- /dev/null +++ b/tools/clang-tidy-plugin/test/no-long.cpp @@ -0,0 +1,102 @@ +// RUN: %check_clang_tidy %s cata-no-long %t -- -plugins=%cata_plugin -- + +#include +#include + +long i1; +// CHECK-MESSAGES: warning: Variable 'i1' declared as 'long'. Prefer int or int64_t to long. [cata-no-long] + +unsigned long i2; +// CHECK-MESSAGES: warning: Variable 'i2' declared as 'unsigned long'. Prefer unsigned int, size_t, or uint64_t to unsigned long. [cata-no-long] + +const long i3 = 0; +// CHECK-MESSAGES: warning: Variable 'i3' declared as 'const long'. Prefer int or int64_t to long. [cata-no-long] + +long &i4 = i1; +// CHECK-MESSAGES: warning: Variable 'i4' declared as 'long &'. Prefer int or int64_t to long. [cata-no-long] + +long &&i5 = 0L; +// CHECK-MESSAGES: warning: Variable 'i5' declared as 'long &&'. Prefer int or int64_t to long. [cata-no-long] + +int64_t i6; +uint64_t i7; + +auto i8 = int64_t {}; +auto &i9 = i1; +const auto &i10 = i1; +//auto&& i11 = i1; // Shouldn't cause a warning but I can't fix it + +void f1( long e ); +// CHECK-MESSAGES: warning: Variable 'e' declared as 'long'. Prefer int or int64_t to long. [cata-no-long] + +long f2(); +// CHECK-MESSAGES: warning: Function 'f2' declared as returning 'long'. Prefer int or int64_t to long. [cata-no-long] + +int64_t f3(); +auto f4() -> decltype( 0L ); + +int c0 = static_cast( 0 ); +// CHECK-MESSAGES: warning: Static cast to 'long'. Prefer int or int64_t to long. [cata-no-long] +int c1 = static_cast( 0 ); + +template +T g0( T gp0, long gp1 = 0 ) +{ + // CHECK-MESSAGES: warning: Variable 'gp1' declared as 'long'. Prefer int or int64_t to long. [cata-no-long] + long gi0; + // CHECK-MESSAGES: warning: Variable 'gi0' declared as 'long'. Prefer int or int64_t to long. [cata-no-long] + T gi1; +} + +void h() +{ + g0( 0, 0 ); + // Would like to report an error here for the template argument, but have + // not found a way to do so. + + g0( LONG_MIN ); + // CHECK-MESSAGES: warning: Use of long-specific macro LONG_MIN [cata-no-long] + g0( LONG_MAX ); + // CHECK-MESSAGES: warning: Use of long-specific macro LONG_MAX [cata-no-long] + g0( ULONG_MAX ); + // CHECK-MESSAGES: warning: Use of long-specific macro ULONG_MAX [cata-no-long] +} + +template +struct A { + A(); + A( const A & ); + A( A && ); + A &operator=( const A & ); + A &operator=( A && ); + T Af0(); + long Af1(); + // CHECK-MESSAGES: warning: Function 'Af1' declared as returning 'long'. Prefer int or int64_t to long. [cata-no-long] + T Af2( long Af2i ); + // CHECK-MESSAGES: warning: Variable 'Af2i' declared as 'long'. Prefer int or int64_t to long. [cata-no-long] +}; + +A a; + +auto l0 = []( int64_t a ) +{ + return a; +}; + +template +struct B { + A BA[size][size]; +}; + +void Bf() +{ + B<12> b0; + B<12> b1; + // This exercises an obscure corner case where a defaulted operator= will + // cause the compiler to generate code involving an unsigned long variable. + b1 = static_cast < B<12> && >( b0 ); +} + +template +long g1( T g1p0 ); +// CHECK-MESSAGES: warning: Function 'g1' declared as returning 'long'. Prefer int or int64_t to long. [cata-no-long] diff --git a/tools/copy_from.py b/tools/copy_from.py new file mode 100644 index 0000000000000..8526c562a33c1 --- /dev/null +++ b/tools/copy_from.py @@ -0,0 +1,78 @@ +#!/usr/bin/env python3 + +import json +import argparse +import os +import copy +import math +import string +from operator import itemgetter, attrgetter + + +IGNORE_MISMATCH = ["id", "abstract"] + +def get_data(argsDict, resource_name): + resource = [] + resource_sources = argsDict.get(resource_name, []) + if not isinstance(resource_sources, list): + resource_sources = [resource_sources] + for resource_filename in resource_sources: + if resource_filename.endswith(".json"): + try: + with open(resource_filename) as resource_file: + resource += json.load(resource_file) + except FileNotFoundError: + exit("Failed: could not find {}".format(resource_filename)) + else: + print("Invalid filename {}".format(resource_filename)) + if not resource: + exit("Failed: {} was empty".format(resource_filename)) + return resource + + +args = argparse.ArgumentParser(description="Make items use copy-from.") +args.add_argument("item_source", action="store", + help="specify json file to rewrite using copy-from.") +args.add_argument("--output", dest="output_name", action="store", + help="Name of output file. Defaults to the command line.") +argsDict = vars(args.parse_args()) + +items = get_data(argsDict, "item_source") + +base_item = items[0] +base_id = base_item.get("id") or base_item.get("abstract") +if not base_id: + exit("Failure: first item malformed") +for item in items: + if item == base_item: + continue + if item.get("copy-from"): + continue + del_keys = [] + for key in item: + if key == "type": + continue + if item[key] == base_item.get(key): + del_keys.append(key) + can_copy = True + for key in base_item: + if key in del_keys: + continue + if key in IGNORE_MISMATCH: + continue + if key not in item: + can_copy = False + break + + if not can_copy: + continue + + for key in del_keys: + del item[key] + item["copy-from"] = base_id + +output_name = argsDict.get("output_name", "") +if output_name and not output_name.endswith(".json"): + output_name += ".json" + +print(json.dumps(items, indent=2)) diff --git a/tools/dialogue_validator.py b/tools/dialogue_validator.py index 01f703b9544b1..5a3a73e6569a0 100755 --- a/tools/dialogue_validator.py +++ b/tools/dialogue_validator.py @@ -12,10 +12,13 @@ args = argparse.ArgumentParser(description="Confirm that every talk topic in every response in a " "dialogue JSON is defined, and that every defined talk " - "topic is referenced in at least one response.") + "topic is referenced in at least one response.\n" + "Also checks that every dialogue path reaches " + "TALK_DONE and every topic is reachable from an NPC's" + "starting topic. Reports nothing on success.") args.add_argument("dialogue_json", nargs="+", action="store", help="specify json file or files to validate. Use 'data/json/npcs/* " - "data/json/npcs/Backgrounds/* data/json/npcs/refugee_center/*' to validate the " + "data/json/npcs/*/* data/json/npcs/*/*/*' to validate the " "dialogue in the vanilla game.") argsDict = vars(args.parse_args()) @@ -32,40 +35,65 @@ def get_dialogue_from_json(): return dialogue -def add_topic_by_chat(topics, topic_id): +def add_topic_by_chat(topics, topic_id, topic_branches=None, this_ids=None): topics.setdefault(topic_id, {}) + if topic_branches is not None: + topic_branches.setdefault(topic_id, {"responses": [], "ends": False, "parent": None}) + if this_ids is not None: + this_ids.append(topic_id) topics[topic_id]["in_response"] = True -def add_topic_by_id(topics, topic_id): +def add_topic_by_id(topics, topic_id, topic_branches=None, this_ids=None): if topic_id in OBSOLETE_TOPICS: return + if topic_branches is not None: + topic_branches.setdefault(topic_id, {"responses": [], "ends": False, "parent": None}) + if this_ids is not None: + this_ids.append(topic_id) topics.setdefault(topic_id, {}) topics[topic_id]["valid"] = True -def add_topic_by_response(topics, response): +def add_topic_by_response(topics, response, topic_branches=None, this_ids=None): topic_id = response.get("topic") if not topic_id: return topics.setdefault(topic_id, {}) topics[topic_id]["in_response"] = True + if not topic_branches: + return + for parent_id in this_ids: + if topic_id == "TALK_DONE": + topic_branches[parent_id]["ends"] = True + elif topic_id == "TALK_NONE": + for previous_id in topic_branches: + if parent_id in topic_branches[previous_id]["responses"]: + topic_branches[parent_id]["responses"].append(previous_id) + else: + topic_branches[parent_id]["responses"].append(topic_id) -def parse_response(topics, response): +def parse_response(topics, response, topic_branches=None, this_ids=None): if response.get("topic"): - add_topic_by_response(topics, response) + add_topic_by_response(topics, response, topic_branches, this_ids) else: success_r = response.get("success", {}) - add_topic_by_response(topics, success_r) + add_topic_by_response(topics, success_r, topic_branches, this_ids) failure_r = response.get("failure", {}) - add_topic_by_response(topics, failure_r) + add_topic_by_response(topics, failure_r, topic_branches, this_ids) def validate(dialogue): topics = {} + topic_branches = { + "TALK_TRAIN": {"responses": ["TALK_TRAIN_START"], "ends": False, "parent": None}, + "TALK_HOW_MUCH_FURTHER": {"responses": ["TALK_DONE"], "ends": True, "parent": None}, + "TALK_SEDATED": {"responses": ["TALK_DONE"], "ends": True, "parent": None}, + } # defined in src/npctalk.cpp - defined_ids = [ "TALK_NONE", "TALK_DONE", "TALK_TRAIN", "TALK_HOW_MUCH_FURTHER" ] + defined_ids = [ "TALK_NONE", "TALK_DONE", "TALK_TRAIN", "TALK_HOW_MUCH_FURTHER", + "TALK_SEDATED" ] for topic_id in defined_ids: add_topic_by_id(topics, topic_id) @@ -73,51 +101,110 @@ def validate(dialogue): refered_ids = [ "TALK_WAKE_UP", "TALK_RADIO", "TALK_MISSION_DESCRIBE_URGENT", "TALK_MISSION_DESCRIBE", "TALK_SHELTER", "TALK_SIZE_UP", "TALK_LOOK_AT", "TALK_OPINION", "TALK_SHOUT", "TALK_STRANGER_AGGRESSIVE", "TALK_LEADER", - "TALK_TRAIN_START" ] + "TALK_TRAIN_START", "TALK_STOLE_ITEM", "TALK_SEDATED" ] for topic_id in refered_ids: add_topic_by_chat(topics, topic_id) + # TALK_TRAIN_START is technically not a start id + start_topics = [ "TALK_RADIO", "TALK_LEADER", "TALK_FRIEND", "TALK_STOLE_ITEM", + "TALK_MISSION_DESCRIBE_URGENT", "TALK_SEDATED", "TALK_WAKE_UP", + "TALK_MUG", "TALK_STRANGER_AGGRESSIVE", "TALK_STRANGER_SCARED", + "TALK_STRANGER_WARY", "TALK_STRANGER_FRIENDLY", "TALK_STRANGER_NEUTRAL", + "TALK_SHELTER", "TALK_CAMP_OVERSEER" ] for talk_topic in dialogue: if not isinstance(talk_topic, dict): continue if talk_topic.get("type") == "npc": chat = talk_topic.get("chat") if chat: - add_topic_by_chat(topics, chat) + start_topics.append(chat) + add_topic_by_chat(topics, chat, topic_branches) continue if talk_topic.get("type") != "talk_topic": continue topic_id = talk_topic.get("id") + this_ids = [] if isinstance(topic_id, list): for loop_topic_id in topic_id: - add_topic_by_id(topics, loop_topic_id) + add_topic_by_id(topics, loop_topic_id, topic_branches, this_ids) else: - add_topic_by_id(topics, topic_id) + add_topic_by_id(topics, topic_id, topic_branches, this_ids) for response in talk_topic.get("responses", []): - parse_response(topics, response) + parse_response(topics, response, topic_branches, this_ids) repeated = talk_topic.get("repeat_responses", []) if isinstance(repeated, list): for repeated in talk_topic.get("repeat_responses", []): response = repeated.get("response", {}) - parse_response(topics, response) + parse_response(topics, response, topic_branches, this_ids) else: response = repeated.get("response", {}) - parse_response(topics, response) + parse_response(topics, response, topic_branches, this_ids) all_topics_valid = True for topic_id, topic_record in topics.items(): if not topic_record.get("valid", False): all_topics_valid = False - print("talk topic {} referenced in a response but not defined".format(topic_id)) + if topic_id in start_topics: + print("talk topic {} referenced in an NPC chat but not defined".format(topic_id)) + else: + print("talk topic {} referenced in a response but not defined".format(topic_id)) if not topic_record.get("in_response", False): all_topics_valid = False print("talk topic {} defined but not referenced in a response".format(topic_id)) if topic_id in OBSOLETE_TOPICS: all_topics_valid = False print("talk topic {} referenced despite being listed as obsolete.".format(topic_id)) - if all_topics_valid: - print("all topics referenced and defined.") + no_change = False + passes = 0 + while not no_change and passes < len(topic_branches): + no_change = True + passes += 1 + for topic_id in topic_branches: + branch_record = topic_branches[topic_id] + if branch_record["ends"] or not topics[topic_id].get("valid", False): + continue + for response_id in branch_record["responses"]: + if topic_branches.get(response_id, {}).get("ends", False): + # useful debug statement that I'm leaving here + # print("pass {} {} terminates by {}".format(passes, topic_id, response_id)) + branch_record["ends"] = True + no_change = False + break + + no_change = False + passes = 0 + while not no_change and passes < len(topic_branches): + no_change = True + passes += 1 + for topic_id in topic_branches: + # skip undefined topics + if not topics[topic_id].get("valid", False): + continue + branch_record = topic_branches[topic_id] + if branch_record["parent"] not in start_topics and topic_id in start_topics: + branch_record["parent"] = topic_id + no_change = False + if not branch_record["parent"]: + continue + for response_id in branch_record["responses"]: + response_record = topic_branches.get(response_id, {}) + if response_record.get("parent", False) in start_topics: + continue + response_record["parent"] = branch_record["parent"] + no_change = False + + # print(json.dumps(topic_branches, indent=2)) + skip_topics = ["TALK_DONE", "TALK_SIZE_UP", "TALK_LOOK_AT", "TALK_OPINION", "TALK_SHOUT"] + + for topic_id in topic_branches: + if topic_id in skip_topics or not topics[topic_id].get("valid"): + continue + branch_record = topic_branches[topic_id] + if not branch_record["ends"]: + print("{} does not reach TALK_DONE".format(topic_id)) + if not branch_record["parent"] in start_topics: + print("no path from a start topic to {}".format(topic_id)) validate(get_dialogue_from_json())