diff --git a/CMakeLists.txt b/CMakeLists.txt index 435e421c9e24e..30cd27aa63a00 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -11,14 +11,14 @@ SET(CMAKE_MODULE_PATH SET(CMAKE_TLS_VERIFY ON) # Build options -option(TILES "Build graphical tileset version." "OFF") -option(CURSES "Build curses version." "ON" ) -option(SOUND "Support for in-game sounds & music." "OFF") -option(BACKTRACE "Support for printing stack backtraces on crash" "ON" ) -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(TILES "Build graphical tileset version." "OFF") +option(CURSES "Build curses version." "ON") +option(SOUND "Support for in-game sounds & music." "OFF") +option(BACKTRACE "Support for printing stack backtraces on crash" "ON") +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(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") @@ -45,7 +45,7 @@ MESSAGE(STATUS "${PROJECT} build environment -- \n") MESSAGE(STATUS "Build realm is : ${CMAKE_SYSTEM_NAME} ${CMAKE_HOST_SYSTEM_PROCESSOR}") IF(NOT CMAKE_BUILD_TYPE) - set(CMAKE_BUILD_TYPE Debug) + set(CMAKE_BUILD_TYPE Debug) ENDIF(NOT CMAKE_BUILD_TYPE) if (NOT ${GIT_VERSION} MATCHES GIT-NOTFOUND) @@ -59,17 +59,17 @@ ENDIF(NOT ${GIT_VERSION} MATCHES GIT-NOTFOUND) #OS Check Placeholders. Will be used for BINDIST IF (${CMAKE_SYSTEM_NAME} MATCHES Linux) - SET(_OS_LINUX_ 1) + SET(_OS_LINUX_ 1) ENDIF (${CMAKE_SYSTEM_NAME} MATCHES Linux) IF (${CMAKE_SYSTEM_NAME} MATCHES FreeBSD) - SET(_OS_FREEBSD_ 1) + SET(_OS_FREEBSD_ 1) ENDIF (${CMAKE_SYSTEM_NAME} MATCHES FreeBSD) IF(${CMAKE_SYSTEM_NAME} MATCHES Darwin) - SET(_OS_DARWIN_ 1) - SET(LOCALIZE OFF) - MESSAGE(STATUS "Disable internationalization on Darwin as it is not supported") + SET(_OS_DARWIN_ 1) + SET(LOCALIZE OFF) + MESSAGE(STATUS "Disable internationalization on Darwin as it is not supported") ENDIF(${CMAKE_SYSTEM_NAME} MATCHES Darwin) include(CheckCXXCompilerFlag) @@ -82,60 +82,60 @@ include(CheckCXXCompilerFlag) #SET(CMAKE_SHARED_LIBRARY_CXX_FLAGS "${CMAKE_SHARED_LIBRARY_CXX_FLAGS} -m32") IF (NOT DYNAMIC_LINKING) - SET(CMAKE_FIND_LIBRARY_SUFFIXES ".a;.dll.a") - SET(BUILD_SHARED_LIBRARIES OFF) - check_cxx_compiler_flag (-static HAVE_STATIC_FLAG) - IF(HAVE_STATIC_FLAG) - SET(CMAKE_EXE_LINKER_FLAGS "${CMAKE_EXE_LINKER_FLAGS} -static") - ENDIF(HAVE_STATIC_FLAG) - # Workaround for cmake link library guesser - SET(CMAKE_EXE_LINK_DYNAMIC_C_FLAGS) # remove -Wl,-Bdynamic - SET(CMAKE_EXE_LINK_DYNAMIC_CXX_FLAGS) - SET(CMAKE_SHARED_LIBRARY_C_FLAGS) # remove -fPIC - SET(CMAKE_SHARED_LIBRARY_CXX_FLAGS) - SET(CMAKE_SHARED_LIBRARY_LINK_C_FLAGS) # remove -rdynamic - SET(CMAKE_SHARED_LIBRARY_LINK_CXX_FLAGS) + SET(CMAKE_FIND_LIBRARY_SUFFIXES ".a;.dll.a") + SET(BUILD_SHARED_LIBRARIES OFF) + check_cxx_compiler_flag (-static HAVE_STATIC_FLAG) + IF(HAVE_STATIC_FLAG) + SET(CMAKE_EXE_LINKER_FLAGS "${CMAKE_EXE_LINKER_FLAGS} -static") + ENDIF(HAVE_STATIC_FLAG) + # Workaround for cmake link library guesser + SET(CMAKE_EXE_LINK_DYNAMIC_C_FLAGS) # remove -Wl,-Bdynamic + SET(CMAKE_EXE_LINK_DYNAMIC_CXX_FLAGS) + SET(CMAKE_SHARED_LIBRARY_C_FLAGS) # remove -fPIC + SET(CMAKE_SHARED_LIBRARY_CXX_FLAGS) + SET(CMAKE_SHARED_LIBRARY_LINK_C_FLAGS) # remove -rdynamic + SET(CMAKE_SHARED_LIBRARY_LINK_CXX_FLAGS) ELSE (NOT DYNAMIC_LINKING) - IF(MINGW AND NOT CMAKE_CXX_COMPILER_ID MATCHES "Clang") - # Avoid depending on MinGW runtime DLLs - SET(CMAKE_EXE_LINKER_FLAGS "${CMAKE_EXE_LINKER_FLAGS} -static-libgcc -static-libstdc++") - ENDIF(MINGW AND NOT CMAKE_CXX_COMPILER_ID MATCHES "Clang") + IF(MINGW AND NOT CMAKE_CXX_COMPILER_ID MATCHES "Clang") + # Avoid depending on MinGW runtime DLLs + SET(CMAKE_EXE_LINKER_FLAGS "${CMAKE_EXE_LINKER_FLAGS} -static-libgcc -static-libstdc++") + ENDIF(MINGW AND NOT CMAKE_CXX_COMPILER_ID MATCHES "Clang") ENDIF (NOT DYNAMIC_LINKING) -#Sysem specific actions +# System specific actions IF (${CMAKE_SYSTEM_NAME} MATCHES Linux OR ${CMAKE_SYSTEM_NAME} MATCHES FreeBSD) IF(NOT DATA_PREFIX) - SET( DATA_PREFIX ${CMAKE_INSTALL_PREFIX}/share/cataclysm-dda) + SET( DATA_PREFIX ${CMAKE_INSTALL_PREFIX}/share/cataclysm-dda) ENDIF(NOT DATA_PREFIX) IF(NOT LOCALE_DIR) - SET( LOCALE_DIR ${CMAKE_INSTALL_PREFIX}/share/locale) + SET( LOCALE_DIR ${CMAKE_INSTALL_PREFIX}/share/locale) ENDIF(NOT LOCALE_DIR) IF(NOT BIN_PREFIX) - SET( BIN_PREFIX ${CMAKE_INSTALL_PREFIX}/bin) + SET( BIN_PREFIX ${CMAKE_INSTALL_PREFIX}/bin) ENDIF(NOT BIN_PREFIX) IF(NOT DESKTOP_ENTRY_PATH) - SET( DESKTOP_ENTRY_PATH ${CMAKE_INSTALL_PREFIX}/share/applications) + SET( DESKTOP_ENTRY_PATH ${CMAKE_INSTALL_PREFIX}/share/applications) ENDIF(NOT DESKTOP_ENTRY_PATH) IF(NOT PIXMAPS_ENTRY_PATH) - SET( PIXMAPS_ENTRY_PATH ${CMAKE_INSTALL_PREFIX}/share/icons/hicolor) + SET( PIXMAPS_ENTRY_PATH ${CMAKE_INSTALL_PREFIX}/share/icons/hicolor) ENDIF(NOT PIXMAPS_ENTRY_PATH) IF(NOT PIXMAPS_UNITY_ENTRY_PATH) - SET( PIXMAPS_UNITY_ENTRY_PATH ${CMAKE_INSTALL_PREFIX}/share/icons/ubuntu-mono-dark) + SET( PIXMAPS_UNITY_ENTRY_PATH ${CMAKE_INSTALL_PREFIX}/share/icons/ubuntu-mono-dark) ENDIF(NOT PIXMAPS_UNITY_ENTRY_PATH) IF(NOT MANPAGE_ENTRY_PATH) - SET( MANPAGE_ENTRY_PATH ${CMAKE_INSTALL_PREFIX}/share/man) + SET( MANPAGE_ENTRY_PATH ${CMAKE_INSTALL_PREFIX}/share/man) ENDIF(NOT MANPAGE_ENTRY_PATH) ENDIF (${CMAKE_SYSTEM_NAME} MATCHES Linux OR ${CMAKE_SYSTEM_NAME} MATCHES FreeBSD) IF (${CMAKE_SYSTEM_NAME} MATCHES Windows) IF(NOT DATA_PREFIX) - SET(DATA_PREFIX ${CMAKE_INSTALL_PREFIX}) + SET(DATA_PREFIX ${CMAKE_INSTALL_PREFIX}) ENDIF(NOT DATA_PREFIX) IF(NOT LOCALE_DIR) - SET(LOCALE_DIR ${CMAKE_INSTALL_PREFIX}) + SET(LOCALE_DIR ${CMAKE_INSTALL_PREFIX}) ENDIF(NOT LOCALE_DIR) IF(NOT BIN_PREFIX) - SET(BIN_PREFIX ${CMAKE_INSTALL_PREFIX}) + SET(BIN_PREFIX ${CMAKE_INSTALL_PREFIX}) ENDIF(NOT BIN_PREFIX) ENDIF (${CMAKE_SYSTEM_NAME} MATCHES Windows) @@ -144,20 +144,20 @@ MESSAGE(STATUS "${PROJECT_NAME} build options --\n") # Preset variables IF(NOT LANGUAGES) - SET (LANGUAGES de es_AR es_ES fr it_IT ja ko pt_BR ru zh_CN zh_TW) + SET (LANGUAGES de es_AR es_ES fr it_IT ja ko pt_BR ru zh_CN zh_TW) ENDIF(NOT LANGUAGES) IF (GIT_BINARY) - SET(GIT_EXECUTABLE ${GIT_BINARY}) + SET(GIT_EXECUTABLE ${GIT_BINARY}) ELSE (GIT_BINARY) - FIND_PACKAGE(Git) - IF (NOT GIT_FOUND) - MESSAGE(WARNING "Git binary not found. Build version will be set to NULL. Install Git package or use -DGIT_BINARY to set path to git binary.") - ENDIF (NOT GIT_FOUND) + FIND_PACKAGE(Git) + IF (NOT GIT_FOUND) + MESSAGE(WARNING "Git binary not found. Build version will be set to NULL. Install Git package or use -DGIT_BINARY to set path to git binary.") + ENDIF (NOT GIT_FOUND) ENDIF (GIT_BINARY) IF (PREFIX) - ADD_DEFINITIONS(-DPREFIX=${PREFIX}) + ADD_DEFINITIONS(-DPREFIX=${PREFIX}) ENDIF (PREFIX) # Can't compile curses and tiles build's at same time @@ -167,78 +167,79 @@ ENDIF(TILES) # Set build types and display info IF(CMAKE_BUILD_TYPE STREQUAL Debug) - MESSAGE("\n") - MESSAGE(STATUS "Build ${PROJECT} in development mode --\n") - MESSAGE(STATUS "Binaries will be located in: " ${CMAKE_SOURCE_DIR}) - SET(CMAKE_VERBOSE_MAKEFILE ON) - # Since CataclusmDDA does not respect PREFIX for development builds - # and has funny path handlers, we should create resulting Binaries - # in the source redectory - SET(CMAKE_RUNTIME_OUTPUT_DIRECTORY - ${CMAKE_SOURCE_DIR} - CACHE PATH "Single Directory for all Executables." - ) - SET(BIN_PREFIX ${CMAKE_SOURCE_DIR}) + MESSAGE("\n") + MESSAGE(STATUS "Build ${PROJECT} in development mode --\n") + MESSAGE(STATUS "Binaries will be located in: " ${CMAKE_SOURCE_DIR}) + SET(CMAKE_VERBOSE_MAKEFILE ON) + # Since CataclysmDDA does not respect PREFIX for development builds + # and has funny path handlers, we should create resulting Binaries + # in the source directory + SET(CMAKE_RUNTIME_OUTPUT_DIRECTORY + ${CMAKE_SOURCE_DIR} + CACHE PATH "Single Directory for all Executables." + ) + SET(BIN_PREFIX ${CMAKE_SOURCE_DIR}) ELSE (CMAKE_BUILD_TYPE STREQUAL Debug) - MESSAGE(STATUS "CMAKE_INSTALL_PREFIX : ${CMAKE_INSTALL_PREFIX}") - MESSAGE(STATUS "BIN_PREFIX : ${BIN_PREFIX}") - MESSAGE(STATUS "DATA_PREFIX : ${DATA_PREFIX}") + MESSAGE(STATUS "CMAKE_INSTALL_PREFIX : ${CMAKE_INSTALL_PREFIX}") + MESSAGE(STATUS "BIN_PREFIX : ${BIN_PREFIX}") + MESSAGE(STATUS "DATA_PREFIX : ${DATA_PREFIX}") IF(LOCALIZE) - MESSAGE(STATUS "LOCALE_PATH : ${LOCALE_DIR}") + MESSAGE(STATUS "LOCALE_PATH : ${LOCALE_DIR}") ENDIF(LOCALIZE) - MESSAGE(STATUS "DESKTOP_ENTRY_PATH : ${DESKTOP_ENTRY_PATH}") - MESSAGE(STATUS "PIXMAPS_ENTRY_PATH : ${PIXMAPS_ENTRY_PATH}") - MESSAGE(STATUS "PIXMAPS_UNITY_ENTRY_PATH : ${PIXMAPS_UNITY_ENTRY_PATH}") - MESSAGE(STATUS "MANPAGE_ENTRY_PATH : ${MANPAGE_ENTRY_PATH}\n") - ADD_DEFINITIONS(-DRELEASE) + MESSAGE(STATUS "DESKTOP_ENTRY_PATH : ${DESKTOP_ENTRY_PATH}") + MESSAGE(STATUS "PIXMAPS_ENTRY_PATH : ${PIXMAPS_ENTRY_PATH}") + MESSAGE(STATUS "PIXMAPS_UNITY_ENTRY_PATH : ${PIXMAPS_UNITY_ENTRY_PATH}") + MESSAGE(STATUS "MANPAGE_ENTRY_PATH : ${MANPAGE_ENTRY_PATH}\n") + ADD_DEFINITIONS(-DRELEASE) # Use PREFIX as storage of data,gfx, etc.. Usefull only on *nix OS. IF (PREFIX AND NOT WIN32) - ADD_DEFINITIONS(-DDATA_DIR_PREFIX) + ADD_DEFINITIONS(-DDATA_DIR_PREFIX) ENDIF (PREFIX AND NOT WIN32) ENDIF (CMAKE_BUILD_TYPE STREQUAL Debug) - MESSAGE(STATUS "GIT_BINARY : ${GIT_EXECUTABLE}") - MESSAGE(STATUS "DYNAMIC_LINKING : ${DYNAMIC_LINKING}") - MESSAGE(STATUS "TILES : ${TILES}") - MESSAGE(STATUS "CURSES : ${CURSES}") - MESSAGE(STATUS "SOUND : ${SOUND}") - MESSAGE(STATUS "BACKTRACE : ${BACKTRACE}") - MESSAGE(STATUS "LOCALIZE : ${LOCALIZE}") - MESSAGE(STATUS "USE_HOME_DIR : ${USE_HOME_DIR}\n") + MESSAGE(STATUS "GIT_BINARY : ${GIT_EXECUTABLE}") + MESSAGE(STATUS "DYNAMIC_LINKING : ${DYNAMIC_LINKING}") + MESSAGE(STATUS "TILES : ${TILES}") + MESSAGE(STATUS "CURSES : ${CURSES}") + MESSAGE(STATUS "SOUND : ${SOUND}") + MESSAGE(STATUS "BACKTRACE : ${BACKTRACE}") + MESSAGE(STATUS "LOCALIZE : ${LOCALIZE}") + MESSAGE(STATUS "USE_HOME_DIR : ${USE_HOME_DIR}\n") - MESSAGE(STATUS "LANGUAGES : ${LANGUAGES}\n") + MESSAGE(STATUS "LANGUAGES : ${LANGUAGES}\n") - MESSAGE(STATUS "See INSTALL file for details and more info --\n") + MESSAGE(STATUS "See INSTALL file for details and more info --\n") IF(MSVC) - if(CMAKE_SIZEOF_VOID_P EQUAL 8) - add_definitions(-D_AMD64_) - else() - add_definitions(-D_X86_) - endif() + if(CMAKE_SIZEOF_VOID_P EQUAL 8) + add_definitions(-D_AMD64_) + else() + add_definitions(-D_X86_) + endif() ELSE() - SET(CATA_WARNINGS - "-Werror -Wall -Wextra \ - -Wmissing-declarations \ - -Wold-style-cast \ - -Woverloaded-virtual \ - -Wpedantic") + SET(CATA_WARNINGS + "-Werror -Wall -Wextra \ + -Wmissing-declarations \ + -Wold-style-cast \ + -Woverloaded-virtual \ + -Wpedantic") IF(NOT CMAKE_CXX_COMPILER_ID MATCHES "Clang") - SET(CATA_WARNINGS "${CATA_WARNINGS} -Wsuggest-override") + SET(CATA_WARNINGS "${CATA_WARNINGS} -Wsuggest-override") ENDIF(NOT CMAKE_CXX_COMPILER_ID MATCHES "Clang") - # Compact the whitespace in the warning string - string(REGEX REPLACE "[\t ]+" " " CATA_WARNINGS "${CATA_WARNINGS}") - SET(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} ${CATA_WARNINGS}") - SET(CMAKE_CXX_FLAGS_DEBUG "-Og -g") + # Compact the whitespace in the warning string + string(REGEX REPLACE "[\t ]+" " " CATA_WARNINGS "${CATA_WARNINGS}") + SET(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} ${CATA_WARNINGS}") + SET(CMAKE_CXX_FLAGS_DEBUG "-Og -g") ENDIF() SET(CMAKE_CXX_STANDARD 14) # Force out-of-source build IF(${CMAKE_SOURCE_DIR} STREQUAL ${CMAKE_BINARY_DIR}) - MESSAGE(FATAL_ERROR - "This project requires an out of source build. Remove the file 'CMakeCache.txt' found in this directory before continuing, create a separate build directory and run 'cmake [options] ' from there.\nSee INSTALL file for details and more info\n" - ) + MESSAGE(FATAL_ERROR + "This project requires an out of source build. Remove the file 'CMakeCache.txt' found in this directory before continuing, create a separate build + directory and run 'cmake [options] ' from there.\nSee INSTALL file for details and more info\n" + ) ENDIF(${CMAKE_SOURCE_DIR} STREQUAL ${CMAKE_BINARY_DIR}) #SET(THREADS_USE_PTHREADS_WIN32 True) @@ -247,123 +248,125 @@ FIND_PACKAGE(Threads REQUIRED) # Check for build types and libraries IF(TILES) - # Find SDL, SDL_ttf & SDL_image for graphical install - MESSAGE(STATUS "Searching for SDL2 library --") - FIND_PACKAGE(SDL2) - IF(NOT SDL2_FOUND) - MESSAGE(FATAL_ERROR - "This project requires SDL2 to be installed to be compiled in graphical mode. Please install the SDL2 development libraries, or try compiling without the -DTILES=1 for a text only compilation.\nSee INSTALL file for details and more info\n" - ) - ENDIF(NOT SDL2_FOUND) - - IF (NOT DYNAMIC_LINKING) - # SDL, SDL_Image, SDL_ttf deps are required for static build - MESSAGE(STATUS "Searching for SDL deps libraries --") - FIND_PACKAGE(Freetype REQUIRED) - FIND_PACKAGE(PNG REQUIRED) - FIND_PACKAGE(JPEG REQUIRED) - FIND_PACKAGE(ZLIB REQUIRED) - FIND_PACKAGE(BZip2 REQUIRED) - ENDIF (NOT DYNAMIC_LINKING) - - MESSAGE(STATUS "Searching for SDL2_image library --") - - MESSAGE(STATUS "Searching for SDL2_TTF library --") - FIND_PACKAGE(SDL2_ttf) - IF(NOT SDL2_TTF_FOUND) - MESSAGE(FATAL_ERROR - "This project requires SDL2_ttf to be installed to be compiled in graphical mode. Please install the SDL2_ttf development libraries, or try compiling without the -DTILES=1 for a text only compilation.\nSee INSTALL file for details and moreinfo\n" - ) - ENDIF(NOT SDL2_TTF_FOUND) - - MESSAGE(STATUS "Searching for SDL2_image library --\n") - FIND_PACKAGE(SDL2_image) - IF(NOT SDL2_IMAGE_FOUND) - MESSAGE(FATAL_ERROR - "This project requires SDL2_image to be installed to be compiled in graphical mode. Please install the SDL2_image development libraries, or try compiling without the -DTILES=1 for a text only compilation.\nSee INSTALL file for details and more info\n" - ) - ENDIF(NOT SDL2_IMAGE_FOUND) - ADD_DEFINITIONS(-DTILES) + # Find SDL, SDL_ttf & SDL_image for graphical install + MESSAGE(STATUS "Searching for SDL2 library --") + FIND_PACKAGE(SDL2) + IF(NOT SDL2_FOUND) + MESSAGE(FATAL_ERROR + "This project requires SDL2 to be installed to be compiled in graphical mode. Please install the SDL2 development libraries, or try compiling + without the -DTILES=1 for a text only compilation.\nSee INSTALL file for details and more info\n" + ) + ENDIF(NOT SDL2_FOUND) + + IF (NOT DYNAMIC_LINKING) + # SDL, SDL_Image, SDL_ttf deps are required for static build + MESSAGE(STATUS "Searching for SDL deps libraries --") + FIND_PACKAGE(Freetype REQUIRED) + FIND_PACKAGE(PNG REQUIRED) + FIND_PACKAGE(JPEG REQUIRED) + FIND_PACKAGE(ZLIB REQUIRED) + FIND_PACKAGE(BZip2 REQUIRED) + ENDIF (NOT DYNAMIC_LINKING) + + MESSAGE(STATUS "Searching for SDL2_TTF library --") + FIND_PACKAGE(SDL2_ttf) + IF(NOT SDL2_TTF_FOUND) + MESSAGE(FATAL_ERROR + "This project requires SDL2_ttf to be installed to be compiled in graphical mode. Please install the SDL2_ttf development libraries, or try + compiling without the -DTILES=1 for a text only compilation.\nSee INSTALL file for details and moreinfo\n" + ) + ENDIF(NOT SDL2_TTF_FOUND) + + MESSAGE(STATUS "Searching for SDL2_image library --\n") + FIND_PACKAGE(SDL2_image) + IF(NOT SDL2_IMAGE_FOUND) + MESSAGE(FATAL_ERROR + "This project requires SDL2_image to be installed to be compiled in graphical mode. Please install the SDL2_image development libraries, or try + compiling without the -DTILES=1 for a text only compilation.\nSee INSTALL file for details and more info\n" + ) + ENDIF(NOT SDL2_IMAGE_FOUND) + ADD_DEFINITIONS(-DTILES) ENDIF(TILES) IF(CURSES) - # Find the ncurses library for a text based compile - MESSAGE(STATUS "Searching for Curses library --\n") - SET(CURSES_NEED_NCURSES TRUE) - SET(CURSES_NEED_WIDE TRUE) - FIND_PACKAGE(Curses) - IF(NOT CURSES_FOUND) - MESSAGE(FATAL_ERROR - "This project requires ncurses to be installed to be compiled in text only mode. Please install the ncurses development libraries, or try compiling with the -DTILES=1 for a graphical compilation.\nSee INSTALL file for details and more info\n" - ) - ENDIF(NOT CURSES_FOUND) + # Find the ncurses library for a text based compile + MESSAGE(STATUS "Searching for Curses library --\n") + SET(CURSES_NEED_NCURSES TRUE) + SET(CURSES_NEED_WIDE TRUE) + FIND_PACKAGE(Curses) + IF(NOT CURSES_FOUND) + MESSAGE(FATAL_ERROR + "This project requires ncurses to be installed to be compiled in text only mode. Please install the ncurses development libraries, or try compiling + with the -DTILES=1 for a graphical compilation.\nSee INSTALL file for details and more info\n" + ) + ENDIF(NOT CURSES_FOUND) ENDIF(CURSES) IF(SOUND) - # You need TILES to be able to use SOUND - IF(NOT TILES) - MESSAGE(FATAL_ERROR - "You must enable graphical support with -DTILES=1 to be able to enable sound support.\nSee INSTALL file for details and more info\n" - ) - ENDIF(NOT TILES) - - # Sound requires SDL_mixer library - MESSAGE(STATUS "Searching for SDL2_mixer library --\n") - FIND_PACKAGE(SDL2_mixer) - IF(NOT SDL2_MIXER_FOUND) - MESSAGE(FATAL_ERROR - "You need the SDL2_mixer development library to be able to compile with sound enabled.\nSee INSTALL file for details and more info\n" - ) - ENDIF(NOT SDL2_MIXER_FOUND) + # You need TILES to be able to use SOUND + IF(NOT TILES) + MESSAGE(FATAL_ERROR + "You must enable graphical support with -DTILES=1 to be able to enable sound support.\nSee INSTALL file for details and more info\n" + ) + ENDIF(NOT TILES) + + # Sound requires SDL_mixer library + MESSAGE(STATUS "Searching for SDL2_mixer library --\n") + FIND_PACKAGE(SDL2_mixer) + IF(NOT SDL2_MIXER_FOUND) + MESSAGE(FATAL_ERROR + "You need the SDL2_mixer development library to be able to compile with sound enabled.\nSee INSTALL file for details and more info\n" + ) + ENDIF(NOT SDL2_MIXER_FOUND) ENDIF(SOUND) IF(BACKTRACE) - ADD_DEFINITIONS(-DBACKTRACE) + ADD_DEFINITIONS(-DBACKTRACE) ENDIF(BACKTRACE) # Ok. Now create build and install recipes IF(LOCALIZE) - IF(WIN32) - FIND_PACKAGE(Libintl) - IF(NOT LIBINTL_FOUND) - MESSAGE(FATAL_ERROR - "You need the libintl development library to be able to compile with Localize support.\nSee INSTALL file for details and more info\n" - ) - ENDIF(NOT LIBINTL_FOUND) - FIND_PACKAGE(Iconv) - IF(NOT ICONV_FOUND) - MESSAGE(FATAL_ERROR - "You need the iconv development library to be able to compile with Localize support.\nSee INSTALL file for details and more info\n" - ) - ENDIF(NOT ICONV_FOUND) - ENDIF(WIN32) - add_subdirectory(lang) - ADD_DEFINITIONS(-DLOCALIZE) + IF(WIN32) + FIND_PACKAGE(Libintl) + IF(NOT LIBINTL_FOUND) + MESSAGE(FATAL_ERROR + "You need the libintl development library to be able to compile with Localize support.\nSee INSTALL file for details and more info\n" + ) + ENDIF(NOT LIBINTL_FOUND) + FIND_PACKAGE(Iconv) + IF(NOT ICONV_FOUND) + MESSAGE(FATAL_ERROr + "You need the iconv development library to be able to compile with Localize support.\nSee INSTALL file for details and more info\n" + ) + ENDIF(NOT ICONV_FOUND) + ENDIF(WIN32) + add_subdirectory(lang) + ADD_DEFINITIONS(-DLOCALIZE) ENDIF(LOCALIZE) IF(USE_HOME_DIR) - ADD_DEFINITIONS(-DUSE_HOME_DIR) + ADD_DEFINITIONS(-DUSE_HOME_DIR) ENDIF(USE_HOME_DIR) add_subdirectory(src) add_subdirectory(data) if (NOT MSVC) - add_subdirectory(src/chkjson) + add_subdirectory(src/chkjson) endif() add_subdirectory(tests) if (CATA_CLANG_TIDY_PLUGIN) - add_subdirectory(tools/clang-tidy-plugin) + add_subdirectory(tools/clang-tidy-plugin) endif() CONFIGURE_FILE( - "${CMAKE_CURRENT_SOURCE_DIR}/cmake_uninstall.cmake.in" - "${CMAKE_CURRENT_BINARY_DIR}/cmake_uninstall.cmake" - IMMEDIATE @ONLY + "${CMAKE_CURRENT_SOURCE_DIR}/cmake_uninstall.cmake.in" + "${CMAKE_CURRENT_BINARY_DIR}/cmake_uninstall.cmake" + IMMEDIATE @ONLY ) ADD_CUSTOM_TARGET(uninstall - "${CMAKE_COMMAND}" - -P "${CMAKE_CURRENT_BINARY_DIR}/cmake_uninstall.cmake" + "${CMAKE_COMMAND}" + -P "${CMAKE_CURRENT_BINARY_DIR}/cmake_uninstall.cmake" ) find_program(CCACHE_FOUND ccache) diff --git a/build-scripts/mod_test_blacklist b/build-scripts/mod_test_blacklist index 2ed8c7cc710c6..c08830f779ff7 100644 --- a/build-scripts/mod_test_blacklist +++ b/build-scripts/mod_test_blacklist @@ -1,15 +1,10 @@ aftershock blazemod -crazy_cataclysm crt_expansion -FIC_Weapons generic_guns Graphical_Overmap mapgen_demo -modular_turrets more_locations -my_sweet_cataclysm -national_guard_camp no_medieval_items sees_player_hitbutton sees_player_retro diff --git a/data/CMakeLists.txt b/data/CMakeLists.txt index 9ef2bc3a24ac0..41fac38d3ec55 100644 --- a/data/CMakeLists.txt +++ b/data/CMakeLists.txt @@ -1,39 +1,39 @@ # Cataclysm data files -cmake_minimum_required(VERSION 2.8.12) +cmake_minimum_required(VERSION 3.1.4) SET(CATACLYSM_DATA_DIRS - ${CMAKE_SOURCE_DIR}/data/font - ${CMAKE_SOURCE_DIR}/data/json - ${CMAKE_SOURCE_DIR}/data/mods - ${CMAKE_SOURCE_DIR}/data/names - ${CMAKE_SOURCE_DIR}/data/raw - ${CMAKE_SOURCE_DIR}/data/motd - ${CMAKE_SOURCE_DIR}/data/credits - ${CMAKE_SOURCE_DIR}/data/title + ${CMAKE_SOURCE_DIR}/data/font + ${CMAKE_SOURCE_DIR}/data/json + ${CMAKE_SOURCE_DIR}/data/mods + ${CMAKE_SOURCE_DIR}/data/names + ${CMAKE_SOURCE_DIR}/data/raw + ${CMAKE_SOURCE_DIR}/data/motd + ${CMAKE_SOURCE_DIR}/data/credits + ${CMAKE_SOURCE_DIR}/data/title ) IF(SOUND) - SET(CATACLYSM_DATA_DIRS - ${CATACLYSM_DATA_DIRS} - ${CMAKE_SOURCE_DIR}/data/sound - ) + SET(CATACLYSM_DATA_DIRS + ${CATACLYSM_DATA_DIRS} + ${CMAKE_SOURCE_DIR}/data/sound + ) ENDIF(SOUND) IF(TILES) - SET(CATACLYSM_DATA_DIRS - ${CATACLYSM_DATA_DIRS} - ${CMAKE_SOURCE_DIR}/gfx - ) + SET(CATACLYSM_DATA_DIRS + ${CATACLYSM_DATA_DIRS} + ${CMAKE_SOURCE_DIR}/gfx + ) ENDIF(TILES) SET(CATACLYSM_DATA_FILES - ${CMAKE_SOURCE_DIR}/data/changelog.txt - ${CMAKE_SOURCE_DIR}/data/cataicon.ico - ${CMAKE_SOURCE_DIR}/data/fontdata.json - ${CMAKE_SOURCE_DIR}/LICENSE.txt + ${CMAKE_SOURCE_DIR}/data/changelog.txt + ${CMAKE_SOURCE_DIR}/data/cataicon.ico + ${CMAKE_SOURCE_DIR}/data/fontdata.json + ${CMAKE_SOURCE_DIR}/LICENSE.txt ) IF(RELEASE) - install(DIRECTORY ${CATACLYSM_DATA_DIRS} DESTINATION ${DATA_PREFIX}) - install(FILES ${CATACLYSM_DATA_FILES} DESTINATION ${DATA_PREFIX}) + install(DIRECTORY ${CATACLYSM_DATA_DIRS} DESTINATION ${DATA_PREFIX}) + install(FILES ${CATACLYSM_DATA_FILES} DESTINATION ${DATA_PREFIX}) ENDIF(RELEASE) diff --git a/data/json/flags.json b/data/json/flags.json index d61ab7c6c3ea1..b95695769f0ec 100644 --- a/data/json/flags.json +++ b/data/json/flags.json @@ -7,6 +7,7 @@ }, { "id": "EFFECT_INVISIBLE", + "context": [ ], "type": "json_flag" }, { @@ -70,6 +71,7 @@ }, { "id": "EFFECT_NIGHT_VISION", + "context": [ ], "type": "json_flag" }, { @@ -144,6 +146,7 @@ { "id": "ETHEREAL_ITEM", "type": "json_flag", + "context": [ ], "info": "This item disappears as soon as its timer runs out whether it is food or not." }, { @@ -680,38 +683,47 @@ }, { "id": "EFFECT_FEATHER_FALL", + "context": [ ], "type": "json_flag" }, { "id": "EFFECT_BIO_IMMUNE", + "context": [ ], "type": "json_flag" }, { "id": "EFFECT_BASH_IMMUNE", + "context": [ ], "type": "json_flag" }, { "id": "EFFECT_CUT_IMMUNE", + "context": [ ], "type": "json_flag" }, { "id": "EFFECT_ACID_IMMUNE", + "context": [ ], "type": "json_flag" }, { "id": "EFFECT_STAB_IMMUNE", + "context": [ ], "type": "json_flag" }, { "id": "EFFECT_HEAT_IMMUNE", + "context": [ ], "type": "json_flag" }, { "id": "EFFECT_COLD_IMMUNE", + "context": [ ], "type": "json_flag" }, { "id": "ELECTRIC_IMMUNE", + "context": [ ], "type": "json_flag" }, { diff --git a/data/json/item_actions.json b/data/json/item_actions.json index 086813a01f0e0..6ef8357bfa6c1 100644 --- a/data/json/item_actions.json +++ b/data/json/item_actions.json @@ -1024,6 +1024,11 @@ "id": "place_monster", "name": "Activate" }, + { + "type": "item_action", + "id": "place_npc", + "name": "Activate" + }, { "type": "item_action", "id": "place_trap", diff --git a/data/json/itemgroups/SUS/domestic.json b/data/json/itemgroups/SUS/domestic.json index aa011cf9667f9..2e6c025c0863d 100644 --- a/data/json/itemgroups/SUS/domestic.json +++ b/data/json/itemgroups/SUS/domestic.json @@ -607,5 +607,37 @@ { "item": "seasoning_italian", "prob": 65 }, { "item": "seasoning_salt", "prob": 65 } ] + }, + { + "id": "SUS_bathroom_toiletries", + "type": "item_group", + "//": "SUS item groups are collections that contain a reasonable realistic distribution of items that might spawn in a given storage furniture.", + "//2": "This is a category for all the items which appear in bathrooms, which are NOT immediately useful medicines. This list is created in part to not ruin player's chances of finding antibiotics, antifungals and asprin, as it suppliments the current bathroom drops instead of replacing. Item probabilities are loosely based on how likely families would take an item with them when evacuating.", + "subtype": "collection", + "entries": [ + { "item": "soap_holder", "prob": 40 }, + { "item": "soap", "count": [ 1, 4 ], "prob": 60 }, + { "item": "bleach", "prob": 15 }, + { "item": "ammonia", "prob": 20 }, + { "item": "razor_shaving", "count": [ 1, 2 ], "prob": 75 }, + { "item": "shavingkit", "prob": 1 }, + { "item": "mirror", "prob": 25 }, + { "item": "toothbrush_plain", "count": [ 1, 3 ], "prob": 45 }, + { "item": "hairbrush", "count": [ 1, 2 ], "prob": 60 }, + { "item": "curler_hair", "prob": 25 }, + { "item": "string_floss", "count": [ 1, 2 ], "prob": 50 }, + { "item": "comb_pocket", "count": [ 1, 2 ], "prob": 55 }, + { "item": "plunger_toilet", "prob": 90 }, + { "item": "plunger_futuristic", "prob": 20 }, + { "item": "cu_pipe", "prob": 10 }, + { "item": "hose", "prob": 10 }, + { "item": "sponge", "count": [ 1, 3 ], "prob": 75 }, + { "item": "candle", "count": [ 1, 2 ], "prob": 20 }, + { "item": "matches", "prob": 10 }, + { "item": "toilet_paper", "prob": 80 }, + { "item": "hair_dryer", "prob": 60 }, + { "item": "curling_iron", "prob": 50 }, + { "item": "brush_toilet", "prob": 75 } + ] } ] diff --git a/data/json/itemgroups/SUS/garage.json b/data/json/itemgroups/SUS/garage.json new file mode 100644 index 0000000000000..c00aa5f661177 --- /dev/null +++ b/data/json/itemgroups/SUS/garage.json @@ -0,0 +1,28 @@ +[ + { + "id": "SUS_welding_gear", + "type": "item_group", + "//": "SUS item groups are collections that contain a reasonable realistic distribution of items that might spawn in a given storage furniture.", + "//2": "This group is for a rack of welding gear.", + "subtype": "collection", + "entries": [ + { + "distribution": [ + { + "collection": [ + { "item": "oxy_torch" }, + { "item": "weldtank", "count": [ 1, 3 ], "prob": 80 }, + { "item": "tinyweldtank", "count": [ 1, 3 ], "prob": 60 } + ], + "prob": 30 + }, + { + "collection": [ { "item": "welder" }, { "item": "medium_plus_battery_cell", "count": [ 1, 3 ], "prob": 80 } ], + "prob": 70 + } + ] + }, + { "distribution": [ { "item": "welding_mask", "prob": 70 }, { "item": "goggles_welding", "prob": 70 } ] } + ] + } +] diff --git a/data/json/itemgroups/clothing.json b/data/json/itemgroups/clothing.json index c9bd632092ddd..15d24bf031e2e 100644 --- a/data/json/itemgroups/clothing.json +++ b/data/json/itemgroups/clothing.json @@ -94,14 +94,20 @@ "items": [ { "group": "clothing_soldier_shirt" }, { "item": "jacket_army" }, + { "item": "elbow_pads", "prob": 10 }, { "item": "pants_army" }, + { "item": "knee_pads", "prob": 85 }, { "item": "boots_combat" }, - { "item": "helmet_army", "prob": 20 }, - { "item": "gloves_tactical", "prob": 10 }, - { "item": "elbow_pads", "prob": 10 }, + { "item": "helmet_army", "prob": 80 }, + { "item": "gloves_tactical", "prob": 60 }, { "group": "clothing_tactical_leg", "prob": 15 }, { "group": "clothing_tactical_torso", "prob": 15 }, - { "group": "underwear" }, + { + "distribution": [ + { "collection": [ { "item": "sports_bra" }, { "item": "boy_shorts" } ] }, + { "distribution": [ { "item": "briefs" }, { "item": "boxer_briefs" }, { "item": "boxer_shorts" } ] } + ] + }, { "distribution": [ { "item": "socks", "prob": 95 }, { "item": "socks_wool", "prob": 5 } ] }, { "distribution": [ @@ -123,14 +129,20 @@ "items": [ { "group": "clothing_soldier_shirt" }, { "item": "winter_jacket_army" }, + { "item": "elbow_pads", "prob": 10 }, { "item": "winter_pants_army" }, + { "item": "knee_pads", "prob": 85 }, { "item": "boots_combat" }, - { "collection": [ { "item": "helmet_army" }, { "item": "helmet_liner" } ], "prob": 20 }, - { "collection": [ { "item": "gloves_liner" }, { "item": "winter_gloves_army" } ], "prob": 40 }, - { "item": "elbow_pads", "prob": 10 }, + { "collection": [ { "item": "helmet_army" }, { "item": "helmet_liner" } ], "prob": 80 }, + { "collection": [ { "item": "gloves_liner" }, { "item": "winter_gloves_army" } ], "prob": 80 }, { "group": "clothing_tactical_leg", "prob": 15 }, { "group": "clothing_tactical_torso", "prob": 15 }, - { "group": "underwear" }, + { + "distribution": [ + { "collection": [ { "item": "sports_bra" }, { "item": "boy_shorts" } ] }, + { "distribution": [ { "item": "briefs" }, { "item": "boxer_briefs" }, { "item": "boxer_shorts" } ] } + ] + }, { "distribution": [ { "item": "socks", "prob": 10 }, { "item": "socks_wool", "prob": 90 } ] }, { "distribution": [ @@ -259,7 +271,7 @@ "id": "clothing_tactical_leg", "type": "item_group", "//": "Tactical gear that can be strapped to the legs", - "items": [ [ "knee_pads", 100 ], [ "legpouch_large", 100 ], [ "legrig", 100 ] ] + "items": [ [ "legpouch_large", 100 ], [ "legrig", 100 ] ] }, { "id": "clothing_tactical_torso", @@ -522,6 +534,68 @@ { "group": "earrings_platinum", "prob": 10 } ] }, + { + "id": "cufflinks_silver", + "type": "item_group", + "items": [ + [ "cufflinks", 50 ], + [ "cufflinks_intricate", 50 ], + [ "citrine_silver_cufflinks", 50 ], + [ "diamond_silver_cufflinks", 50 ], + [ "emerald_silver_cufflinks", 50 ], + [ "peridot_silver_cufflinks", 50 ], + [ "amethyst_silver_cufflinks", 50 ], + [ "sapphire_silver_cufflinks", 50 ], + [ "aquamarine_silver_cufflinks", 50 ], + [ "blue_topaz_silver_cufflinks", 50 ], + [ "tourmaline_silver_cufflinks", 50 ], + [ "alexandrite_silver_cufflinks", 50 ], + [ "pearl_silver_cufflinks", 50 ], + [ "opal_silver_cufflinks", 50 ], + [ "ruby_silver_cufflinks", 50 ], + [ "garnet_silver_cufflinks", 50 ] + ] + }, + { + "id": "cufflinks_gold", + "type": "item_group", + "items": [ + [ "citrine_gold_cufflinks", 50 ], + [ "diamond_gold_cufflinks", 50 ], + [ "emerald_gold_cufflinks", 50 ], + [ "peridot_gold_cufflinks", 50 ], + [ "amethyst_gold_cufflinks", 50 ], + [ "sapphire_gold_cufflinks", 50 ], + [ "aquamarine_gold_cufflinks", 50 ], + [ "blue_topaz_gold_cufflinks", 50 ], + [ "tourmaline_gold_cufflinks", 50 ], + [ "alexandrite_gold_cufflinks", 50 ], + [ "pearl_gold_cufflinks", 50 ], + [ "opal_gold_cufflinks", 50 ], + [ "ruby_gold_cufflinks", 50 ], + [ "garnet_gold_cufflinks", 50 ] + ] + }, + { + "id": "cufflinks_platinum", + "type": "item_group", + "items": [ + [ "citrine_platinum_cufflinks", 50 ], + [ "diamond_platinum_cufflinks", 50 ], + [ "emerald_platinum_cufflinks", 50 ], + [ "peridot_platinum_cufflinks", 50 ], + [ "amethyst_platinum_cufflinks", 50 ], + [ "sapphire_platinum_cufflinks", 50 ], + [ "aquamarine_platinum_cufflinks", 50 ], + [ "blue_topaz_platinum_cufflinks", 50 ], + [ "tourmaline_platinum_cufflinks", 50 ], + [ "alexandrite_platinum_cufflinks", 50 ], + [ "pearl_platinum_cufflinks", 50 ], + [ "opal_platinum_cufflinks", 50 ], + [ "ruby_platinum_cufflinks", 50 ], + [ "garnet_platinum_cufflinks", 50 ] + ] + }, { "id": "dental_grills", "type": "item_group", @@ -542,6 +616,129 @@ [ "garnet_dental_grill", 50 ] ] }, + { + "id": "tiaras_silver", + "type": "item_group", + "items": [ + [ "citrine_silver_tiara", 50 ], + [ "diamond_silver_tiara", 50 ], + [ "emerald_silver_tiara", 50 ], + [ "peridot_silver_tiara", 50 ], + [ "amethyst_silver_tiara", 50 ], + [ "sapphire_silver_tiara", 50 ], + [ "aquamarine_silver_tiara", 50 ], + [ "blue_topaz_silver_tiara", 50 ], + [ "tourmaline_silver_tiara", 50 ], + [ "alexandrite_silver_tiara", 50 ], + [ "pearl_silver_tiara", 50 ], + [ "opal_silver_tiara", 50 ], + [ "ruby_silver_tiara", 50 ], + [ "garnet_silver_tiara", 50 ] + ] + }, + { + "id": "tiaras_gold", + "type": "item_group", + "items": [ + [ "citrine_gold_tiara", 50 ], + [ "diamond_gold_tiara", 50 ], + [ "emerald_gold_tiara", 50 ], + [ "peridot_gold_tiara", 50 ], + [ "amethyst_gold_tiara", 50 ], + [ "sapphire_gold_tiara", 50 ], + [ "aquamarine_gold_tiara", 50 ], + [ "blue_topaz_gold_tiara", 50 ], + [ "tourmaline_gold_tiara", 50 ], + [ "alexandrite_gold_tiara", 50 ], + [ "pearl_gold_tiara", 50 ], + [ "opal_gold_tiara", 50 ], + [ "ruby_gold_tiara", 50 ], + [ "garnet_gold_tiara", 50 ] + ] + }, + { + "id": "tiaras_platinum", + "type": "item_group", + "items": [ + [ "citrine_platinum_tiara", 50 ], + [ "diamond_platinum_tiara", 50 ], + [ "emerald_platinum_tiara", 50 ], + [ "peridot_platinum_tiara", 50 ], + [ "amethyst_platinum_tiara", 50 ], + [ "sapphire_platinum_tiara", 50 ], + [ "aquamarine_platinum_tiara", 50 ], + [ "blue_topaz_platinum_tiara", 50 ], + [ "tourmaline_platinum_tiara", 50 ], + [ "alexandrite_platinum_tiara", 50 ], + [ "pearl_platinum_tiara", 50 ], + [ "opal_platinum_tiara", 50 ], + [ "ruby_platinum_tiara", 50 ], + [ "garnet_platinum_tiara", 50 ] + ] + }, + { + "id": "pendant_necklaces_silver", + "type": "item_group", + "items": [ + [ "silver_necklace", 50 ], + [ "citrine_silver_pendant_necklace", 50 ], + [ "diamond_silver_pendant_necklace", 50 ], + [ "emerald_silver_pendant_necklace", 50 ], + [ "peridot_silver_pendant_necklace", 50 ], + [ "amethyst_silver_pendant_necklace", 50 ], + [ "sapphire_silver_pendant_necklace", 50 ], + [ "aquamarine_silver_pendant_necklace", 50 ], + [ "blue_topaz_silver_pendant_necklace", 50 ], + [ "tourmaline_silver_pendant_necklace", 50 ], + [ "alexandrite_silver_pendant_necklace", 50 ], + [ "pearl_silver_pendant_necklace", 50 ], + [ "opal_silver_pendant_necklace", 50 ], + [ "ruby_silver_pendant_necklace", 50 ], + [ "garnet_silver_pendant_necklace", 50 ] + ] + }, + { + "id": "pendant_necklaces_gold", + "type": "item_group", + "items": [ + [ "gold_necklace", 50 ], + [ "citrine_gold_pendant_necklace", 50 ], + [ "diamond_gold_pendant_necklace", 50 ], + [ "emerald_gold_pendant_necklace", 50 ], + [ "peridot_gold_pendant_necklace", 50 ], + [ "amethyst_gold_pendant_necklace", 50 ], + [ "sapphire_gold_pendant_necklace", 50 ], + [ "aquamarine_gold_pendant_necklace", 50 ], + [ "blue_topaz_gold_pendant_necklace", 50 ], + [ "tourmaline_gold_pendant_necklace", 50 ], + [ "alexandrite_gold_pendant_necklace", 50 ], + [ "pearl_gold_pendant_necklace", 50 ], + [ "opal_gold_pendant_necklace", 50 ], + [ "ruby_gold_pendant_necklace", 50 ], + [ "garnet_gold_pendant_necklace", 50 ] + ] + }, + { + "id": "pendant_necklaces_platinum", + "type": "item_group", + "items": [ + [ "platinum_necklace", 50 ], + [ "citrine_platinum_pendant_necklace", 50 ], + [ "diamond_platinum_pendant_necklace", 50 ], + [ "emerald_platinum_pendant_necklace", 50 ], + [ "peridot_platinum_pendant_necklace", 50 ], + [ "amethyst_platinum_pendant_necklace", 50 ], + [ "sapphire_platinum_pendant_necklace", 50 ], + [ "aquamarine_platinum_pendant_necklace", 50 ], + [ "blue_topaz_platinum_pendant_necklace", 50 ], + [ "tourmaline_platinum_pendant_necklace", 50 ], + [ "alexandrite_platinum_pendant_necklace", 50 ], + [ "pearl_platinum_pendant_necklace", 50 ], + [ "opal_platinum_pendant_necklace", 50 ], + [ "ruby_platinum_pendant_necklace", 50 ], + [ "garnet_platinum_pendant_necklace", 50 ] + ] + }, { "id": "earrings_silver", "type": "item_group", @@ -921,6 +1118,7 @@ [ "snuggie", 5 ], [ "flyer", 10 ], [ "socks", 70 ], + [ "socks_ankle", 50 ], [ "socks_wool", 30 ], [ "pocketwatch", 5 ], [ "flask_hip", 2 ], @@ -966,6 +1164,7 @@ "items": [ [ "sneakers", 80 ], [ "socks", 70 ], + [ "socks_ankle", 50 ], [ "tights", 20 ], [ "stockings", 20 ], [ "knee_high_boots", 20 ], @@ -1253,7 +1452,7 @@ { "type": "item_group", "id": "shoestore_accessories", - "items": [ [ "socks", 100 ], [ "thermal_socks", 25 ], [ "socks_wool", 50 ], [ "string_36", 200 ] ] + "items": [ [ "socks", 100 ], [ "socks_ankle", 75 ], [ "thermal_socks", 25 ], [ "socks_wool", 50 ], [ "string_36", 200 ] ] }, { "type": "item_group", @@ -2157,26 +2356,6 @@ [ "survnote", 30 ] ] }, - { - "type": "item_group", - "id": "bio_op_face", - "items": [ [ "glasses_bal", 40 ], [ "mask_filter", 30 ], [ "mask_bal", 30 ], [ "mask_gas", 40 ] ] - }, - { - "type": "item_group", - "id": "bio_op_torso", - "items": [ [ "dragonskin", 50 ], [ "winter_jacket_army", 10 ], [ "modularvestceramic", 40 ], [ "modularvestkevlar", 20 ] ] - }, - { - "type": "item_group", - "id": "bio_op_boots", - "items": [ [ "boots_combat", 1 ] ] - }, - { - "type": "item_group", - "id": "bio_op_gloves", - "items": [ [ "gloves_tactical", 60 ], [ "gloves_fingerless", 40 ], [ "winter_gloves_army", 40 ] ] - }, { "type": "item_group", "id": "museum_armor", @@ -2377,6 +2556,7 @@ [ "boy_shorts", 25 ], [ "bra", 25 ], [ "socks", 45 ], + [ "socks_ankle", 30 ], [ "stockings", 20 ], [ "hat_cotton", 35 ], [ "copper_bracelet", 10 ], @@ -2576,7 +2756,12 @@ "type": "item_group", "//": "unisex socks", "subtype": "distribution", - "items": [ { "item": "socks", "prob": 70 }, { "item": "socks_wool", "prob": 30 }, { "item": "thermal_socks", "prob": 10 } ] + "items": [ + { "item": "socks", "prob": 70 }, + { "item": "socks_ankle", "prob": 50 }, + { "item": "socks_wool", "prob": 30 }, + { "item": "thermal_socks", "prob": 10 } + ] }, { "id": "scarfs_unisex", @@ -3043,6 +3228,127 @@ "subtype": "distribution", "items": [ { "item": "heels", "prob": 100 } ] }, + { + "id": "accessory_ring", + "type": "item_group", + "//": "decorative finger rings worn by people.", + "subtype": "distribution", + "items": [ + { "item": "ring_wedding", "prob": 50, "count": [ 1, 2 ] }, + { "item": "copper_ring", "prob": 80, "count": [ 1, 3 ] }, + { "item": "silver_ring", "prob": 50, "count": [ 1, 3 ] }, + { "item": "gold_ring", "prob": 40, "count": [ 1, 3 ] }, + { "item": "diamond_ring", "prob": 10 }, + { "item": "platinum_ring", "prob": 10 } + ] + }, + { + "id": "accessory_earring", + "type": "item_group", + "//": "decorative earrings and miscellaneous ear accessories worn by people.", + "subtype": "distribution", + "items": [ + { "group": "earrings_silver", "prob": 70 }, + { "group": "earrings_gold", "prob": 25 }, + { "group": "earrings_platinum", "prob": 5 } + ] + }, + { + "id": "accessory_bracelet", + "type": "item_group", + "//": "decorative bracelets worn by people.", + "subtype": "distribution", + "items": [ + { "item": "bead_bracelet", "prob": 80, "count": [ 1, 2 ] }, + { "item": "bracelet_friendship", "prob": 60, "count": [ 1, 2 ] }, + { "item": "copper_bracelet", "prob": 50, "count": [ 1, 2 ] }, + { "item": "silver_bracelet", "prob": 40, "count": [ 1, 2 ] }, + { "item": "gold_bracelet", "prob": 10, "count": [ 1, 2 ] }, + { "item": "platinum_bracelet", "prob": 10 } + ] + }, + { + "id": "accessory_teeth", + "type": "item_group", + "//": "decorative or functional teeth miscellany that may be present in people's mouths.", + "subtype": "distribution", + "items": [ + { "item": "gold_dental_grill", "prob": 50, "count": [ 1, 2 ] }, + { "item": "platinum_dental_grill", "prob": 30, "count": [ 1, 2 ] }, + { "item": "diamond_dental_grill", "prob": 10 } + ] + }, + { + "id": "accessory_necklace", + "type": "item_group", + "//": "decorative necklaces or neck accessories worn by people.", + "subtype": "distribution", + "items": [ + { "item": "bead_necklace", "prob": 80, "count": [ 1, 2 ] }, + { "item": "copper_necklace", "prob": 60, "count": [ 1, 2 ] }, + { "item": "silver_necklace", "prob": 40, "count": [ 1, 2 ] }, + { "item": "gold_necklace", "prob": 20, "count": [ 1, 2 ] }, + { "item": "platinum_necklace", "prob": 10, "count": [ 1, 2 ] }, + { "item": "copper_locket", "prob": 60, "count": [ 1, 2 ] }, + { "item": "silver_locket", "prob": 40, "count": [ 1, 2 ] }, + { "item": "gold_locket", "prob": 20, "count": [ 1, 2 ] }, + { "item": "platinum_locket", "prob": 10, "count": [ 1, 2 ] }, + { "item": "collarpin", "prob": 10 }, + { "item": "bronze_medal", "prob": 6 }, + { "item": "silver_medal", "prob": 4 }, + { "item": "gold_medal", "prob": 2 }, + { "item": "small_relic", "prob": 10 }, + { "item": "holy_symbol", "prob": 10 }, + { "item": "holy_symbol_wood", "prob": 10 } + ] + }, + { + "id": "accessory_cat", + "type": "item_group", + "//": "accessories that some say were the cause of the cataclysm.", + "subtype": "distribution", + "items": [ + { "item": "faux_fur_cat_ears", "prob": 80 }, + { "item": "leather_cat_ears", "prob": 50 }, + { "item": "fur_cat_ears", "prob": 10 }, + { "item": "faux_fur_cat_tail", "prob": 80 }, + { "item": "leather_cat_tail", "prob": 50 }, + { "item": "fur_cat_tail", "prob": 10 }, + { "item": "faux_fur_collar", "prob": 80 }, + { "item": "leather_collar", "prob": 50 }, + { "item": "fur_collar", "prob": 10 } + ] + }, + { + "id": "accessory_weaponcarry", + "type": "item_group", + "//": "clothing designed to hold a small weapon worn by people.", + "subtype": "distribution", + "items": [ + { "item": "bootstrap", "prob": 20 }, + { "item": "bootsheath", "prob": 50 }, + { "item": "sheath", "prob": 80 }, + { "item": "back_holster", "prob": 10 }, + { "item": "holster", "prob": 30 }, + { "item": "sholster", "prob": 10 }, + { "item": "bholster", "prob": 10 } + ] + }, + { + "id": "accessory_sportsgear", + "type": "item_group", + "//": "assorted sportsgear worn by people.", + "subtype": "distribution", + "items": [ + { "item": "elbow_pads", "prob": 50 }, + { "item": "knee_pads", "prob": 50 }, + { "item": "iggaak", "prob": 5 }, + { "item": "goggles_swim", "prob": 10 }, + { "item": "glasses_bal", "prob": 10 }, + { "item": "eclipse_glasses", "prob": 5 }, + { "item": "goggles_ski", "prob": 10 } + ] + }, { "id": "accesories_personal_unisex", "type": "item_group", @@ -3051,107 +3357,14 @@ "items": [ { "group": "clothing_glasses", "prob": 10 }, { "group": "clothing_watch", "prob": 10 }, - { - "distribution": [ - { "item": "ring_wedding", "prob": 50, "count": [ 1, 2 ] }, - { "item": "copper_ring", "prob": 80, "count": [ 1, 3 ] }, - { "item": "silver_ring", "prob": 50, "count": [ 1, 3 ] }, - { "item": "gold_ring", "prob": 40, "count": [ 1, 3 ] }, - { "item": "diamond_ring", "prob": 10 }, - { "item": "platinum_ring", "prob": 10 } - ], - "prob": 15 - }, - { - "distribution": [ - { "item": "ear_spool", "prob": 20, "count": [ 1, 2 ] }, - { "item": "bead_ear", "prob": 70, "count": [ 1, 2 ] }, - { "item": "copper_ear", "prob": 60, "count": [ 1, 2 ] }, - { "item": "silver_ear", "prob": 40, "count": [ 1, 2 ] }, - { "item": "gold_ear", "prob": 40, "count": [ 1, 2 ] }, - { "item": "platinum_ear", "prob": 10 }, - { "item": "ear_plugs", "prob": 40 }, - { "item": "attached_ear_plugs_off", "prob": 30 } - ] - }, - { - "distribution": [ - { "item": "bead_bracelet", "prob": 80, "count": [ 1, 2 ] }, - { "item": "bracelet_friendship", "prob": 60, "count": [ 1, 2 ] }, - { "item": "copper_bracelet", "prob": 50, "count": [ 1, 2 ] }, - { "item": "silver_bracelet", "prob": 40, "count": [ 1, 2 ] }, - { "item": "gold_bracelet", "prob": 10, "count": [ 1, 2 ] }, - { "item": "platinum_bracelet", "prob": 10 } - ], - "prob": 15 - }, - { - "distribution": [ - { "item": "gold_dental_grill", "prob": 50, "count": [ 1, 2 ] }, - { "item": "platinum_dental_grill", "prob": 30, "count": [ 1, 2 ] }, - { "item": "diamond_dental_grill", "prob": 10 } - ], - "prob": 15 - }, - { - "distribution": [ - { "item": "bead_necklace", "prob": 80, "count": [ 1, 2 ] }, - { "item": "copper_necklace", "prob": 60, "count": [ 1, 2 ] }, - { "item": "silver_necklace", "prob": 40, "count": [ 1, 2 ] }, - { "item": "gold_necklace", "prob": 20, "count": [ 1, 2 ] }, - { "item": "platinum_necklace", "prob": 10, "count": [ 1, 2 ] }, - { "item": "copper_locket", "prob": 60, "count": [ 1, 2 ] }, - { "item": "silver_locket", "prob": 40, "count": [ 1, 2 ] }, - { "item": "gold_locket", "prob": 20, "count": [ 1, 2 ] }, - { "item": "platinum_locket", "prob": 10, "count": [ 1, 2 ] }, - { "item": "collarpin", "prob": 10 }, - { "item": "bronze_medal", "prob": 6 }, - { "item": "silver_medal", "prob": 4 }, - { "item": "gold_medal", "prob": 2 }, - { "item": "small_relic", "prob": 10 }, - { "item": "holy_symbol", "prob": 10 }, - { "item": "holy_symbol_wood", "prob": 10 } - ], - "prob": 15 - }, - { - "distribution": [ - { "item": "faux_fur_cat_ears", "prob": 80 }, - { "item": "leather_cat_ears", "prob": 50 }, - { "item": "fur_cat_ears", "prob": 10 }, - { "item": "faux_fur_cat_tail", "prob": 80 }, - { "item": "leather_cat_tail", "prob": 50 }, - { "item": "fur_cat_tail", "prob": 10 }, - { "item": "faux_fur_collar", "prob": 80 }, - { "item": "leather_collar", "prob": 50 }, - { "item": "fur_collar", "prob": 10 } - ], - "prob": 15 - }, - { - "distribution": [ - { "item": "bootstrap", "prob": 20 }, - { "item": "bootsheath", "prob": 50 }, - { "item": "sheath", "prob": 80 }, - { "item": "back_holster", "prob": 10 }, - { "item": "holster", "prob": 30 }, - { "item": "sholster", "prob": 10 }, - { "item": "bholster", "prob": 10 } - ], - "prob": 15 - }, - { - "distribution": [ - { "item": "elbow_pads", "prob": 50 }, - { "item": "knee_pads", "prob": 50 }, - { "item": "iggaak", "prob": 5 }, - { "item": "goggles_swim", "prob": 10 }, - { "item": "glasses_bal", "prob": 10 }, - { "item": "eclipse_glasses", "prob": 5 }, - { "item": "goggles_ski", "prob": 10 } - ], - "prob": 15 - }, + { "group": "accessory_ring", "prob": 15 }, + { "group": "accessory_earring" }, + { "group": "accessory_bracelet", "prob": 15 }, + { "group": "accessory_teeth", "prob": 15 }, + { "group": "accessory_necklace", "prob": 15 }, + { "group": "accessory_cat", "prob": 15 }, + { "group": "accessory_weaponcarry", "prob": 15 }, + { "group": "accessory_sportsgear", "prob": 15 }, { "item": "folding_poncho", "prob": 10 }, { "item": "american_flag", "prob": 2 }, { "item": "tool_belt", "prob": 10 }, diff --git a/data/json/itemgroups/food.json b/data/json/itemgroups/food.json index 1d62633b413e6..fda23b0c4e6e1 100644 --- a/data/json/itemgroups/food.json +++ b/data/json/itemgroups/food.json @@ -523,30 +523,31 @@ { "type": "item_group", "id": "MRE", - "items": [ - [ "mre_chilibeans_box", 45 ], - [ "mre_bbqbeef_box", 45 ], - [ "mre_chickennoodle_box", 45 ], - [ "mre_spaghetti_box", 45 ], - [ "mre_chicken_box", 45 ], - [ "mre_beeftaco_box", 45 ], - [ "mre_beef_box", 45 ], - [ "mre_meatball_box", 45 ], - [ "mre_beefstew_box", 45 ], - [ "mre_chilimac_box", 45 ], - [ "mre_veggy_box", 45 ], - [ "mre_macaronimarinara_box", 45 ], - [ "mre_cheesetort_box", 45 ], - [ "mre_mushroomfettuccine_box", 45 ], - [ "mre_mexicanchickenstew_box", 45 ], - [ "mre_maplesausage_box", 45 ], - [ "mre_ravioli_box", 45 ], - [ "mre_hashbrownbacon_box", 45 ], - [ "mre_lemontuna_box", 45 ], - [ "mre_asianbeef_box", 45 ], - [ "mre_chickenpesto_box", 45 ], - [ "mre_southwestbeef_box", 45 ], - [ "mre_hotdog_box", 45 ] + "subtype": "distribution", + "entries": [ + { "item": "mre_chilibeans_box" }, + { "item": "mre_bbqbeef_box" }, + { "item": "mre_chickennoodle_box" }, + { "item": "mre_spaghetti_box" }, + { "item": "mre_chicken_box" }, + { "item": "mre_beeftaco_box" }, + { "item": "mre_beef_box" }, + { "item": "mre_meatball_box" }, + { "item": "mre_beefstew_box" }, + { "item": "mre_chilimac_box" }, + { "item": "mre_veggy_box" }, + { "item": "mre_macaronimarinara_box" }, + { "item": "mre_cheesetort_box" }, + { "item": "mre_mushroomfettuccine_box" }, + { "item": "mre_mexicanchickenstew_box" }, + { "item": "mre_maplesausage_box" }, + { "item": "mre_ravioli_box" }, + { "item": "mre_hashbrownbacon_box" }, + { "item": "mre_lemontuna_box" }, + { "item": "mre_asianbeef_box" }, + { "item": "mre_chickenpesto_box" }, + { "item": "mre_southwestbeef_box" }, + { "item": "mre_hotdog_box" } ] }, { diff --git a/data/json/itemgroups/gear.json b/data/json/itemgroups/gear.json index 96a124463f1fd..202b55dcc6f31 100644 --- a/data/json/itemgroups/gear.json +++ b/data/json/itemgroups/gear.json @@ -49,7 +49,9 @@ [ "pocket_firearms", 5 ], [ "newest_newspaper", 75 ], [ "flyer", 10 ], - [ "thermos", 5 ] + [ "thermos", 5 ], + [ "hairbrush", 25 ], + [ "comb_pocket", 50 ] ] }, { diff --git a/data/json/itemgroups/item_groups.json b/data/json/itemgroups/item_groups.json index 98e30a2f5d352..951751203405c 100644 --- a/data/json/itemgroups/item_groups.json +++ b/data/json/itemgroups/item_groups.json @@ -740,6 +740,7 @@ [ "tieclip", 3 ], [ "collarpin", 3 ], [ "socks", 70 ], + [ "socks_ankle", 50 ], [ "briefcase", 5 ], [ "mocassins", 5 ], [ "boots_western", 4 ], @@ -1198,7 +1199,10 @@ [ "insecticide", 2 ], [ "soap", 80 ], [ "detergent", 80 ], - [ "chem_hydrogen_peroxide", 20 ] + [ "chem_hydrogen_peroxide", 20 ], + [ "plunger_toilet", 30 ], + [ "plunger_futuristic", 15 ], + [ "toilet_paper", 10 ] ] }, { @@ -1265,7 +1269,8 @@ [ "football_armor", 10 ], [ "helmet_football", 10 ], [ "sneakers", 80 ], - [ "socks", 70 ], + [ "socks", 50 ], + [ "socks_ankle", 70 ], [ "stockings", 20 ], [ "tshirt", 80 ], [ "longshirt", 70 ], @@ -1360,7 +1365,6 @@ [ "gauntlet_fencing_l", 1 ], [ "survnote", 1 ], [ "halter_top", 30 ], - [ "linuxtshirt", 10 ], [ "iceaxe", 30 ], [ "tourist_table", 30 ] ] @@ -1406,7 +1410,6 @@ [ "bbgun", 10 ], [ "crossbow", 2 ], [ "mag_survival", 40 ], - [ "manual_survival", 2 ], [ "textbook_survival", 20 ], [ "modern_tanner", 8 ], [ "recipe_bows", 8 ], @@ -1538,197 +1541,39 @@ "ammo": 50, "magazine": 100, "items": [ - [ "aspirin", 85 ], - [ "daypack", 30 ], + { "group": "sports", "prob": 2290 }, + { "group": "camping", "prob": 1284 }, [ "ski_jacket", 5 ], [ "sports_drink", 20 ], - [ "bat", 60 ], - [ "bat_metal", 60 ], - [ "boxing_gloves", 40 ], - [ "inflatable_boat", 35 ], - [ "hand_pump", 10 ], - [ "baseball", 60 ], - [ "football_armor", 10 ], - [ "helmet_football", 10 ], - [ "football", 30 ], - [ "frisbee", 10 ], - [ "disc_golf", 10 ], - [ "basketball", 20 ], - [ "sneakers", 80 ], - [ "socks", 70 ], - [ "tshirt", 80 ], - [ "longshirt", 50 ], - [ "tank_top", 50 ], - [ "sports_bra", 30 ], - [ "trunks", 50 ], - [ "bikini_top", 50 ], - [ "towel", 40 ], - [ "gloves_fingerless", 20 ], - [ "glasses_safety", 40 ], - [ "goggles_swim", 50 ], - [ "armguard_soft", 40 ], - [ "armguard_hard", 20 ], - [ "legguard_hard", 15 ], [ "mag_firstaid", 15 ], [ "mag_throwing", 20 ], [ "mag_swimming", 20 ], [ "manual_swimming", 10 ], - [ "mag_bashing", 20 ], [ "manual_bashing", 1 ], [ "mag_cutting", 10 ], [ "mag_unarmed", 30 ], [ "mag_stabbing", 15 ], - [ "goggles_ski", 30 ], - [ "mask_ski", 30 ], - [ "hat_ball", 30 ], - [ "helmet_bike", 35 ], - [ "helmet_ball", 45 ], - [ "headgear", 40 ], [ "sunglasses", 20 ], [ "fitover_sunglasses", 10 ], - [ "mask_hockey", 25 ], - [ "hockey_stick", 35 ], - [ "jersey", 20 ], - [ "puck", 30 ], - [ "golf_club", 35 ], - [ "hat_golf", 30 ], - [ "gloves_golf", 25 ], - [ "golf_bag", 20 ], - [ "golf_tee", 30 ], - [ "golf_ball", 40 ], [ "scorecard", 10 ], - [ "manual_brawl", 30 ], - [ "manual_melee", 6 ], - [ "manual_throw", 12 ], - [ "rope_30", 35 ], - [ "hatchet", 10 ], - [ "mess_kit", 10 ], - [ "popcan_stove", 10 ], - [ "pot", 20 ], - [ "pot_copper", 5 ], - [ "bowl_pewter", 25 ], - [ "teapot", 15 ], - [ "pan", 20 ], - [ "waffleiron", 25 ], - [ "pastaextruder", 10 ], [ "can_sealer", 5 ], - [ "binoculars", 20 ], - [ "roller_blades", 20 ], - [ "rollerskates", 10 ], - [ "hotplate", 10 ], - [ "kukri", 2 ], - [ "knife_hunting", 12 ], - [ "knife_rambo", 20 ], [ "multitool", 12 ], [ "throwing_knife", 7 ], - [ "machete", 5 ], - [ "vest", 15 ], - [ "backpack", 38 ], - [ "backpack_leather", 18 ], - [ "backpack_hiking", 4 ], - [ "bigback", 2 ], - [ "travelpack", 9 ], [ "slingpack", 18 ], - [ "bb", 8 ], - [ "bolt_steel", 7 ], - [ "bbgun", 10 ], - [ "crossbow", 2 ], - [ "hybridbow", 2 ], - [ "mag_survival", 40 ], - [ "mag_rifle", 40 ], - [ "mag_shotgun", 20 ], - [ "mag_cutting", 10 ], [ "mag_stabbing", 20 ], [ "mag_melee", 10 ], [ "mag_traps", 10 ], - [ "hand_crossbow", 1 ], [ "manual_cutting", 12 ], - [ "manual_knives", 8 ], - [ "manual_gun", 8 ], - [ "manual_shotgun", 6 ], - [ "manual_pistol", 4 ], - [ "manual_smg", 2 ], [ "manual_launcher", 1 ], [ "recipe_bullets", 8 ], - [ "manual_first_aid", 40 ], - [ "manual_traps", 12 ], [ "howto_traps", 16 ], - [ "recipe_bows", 5 ], - [ "recipe_arrows", 5 ], - [ "lighter", 60 ], - [ "ref_lighter", 2 ], - [ "matches", 60 ], - [ "sewing_kit", 47 ], - [ "tailors_kit", 3 ], - [ "thread", 40 ], - [ "hammer", 35 ], - [ "flashlight", 40 ], - [ "heavy_flashlight", 20 ], - [ "water_purifier", 5 ], - [ "radio", 20 ], - [ "beartrap", 5 ], [ "extinguisher", 20 ], - [ "string_36", 40 ], - [ "longbow", 5 ], - [ "compbow", 1 ], - [ "bow_sight", 5 ], - [ "bow_stabilizer", 5 ], - [ "arrowrest", 5 ], - [ "compositebow", 3 ], - [ "shortbow", 5 ], - [ "recurbow", 2 ], - [ "reflexbow", 2 ], - [ "quiver", 3 ], [ "quiver_large", 1 ], - [ "arrow_wood", 7 ], - [ "arrow_cf", 5 ], - [ "rollmat", 40 ], - [ "tent_kit", 17 ], - [ "large_tent_kit", 17 ], - [ "foot_crank", 10 ], [ "mag_archery", 20 ], [ "manual_archery", 7 ], [ "book_archery", 12 ], - [ "heatpack", 60 ], - [ "flotation_vest", 3 ], - [ "fishing_waders", 5 ], - [ "fishing_rod_professional", 5 ], - [ "wetsuit", 10 ], - [ "wetsuit_spring", 10 ], - [ "wetsuit_gloves", 20 ], - [ "wetsuit_booties", 20 ], - [ "wetsuit_hood", 10 ], - [ "scuba_tank", 20 ], - [ "small_scuba_tank", 10 ], - [ "dive_bag", 10 ], - [ "rebreather", 2 ], - [ "rebreather_filter", 4 ], - [ "glowstick", 60 ], - [ "handflare", 40 ], - [ "folding_bicycle", 1 ], - [ "coat_rain", 5 ], - [ "hood_rain", 5 ], - [ "sleeveless_trenchcoat", 2 ], - [ "sleeveless_duster", 2 ], - [ "elbow_pads", 40 ], - [ "knee_pads", 40 ], - [ "boots_hiking", 10 ], - [ "runner_bag", 5 ], - [ "pur_tablets", 5 ], - { - "item": "protein_powder", - "prob": 12, - "container-item": "bottle_plastic_small", - "charges-min": 1, - "charges-max": 9 - }, [ "protein_shake", 15 ], - [ "knife_trench", 7 ], [ "sm_extinguisher", 10 ], - [ "flaregun", 10 ], - [ "signal_flare", 15 ], - [ "airhorn", 30 ], - [ "whistle", 30 ], [ "quikclot", 10 ], [ "bfipowder", 15 ], [ "speargun", 10 ], @@ -1738,43 +1583,12 @@ [ "fishspear", 12 ], [ "m_fishspear", 10 ], [ "c_fishspear", 10 ], - [ "swim_fins", 20 ], [ "diveknife", 12 ], - [ "mouthpiece", 15 ], [ "small_repairkit", 2 ], - [ "grapnel", 2 ], - [ "leathersandals", 15 ], - [ "bootsheath", 5 ], - [ "sheath", 5 ], - [ "fencing_jacket", 10 ], - [ "fencing_mask", 10 ], - [ "fencing_pants", 10 ], - [ "fencing_foil", 10 ], - [ "fencing_sabre", 10 ], - [ "fencing_epee", 10 ], - [ "lame_foil", 10 ], - [ "lame_saber", 10 ], - [ "plastron_cotton", 10 ], - [ "plastron_plastic", 10 ], - [ "gauntlet_fencing", 8 ], - [ "gauntlet_fencing_l", 2 ], - [ "survnote", 1 ], [ "slingshot", 10 ], [ "wristrocket", 5 ], - [ "iceaxe", 30 ], [ "powered_earmuffs", 80 ], - [ "bandolier_wrist", 100 ], - [ "tourist_table", 20 ], - [ "chem_hexamine", 5 ], - [ "flint_steel", 10 ], - [ "bottle_metal", 5 ], - [ "tinderbox", 5 ], - [ "canteen_wood", 5 ], - [ "whistle_multitool", 5 ], - [ "tarp", 10 ], - [ "esbit_stove", 10 ], - [ "bottle_folding", 5 ], - [ "mess_tin", 10 ] + [ "bandolier_wrist", 100 ] ] }, { @@ -1842,6 +1656,7 @@ [ "scorecard", 10 ], [ "talking_doll", 60 ], [ "marble", 65 ], + [ "handflare_dead", 3 ], [ "creepy_doll", 1 ], [ "straw_doll", 1 ], [ "striped_shirt", 1 ], @@ -1930,6 +1745,9 @@ [ "shavingkit", 30 ], [ "elec_hairtrimmer", 15 ], [ "razor_blade", 5 ], + [ "razor_shaving", 5 ], + [ "toothbrush_plain", 10 ], + [ "string_floss", 10 ], [ "kilt", 5 ], [ "hobo_stove", 1 ], [ "tinder", 1 ], @@ -3167,6 +2985,12 @@ "type": "item_group", "id": "jewelry_front", "items": [ + { "group": "tiaras_silver", "prob": 5, "count": [ 1, 3 ] }, + { "group": "tiaras_gold", "prob": 3, "count": [ 1, 3 ] }, + { "group": "tiaras_platinum", "prob": 1, "count": [ 1, 3 ] }, + { "group": "pendant_necklaces_silver", "prob": 30, "count": [ 1, 3 ] }, + { "group": "pendant_necklaces_gold", "prob": 10, "count": [ 1, 3 ] }, + { "group": "pendant_necklaces_platinum", "prob": 5, "count": [ 1, 3 ] }, { "group": "earrings_silver", "prob": 30 }, { "group": "earrings_gold", "prob": 10 }, { "group": "earrings_platinum", "prob": 5 }, @@ -3178,6 +3002,9 @@ { "group": "rings_gold", "prob": 10 }, { "group": "rings_platinum", "prob": 5 }, { "group": "dental_grills", "prob": 10 }, + { "group": "cufflinks_silver", "prob": 30, "count": [ 1, 3 ] }, + { "group": "cufflinks_gold", "prob": 10, "count": [ 1, 3 ] }, + { "group": "cufflinks_platinum", "prob": 5, "count": [ 1, 3 ] }, { "group": "gemstones", "prob": 30 }, [ "gold_ring", 30 ], [ "gold_ear", 30 ], diff --git a/data/json/itemgroups/locations.json b/data/json/itemgroups/locations.json index d56b6023cadd9..952b9578a2682 100644 --- a/data/json/itemgroups/locations.json +++ b/data/json/itemgroups/locations.json @@ -2246,7 +2246,9 @@ [ "toolbox", 5 ], [ "apron_leather", 10 ], [ "bio_meteorologist", 10 ], - [ "chem_aluminium_sulphate", 20 ] + [ "chem_aluminium_sulphate", 20 ], + [ "plunger_toilet", 10 ], + [ "plunger_futuristic", 5 ] ] }, { @@ -2704,6 +2706,7 @@ [ "coat_lab", 40 ], [ "boots_steel", 5 ], [ "socks", 70 ], + [ "socks_ankle", 50 ], [ "mocassins", 20 ], [ "bandana", 35 ], [ "glasses_eye", 90 ], diff --git a/data/json/itemgroups/locations_commercial.json b/data/json/itemgroups/locations_commercial.json index 990b01d00c249..001bd8e8ba50d 100644 --- a/data/json/itemgroups/locations_commercial.json +++ b/data/json/itemgroups/locations_commercial.json @@ -43,6 +43,7 @@ "items": [ [ "rope_6", 20 ], [ "string_36", 25 ], + [ "toilet_paper", 10 ], [ "handflare", 15 ], [ "duct_tape", 25 ], [ "flashlight", 25 ], diff --git a/data/json/itemgroups/mall_item_groups.json b/data/json/itemgroups/mall_item_groups.json index 934f64c980d13..f4b359e1cd303 100644 --- a/data/json/itemgroups/mall_item_groups.json +++ b/data/json/itemgroups/mall_item_groups.json @@ -283,7 +283,13 @@ [ "soap", 45 ], [ "tailors_kit", 25 ], [ "shavingkit", 20 ], - [ "elec_hairtrimmer", 20 ] + [ "elec_hairtrimmer", 20 ], + [ "razor_shaving", 20 ], + [ "curler_hair", 30 ], + [ "hair_dryer", 40 ], + [ "curling_iron", 40 ], + [ "comb_pocket", 10 ], + [ "hairbrush", 10 ] ] }, { diff --git a/data/json/itemgroups/mansion.json b/data/json/itemgroups/mansion.json index b67896f52d3dd..34c5a75e4b944 100644 --- a/data/json/itemgroups/mansion.json +++ b/data/json/itemgroups/mansion.json @@ -976,6 +976,7 @@ [ "38_casing", 20 ], [ "45_casing", 20 ], [ "bone_tainted", 1 ], + [ "toothbrush_plain", 10 ], { "group": "corpse_mansion", "prob": 1 } ] }, @@ -1144,7 +1145,10 @@ [ "oxy_powder", 5 ], [ "fungicide", 5 ], [ "insecticide", 5 ], - { "item": "charcoal", "prob": 5, "container-item": "bag_canvas" } + { "item": "charcoal", "prob": 5, "container-item": "bag_canvas" }, + [ "toilet_paper", 30 ], + [ "plunger_toilet", 10 ], + [ "plunger_futuristic", 25 ] ] }, { @@ -1301,7 +1305,12 @@ [ "sewing_kit", 10 ], [ "mag_beauty", 10 ], [ "mag_glam", 10 ], - { "group": "harddrugs", "prob": 5 } + { "group": "harddrugs", "prob": 5 }, + [ "hairbrush", 30 ], + [ "comb_pocket", 15 ], + [ "curler_hair", 10 ], + [ "curling_iron", 15 ], + [ "brush_toilet", 15 ] ] }, { @@ -1333,7 +1342,9 @@ [ "nyquil", 5 ], { "group": "mansion_guns", "prob": 3 }, { "group": "harddrugs", "prob": 1 }, - [ "joint", 1 ] + [ "joint", 1 ], + [ "curler_hair", 10 ], + [ "hairbrush", 5 ] ] }, { diff --git a/data/json/itemgroups/military.json b/data/json/itemgroups/military.json index 746e2675d5566..9346c012ffe11 100644 --- a/data/json/itemgroups/military.json +++ b/data/json/itemgroups/military.json @@ -1,4 +1,105 @@ [ + { + "type": "item_group", + "id": "military_standard_assault_rifles", + "subtype": "distribution", + "entries": [ + { "item": "m4a1", "prob": 88, "charges": [ 0, 30 ] }, + { "item": "m27iar", "prob": 10, "charges": [ 0, 30 ] }, + { "item": "m16a4", "prob": 2, "charges": [ 0, 30 ] } + ] + }, + { + "type": "item_group", + "id": "military_standard_shotguns", + "subtype": "distribution", + "entries": [ { "item": "m1014", "prob": 60, "charges": [ 0, 8 ] }, { "item": "mossberg_590", "prob": 40, "charges": [ 0, 9 ] } ] + }, + { + "type": "item_group", + "id": "military_standard_sniper_rifles", + "subtype": "distribution", + "entries": [ { "item": "m2010", "prob": 20, "charges": [ 0, 5 ] }, { "item": "m110a1", "prob": 80, "charges": [ 0, 20 ] } ] + }, + { + "type": "item_group", + "id": "military_standard_lmgs", + "subtype": "distribution", + "entries": [ { "item": "m249", "prob": 100, "charges": [ 0, 200 ] } ] + }, + { + "type": "item_group", + "id": "military_standard_pistols", + "subtype": "distribution", + "entries": [ + { "item": "m9", "prob": 30, "charges": [ 0, 15 ] }, + { "item": "m17", "prob": 65, "charges": [ 0, 17 ] }, + { "item": "glock_19", "prob": 3, "charges": [ 0, 15 ] }, + { "item": "m1911_MEU", "prob": 2, "charges": [ 0, 7 ] } + ] + }, + { + "type": "item_group", + "id": "military_standard_grenades", + "subtype": "distribution", + "entries": [ { "item": "grenade", "prob": 100 } ] + }, + { + "type": "item_group", + "id": "military_patrol_food", + "subtype": "collection", + "entries": [ + { "group": "MRE", "count": [ 1, 3 ], "prob": 70 }, + { "item": "chocolate", "prob": 20 }, + { "item": "neccowafers", "prob": 20 }, + { "item": "water_clean", "container-item": "canteen", "prob": 80, "charges": [ 0, 6 ] } + ] + }, + { + "type": "item_group", + "id": "infantry_common_gear", + "subtype": "collection", + "entries": [ + { "item": "e_tool", "prob": 60 }, + { "item": "mask_gas", "prob": 20 }, + { "item": "two_way_radio", "prob": 60 }, + { "item": "sheath", "contents-item": "knife_combat", "prob": 80 } + ] + }, + { + "type": "item_group", + "id": "infantry_officer_gear", + "subtype": "collection", + "entries": [ + { "item": "holster", "contents-group": "military_standard_pistols", "prob": 90 }, + { "item": "id_military", "prob": 90 } + ] + }, + { + "type": "item_group", + "id": "infantry_medical_gear", + "subtype": "collection", + "entries": [ + { "item": "1st_aid", "prob": 90 }, + { "item": "quikclot", "prob": 60 }, + { "collection": [ { "item": "morphine" }, { "item": "syringe" } ], "prob": 30 } + ] + }, + { + "type": "item_group", + "id": "sopmod", + "subtype": "collection", + "entries": [ + { + "distribution": [ { "item": "holo_sight", "prob": 50 }, { "item": "acog_scope", "prob": 30 }, { "item": "red_dot_sight", "prob": 20 } ] + }, + { "distribution": [ { "item": "grip", "prob": 70 }, { "item": "m203", "prob": 30 } ] }, + { "item": "offset_sights", "prob": 30 }, + { "item": "shoulder_strap", "prob": 70 }, + { "item": "rail_laser_sight", "prob": 30 }, + { "item": "suppressor", "prob": 70 } + ] + }, { "type": "item_group", "id": "military", diff --git a/data/json/itemgroups/misc.json b/data/json/itemgroups/misc.json index 09466e08d9874..8b82da7eab8a3 100644 --- a/data/json/itemgroups/misc.json +++ b/data/json/itemgroups/misc.json @@ -4,7 +4,7 @@ "type": "item_group", "subtype": "collection", "//": "Smokable item and something to light it with", - "items": [ + "entries": [ { "distribution": [ { "item": "cig", "prob": 70, "charges": [ 1, 10 ] }, diff --git a/data/json/itemgroups/supplies.json b/data/json/itemgroups/supplies.json index e0a18a99260c4..94a0e2f301fac 100644 --- a/data/json/itemgroups/supplies.json +++ b/data/json/itemgroups/supplies.json @@ -108,7 +108,9 @@ [ "pump_complex", 5 ], [ "well_pump", 5 ], [ "plastic_sheet", 20 ], - [ "recharge_station", 20 ] + [ "recharge_station", 20 ], + [ "plunger_toilet", 75 ], + [ "plunger_futuristic", 25 ] ] }, { @@ -128,7 +130,9 @@ [ "jerrycan", 10 ], [ "pump_complex", 10 ], [ "well_pump", 10 ], - { "item": "scrap_copper", "prob": 15, "count": [ 1, 10 ] } + { "item": "scrap_copper", "prob": 15, "count": [ 1, 10 ] }, + { "item": "plunger_toilet", "prob": 90, "count": [ 1, 2 ] }, + [ "plunger_futuristic", 50 ] ] }, { diff --git a/data/json/items/ammo.json b/data/json/items/ammo.json index 68f1e8197dc57..56cabbb624e90 100644 --- a/data/json/items/ammo.json +++ b/data/json/items/ammo.json @@ -792,7 +792,7 @@ "range": 45, "dispersion": 50, "recoil": 350, - "effects": [ "COOKOFF", "TRAIL", "NEVER_MISFIRES", "FRAG" ] + "effects": [ "COOKOFF", "NEVER_MISFIRES", "FRAG" ] }, { "type": "AMMO", diff --git a/data/json/items/ammo_types.json b/data/json/items/ammo_types.json index 2ed1eeab0ec56..b630f4a4145d9 100644 --- a/data/json/items/ammo_types.json +++ b/data/json/items/ammo_types.json @@ -219,7 +219,7 @@ "type": "ammunition_type", "id": "223", "name": ".223", - "default": "223" + "default": "556" }, { "type": "ammunition_type", @@ -237,7 +237,7 @@ "type": "ammunition_type", "id": "308", "name": ".308", - "default": "308" + "default": "762_51" }, { "type": "ammunition_type", diff --git a/data/json/items/armor.json b/data/json/items/armor.json index ae544e24ca9f1..4a7fdbea46677 100644 --- a/data/json/items/armor.json +++ b/data/json/items/armor.json @@ -1381,7 +1381,7 @@ "type": "ARMOR", "copy-from": "briefcase", "looks_like": "briefcase", - "name": "H&K operational briefcase (empty)", + "name": { "str": "H&K operational briefcase (empty)", "str_pl": "H&K operational briefcases (empty)" }, "description": "This is a plain, hard-sided black briefcase with a trigger in the handle and a concealed hole in the side. Squeezing the trigger would currently do nothing, as it is empty. Don't forget to put a suitable MP5 back inside before you try to pay any ransom fees with lead.", "storage": "14500 ml", "price": 2000, @@ -2723,7 +2723,7 @@ { "id": "lame_foil", "type": "ARMOR", - "name": "lamé (foil)", + "name": { "str": "lamé (foil)", "str_pl": "lamés (foil)" }, "description": "A thin, lightweight conductive vest with the zipper on the back used by fencers for electronic scoring. Its outer layer is a woven mix of sturdy cotton and stainless steel strands.", "weight": "843 g", "volume": "2500 ml", @@ -2741,7 +2741,7 @@ { "id": "lame_saber", "type": "ARMOR", - "name": "lamé (saber)", + "name": { "str": "lamé (saber)", "str_pl": "lamés (saber)" }, "description": "A thin, lightweight conductive jacket used by fencers for electronic scoring. Its outer layer is a woven mix of sturdy cotton and stainless steel strands.", "weight": "1043 g", "volume": "2500 ml", diff --git a/data/json/items/armor/boots.json b/data/json/items/armor/boots.json index 5561d6f8b1be6..7a4270f2bea8c 100644 --- a/data/json/items/armor/boots.json +++ b/data/json/items/armor/boots.json @@ -1278,6 +1278,24 @@ "material_thickness": 1, "flags": [ "VARSIZE", "SKINTIGHT" ] }, + { + "id": "socks_ankle", + "type": "ARMOR", + "name": "pair of ankle socks", + "name_plural": "pairs of ankle socks", + "description": "Short socks, commonly used for sports. These are designed to protect your feet from friction, not temperature", + "weight": "25 g", + "volume": "200 ml", + "price": 100, + "material": [ "cotton" ], + "symbol": "[", + "looks_like": "socks", + "color": "light_gray", + "covers": [ "FEET" ], + "coverage": 80, + "material_thickness": 1, + "flags": [ "VARSIZE", "SKINTIGHT" ] + }, { "id": "socks_bag", "type": "ARMOR", diff --git a/data/json/items/armor/gloves.json b/data/json/items/armor/gloves.json index 56e29e9cc4dd4..3068b3db9ade6 100644 --- a/data/json/items/armor/gloves.json +++ b/data/json/items/armor/gloves.json @@ -145,7 +145,7 @@ { "id": "gauntlet_fencing_l", "type": "ARMOR", - "name": "fencing gauntlet (left)", + "name": { "str": "fencing gauntlet (left)", "str_pl": "fencing gauntlets (left)" }, "description": "A single suede glove with sturdy cotton wrists, padded backs and well-fitting fingers. This one is left-handed.", "weight": "175 g", "volume": "250 ml", diff --git a/data/json/items/armor/jewelry.json b/data/json/items/armor/jewelry.json index 497202ad2be79..4a2581bf3ae82 100644 --- a/data/json/items/armor/jewelry.json +++ b/data/json/items/armor/jewelry.json @@ -331,7 +331,7 @@ { "id": "cufflinks", "type": "ARMOR", - "name": "cufflinks", + "name": { "str": "pair of cufflinks", "str_pl": "pairs of cufflinks" }, "description": "An unmarked, pair of silver cufflinks. Cufflinks are used to secure the cuffs of dress shirts - a must-have for men in formal wear. You can wear it if you like, but it won't provide any effects.", "weight": "15 g", "volume": 0, @@ -344,7 +344,7 @@ { "id": "cufflinks_intricate", "type": "ARMOR", - "name": "intricate cufflinks", + "name": { "str": "pair of intricate cufflinks", "str_pl": "pairs of intricate cufflinks" }, "description": "An expensive pair of silver cufflinks, stylized with detailed overlays of gold gears and fractal patterns. You can wear it if you like, but it won't provide any effects.", "weight": "21 g", "volume": 0, @@ -354,6 +354,363 @@ "symbol": "[", "color": "light_gray" }, + { + "id": "garnet_gold_cufflinks", + "type": "ARMOR", + "name": { "str": "garnet and gold cufflinks" }, + "description": "A pair of cufflinks with inset garnets.", + "weight": "15 g", + "volume": 0, + "price": 3500, + "price_postapoc": 100, + "material": [ "gold", "gemstone" ], + "looks_like": "cufflinks", + "symbol": "[", + "color": "red", + "flags": [ "FANCY" ] + }, + { + "id": "diamond_gold_cufflinks", + "copy-from": "garnet_gold_cufflinks", + "type": "ARMOR", + "name": { "str": "diamond and gold cufflinks" }, + "description": "A pair of cufflinks with inset diamonds.", + "material": [ "gold", "diamond" ], + "color": "white" + }, + { + "id": "amethyst_gold_cufflinks", + "copy-from": "garnet_gold_cufflinks", + "type": "ARMOR", + "name": { "str": "amethyst and gold cufflinks" }, + "description": "A pair of cufflinks with inset amethysts.", + "color": "blue" + }, + { + "id": "aquamarine_gold_cufflinks", + "copy-from": "garnet_gold_cufflinks", + "type": "ARMOR", + "name": { "str": "aquamarine and gold cufflinks" }, + "description": "A pair of cufflinks with inset aquamarines.", + "color": "light_blue" + }, + { + "id": "emerald_gold_cufflinks", + "copy-from": "garnet_gold_cufflinks", + "type": "ARMOR", + "name": { "str": "emerald and gold cufflinks" }, + "description": "A pair of cufflinks with inset emeralds.", + "color": "green" + }, + { + "id": "alexandrite_gold_cufflinks", + "copy-from": "garnet_gold_cufflinks", + "type": "ARMOR", + "name": { "str": "alexandrite and gold cufflinks" }, + "description": "A pair of cufflinks with inset alexandrites.", + "color": "green" + }, + { + "id": "ruby_gold_cufflinks", + "copy-from": "garnet_gold_cufflinks", + "type": "ARMOR", + "name": { "str": "ruby and gold cufflinks" }, + "description": "A pair of cufflinks with inset rubies." + }, + { + "id": "peridot_gold_cufflinks", + "copy-from": "garnet_gold_cufflinks", + "type": "ARMOR", + "name": { "str": "peridot and gold cufflinks" }, + "description": "A pair of cufflinks with inset peridots.", + "color": "light_green" + }, + { + "id": "sapphire_gold_cufflinks", + "copy-from": "garnet_gold_cufflinks", + "type": "ARMOR", + "name": { "str": "sapphire and gold cufflinks" }, + "description": "A pair of cufflinks with inset sapphires.", + "color": "blue" + }, + { + "id": "tourmaline_gold_cufflinks", + "copy-from": "garnet_gold_cufflinks", + "type": "ARMOR", + "name": { "str": "tourmaline and gold cufflinks" }, + "description": "A pair of cufflinks with inset tourmalines.", + "color": "light_red" + }, + { + "id": "citrine_gold_cufflinks", + "copy-from": "garnet_gold_cufflinks", + "type": "ARMOR", + "name": { "str": "citrine and gold cufflinks" }, + "description": "A pair of cufflinks with inset citrines.", + "color": "yellow" + }, + { + "id": "blue_topaz_gold_cufflinks", + "copy-from": "garnet_gold_cufflinks", + "type": "ARMOR", + "name": { "str": "blue topaz and gold cufflinks" }, + "description": "A pair of cufflinks with inset blue topaz.", + "color": "light_blue" + }, + { + "id": "opal_gold_cufflinks", + "copy-from": "garnet_gold_cufflinks", + "type": "ARMOR", + "name": { "str": "opal and gold cufflinks" }, + "description": "A pair of cufflinks with inset opals.", + "color": "white" + }, + { + "id": "pearl_gold_cufflinks", + "copy-from": "garnet_gold_cufflinks", + "type": "ARMOR", + "name": { "str": "pearl and gold cufflinks" }, + "description": "A pair of cufflinks with inset pearls.", + "color": "white" + }, + { + "id": "garnet_silver_cufflinks", + "type": "ARMOR", + "name": { "str": "garnet and silver cufflinks" }, + "description": "A pair of cufflinks with inset garnets.", + "weight": "15 g", + "volume": 0, + "price": 3500, + "price_postapoc": 100, + "material": [ "silver", "gemstone" ], + "looks_like": "cufflinks", + "symbol": "[", + "color": "red", + "flags": [ "FANCY" ] + }, + { + "id": "diamond_silver_cufflinks", + "copy-from": "garnet_silver_cufflinks", + "type": "ARMOR", + "name": { "str": "diamond and silver cufflinks" }, + "description": "A pair of cufflinks with inset diamonds.", + "material": [ "silver", "diamond" ], + "color": "white" + }, + { + "id": "amethyst_silver_cufflinks", + "copy-from": "garnet_silver_cufflinks", + "type": "ARMOR", + "name": { "str": "amethyst and silver cufflinks" }, + "description": "A pair of cufflinks with inset amethysts.", + "color": "blue" + }, + { + "id": "aquamarine_silver_cufflinks", + "copy-from": "garnet_silver_cufflinks", + "type": "ARMOR", + "name": { "str": "aquamarine and silver cufflinks" }, + "description": "A pair of cufflinks with inset aquamarines.", + "color": "light_blue" + }, + { + "id": "emerald_silver_cufflinks", + "copy-from": "garnet_silver_cufflinks", + "type": "ARMOR", + "name": { "str": "emerald and silver cufflinks" }, + "description": "A pair of cufflinks with inset emeralds.", + "color": "green" + }, + { + "id": "alexandrite_silver_cufflinks", + "copy-from": "garnet_silver_cufflinks", + "type": "ARMOR", + "name": { "str": "alexandrite and silver cufflinks" }, + "description": "A pair of cufflinks with inset alexandrites.", + "color": "green" + }, + { + "id": "ruby_silver_cufflinks", + "copy-from": "garnet_silver_cufflinks", + "type": "ARMOR", + "name": { "str": "ruby and silver cufflinks" }, + "description": "A pair of cufflinks with inset rubies." + }, + { + "id": "peridot_silver_cufflinks", + "copy-from": "garnet_silver_cufflinks", + "type": "ARMOR", + "name": { "str": "peridot and silver cufflinks" }, + "description": "A pair of cufflinks with inset peridots.", + "color": "light_green" + }, + { + "id": "sapphire_silver_cufflinks", + "copy-from": "garnet_silver_cufflinks", + "type": "ARMOR", + "name": { "str": "sapphire and silver cufflinks" }, + "description": "A pair of cufflinks with inset sapphires.", + "color": "blue" + }, + { + "id": "tourmaline_silver_cufflinks", + "copy-from": "garnet_silver_cufflinks", + "type": "ARMOR", + "name": { "str": "tourmaline and silver cufflinks" }, + "description": "A pair of cufflinks with inset tourmalines.", + "color": "light_red" + }, + { + "id": "citrine_silver_cufflinks", + "copy-from": "garnet_silver_cufflinks", + "type": "ARMOR", + "name": { "str": "citrine and silver cufflinks" }, + "description": "A pair of cufflinks with inset citrines.", + "color": "yellow" + }, + { + "id": "blue_topaz_silver_cufflinks", + "copy-from": "garnet_silver_cufflinks", + "type": "ARMOR", + "name": { "str": "blue topaz and silver cufflinks" }, + "description": "A pair of cufflinks with inset blue topaz.", + "color": "light_blue" + }, + { + "id": "opal_silver_cufflinks", + "copy-from": "garnet_silver_cufflinks", + "type": "ARMOR", + "name": { "str": "opal and silver cufflinks" }, + "description": "A pair of cufflinks with inset opals.", + "color": "white" + }, + { + "id": "pearl_silver_cufflinks", + "copy-from": "garnet_silver_cufflinks", + "type": "ARMOR", + "name": { "str": "pearl and silver cufflinks" }, + "description": "A pair of cufflinks with inset pearls.", + "color": "white" + }, + { + "id": "garnet_platinum_cufflinks", + "type": "ARMOR", + "name": { "str": "garnet and platinum cufflinks" }, + "description": "A pair of cufflinks with inset garnets.", + "weight": "15 g", + "volume": 0, + "price": 3500, + "price_postapoc": 100, + "material": [ "platinum", "gemstone" ], + "looks_like": "cufflinks", + "symbol": "[", + "color": "red", + "flags": [ "FANCY" ] + }, + { + "id": "diamond_platinum_cufflinks", + "copy-from": "garnet_platinum_cufflinks", + "type": "ARMOR", + "name": { "str": "diamond and platinum cufflinks" }, + "description": "A pair of cufflinks with inset diamonds.", + "material": [ "platinum", "diamond" ], + "color": "white" + }, + { + "id": "amethyst_platinum_cufflinks", + "copy-from": "garnet_platinum_cufflinks", + "type": "ARMOR", + "name": { "str": "amethyst and platinum cufflinks" }, + "description": "A pair of cufflinks with inset amethysts.", + "color": "blue" + }, + { + "id": "aquamarine_platinum_cufflinks", + "copy-from": "garnet_platinum_cufflinks", + "type": "ARMOR", + "name": { "str": "aquamarine and platinum cufflinks" }, + "description": "A pair of cufflinks with inset aquamarines.", + "color": "light_blue" + }, + { + "id": "emerald_platinum_cufflinks", + "copy-from": "garnet_platinum_cufflinks", + "type": "ARMOR", + "name": { "str": "emerald and platinum cufflinks" }, + "description": "A pair of cufflinks with inset emeralds.", + "color": "green" + }, + { + "id": "alexandrite_platinum_cufflinks", + "copy-from": "garnet_platinum_cufflinks", + "type": "ARMOR", + "name": { "str": "alexandrite and platinum cufflinks" }, + "description": "A pair of cufflinks with inset alexandrites.", + "color": "green" + }, + { + "id": "ruby_platinum_cufflinks", + "copy-from": "garnet_platinum_cufflinks", + "type": "ARMOR", + "name": { "str": "ruby and platinum cufflinks" }, + "description": "A pair of cufflinks with inset rubies." + }, + { + "id": "peridot_platinum_cufflinks", + "copy-from": "garnet_platinum_cufflinks", + "type": "ARMOR", + "name": { "str": "peridot and platinum cufflinks" }, + "description": "A pair of cufflinks with inset peridots.", + "color": "light_green" + }, + { + "id": "sapphire_platinum_cufflinks", + "copy-from": "garnet_platinum_cufflinks", + "type": "ARMOR", + "name": { "str": "sapphire and platinum cufflinks" }, + "description": "A pair of cufflinks with inset sapphires.", + "color": "blue" + }, + { + "id": "tourmaline_platinum_cufflinks", + "copy-from": "garnet_platinum_cufflinks", + "type": "ARMOR", + "name": { "str": "tourmaline and platinum cufflinks" }, + "description": "A pair of cufflinks with inset tourmalines.", + "color": "light_red" + }, + { + "id": "citrine_platinum_cufflinks", + "copy-from": "garnet_platinum_cufflinks", + "type": "ARMOR", + "name": { "str": "citrine and platinum cufflinks" }, + "description": "A pair of cufflinks with inset citrines.", + "color": "yellow" + }, + { + "id": "blue_topaz_platinum_cufflinks", + "copy-from": "garnet_platinum_cufflinks", + "type": "ARMOR", + "name": { "str": "blue topaz and platinum cufflinks" }, + "description": "A pair of cufflinks with inset blue topaz.", + "color": "light_blue" + }, + { + "id": "opal_platinum_cufflinks", + "copy-from": "garnet_platinum_cufflinks", + "type": "ARMOR", + "name": { "str": "opal and platinum cufflinks" }, + "description": "A pair of cufflinks with inset opals.", + "color": "white" + }, + { + "id": "pearl_platinum_cufflinks", + "copy-from": "garnet_platinum_cufflinks", + "type": "ARMOR", + "name": { "str": "pearl and platinum cufflinks" }, + "description": "A pair of cufflinks with inset pearls.", + "color": "white" + }, { "id": "ear_spool", "type": "ARMOR", @@ -2191,5 +2548,728 @@ "name": { "str": "pearl and platinum bracelet" }, "description": "A platinum bracelet with pearls. You can wear it if you like, but it won't provide any effects.", "color": "white" + }, + { + "id": "garnet_gold_pendant_necklace", + "type": "ARMOR", + "name": { "str": "garnet and gold necklace" }, + "description": "A shiny, gold necklace adorned with a garnet pendant. You can wear it if you like, but it won't provide any effects.", + "weight": "70 g", + "volume": 0, + "price": 50000, + "price_postapoc": 6000, + "material": [ "gold", "gemstone" ], + "looks_like": "gold_necklace", + "symbol": "[", + "color": "red", + "flags": [ "FANCY" ] + }, + { + "id": "diamond_gold_pendant_necklace", + "copy-from": "garnet_gold_pendant_necklace", + "type": "ARMOR", + "name": { "str": "diamond and gold pendant necklace" }, + "description": "A shiny, gold necklace adorned with a diamond pendant. You can wear it if you like, but it won't provide any effects.", + "material": [ "gold", "diamond" ], + "color": "white" + }, + { + "id": "amethyst_gold_pendant_necklace", + "copy-from": "garnet_gold_pendant_necklace", + "type": "ARMOR", + "name": { "str": "amethyst and gold pendant necklace" }, + "description": "A shiny, gold necklace adorned with a amethyst pendant. You can wear it if you like, but it won't provide any effects.", + "color": "blue" + }, + { + "id": "aquamarine_gold_pendant_necklace", + "copy-from": "garnet_gold_pendant_necklace", + "type": "ARMOR", + "name": { "str": "aquamarine and gold pendant necklace" }, + "description": "A shiny, gold necklace adorned with a aquamarine pendant. You can wear it if you like, but it won't provide any effects.", + "color": "light_blue" + }, + { + "id": "emerald_gold_pendant_necklace", + "copy-from": "garnet_gold_pendant_necklace", + "type": "ARMOR", + "name": { "str": "emerald and gold pendant necklace" }, + "description": "A shiny, gold necklace adorned with a emerald pendant. You can wear it if you like, but it won't provide any effects.", + "color": "green" + }, + { + "id": "alexandrite_gold_pendant_necklace", + "copy-from": "garnet_gold_pendant_necklace", + "type": "ARMOR", + "name": { "str": "alexandrite and gold pendant necklace" }, + "description": "A shiny, gold necklace adorned with a alexandrite pendant. You can wear it if you like, but it won't provide any effects.", + "color": "green" + }, + { + "id": "ruby_gold_pendant_necklace", + "copy-from": "garnet_gold_pendant_necklace", + "type": "ARMOR", + "name": { "str": "ruby and gold pendant necklace" }, + "description": "A shiny, gold necklace adorned with a ruby pendant. You can wear it if you like, but it won't provide any effects." + }, + { + "id": "peridot_gold_pendant_necklace", + "copy-from": "garnet_gold_pendant_necklace", + "type": "ARMOR", + "name": { "str": "peridot and gold pendant necklace" }, + "description": "A shiny, gold necklace adorned with a peridot pendant. You can wear it if you like, but it won't provide any effects.", + "color": "light_green" + }, + { + "id": "sapphire_gold_pendant_necklace", + "copy-from": "garnet_gold_pendant_necklace", + "type": "ARMOR", + "name": { "str": "sapphire and gold pendant necklace" }, + "description": "A shiny, gold necklace adorned with a sapphire pendant. You can wear it if you like, but it won't provide any effects.", + "color": "blue" + }, + { + "id": "tourmaline_gold_pendant_necklace", + "copy-from": "garnet_gold_pendant_necklace", + "type": "ARMOR", + "name": { "str": "tourmaline and gold pendant necklace" }, + "description": "A shiny, gold necklace adorned with a tourmaline pendant. You can wear it if you like, but it won't provide any effects.", + "color": "light_red" + }, + { + "id": "citrine_gold_pendant_necklace", + "copy-from": "garnet_gold_pendant_necklace", + "type": "ARMOR", + "name": { "str": "citrine and gold pendant necklace" }, + "description": "A shiny, gold necklace adorned with a citrine pendant. You can wear it if you like, but it won't provide any effects.", + "color": "yellow" + }, + { + "id": "blue_topaz_gold_pendant_necklace", + "copy-from": "garnet_gold_pendant_necklace", + "type": "ARMOR", + "name": { "str": "blue topaz and gold pendant necklace" }, + "description": "A shiny, gold necklace adorned with a blue topaz pendant. You can wear it if you like, but it won't provide any effects.", + "color": "light_blue" + }, + { + "id": "opal_gold_pendant_necklace", + "copy-from": "garnet_gold_pendant_necklace", + "type": "ARMOR", + "name": { "str": "opal and gold pendant necklace" }, + "description": "A shiny, gold necklace adorned with a opal pendant. You can wear it if you like, but it won't provide any effects.", + "color": "white" + }, + { + "id": "pearl_gold_pendant_necklace", + "copy-from": "garnet_gold_pendant_necklace", + "type": "ARMOR", + "name": { "str": "pearl and gold pendant necklace" }, + "description": "A shiny, gold necklace adorned with a pearl pendant. You can wear it if you like, but it won't provide any effects.", + "color": "white" + }, + { + "id": "garnet_silver_pendant_necklace", + "type": "ARMOR", + "name": { "str": "garnet and silver necklace" }, + "description": "A shiny, silver necklace adorned with a garnet pendant. You can wear it if you like, but it won't provide any effects.", + "weight": "70 g", + "volume": 0, + "price": 50000, + "price_postapoc": 6000, + "material": [ "silver", "gemstone" ], + "looks_like": "silver_necklace", + "symbol": "[", + "color": "red", + "flags": [ "FANCY" ] + }, + { + "id": "diamond_silver_pendant_necklace", + "copy-from": "garnet_silver_pendant_necklace", + "type": "ARMOR", + "name": { "str": "diamond and silver pendant necklace" }, + "description": "A shiny, silver necklace adorned with a diamond pendant. You can wear it if you like, but it won't provide any effects.", + "material": [ "silver", "diamond" ], + "color": "white" + }, + { + "id": "amethyst_silver_pendant_necklace", + "copy-from": "garnet_silver_pendant_necklace", + "type": "ARMOR", + "name": { "str": "amethyst and silver pendant necklace" }, + "description": "A shiny, silver necklace adorned with a amethyst pendant. You can wear it if you like, but it won't provide any effects.", + "color": "blue" + }, + { + "id": "aquamarine_silver_pendant_necklace", + "copy-from": "garnet_silver_pendant_necklace", + "type": "ARMOR", + "name": { "str": "aquamarine and silver pendant necklace" }, + "description": "A shiny, silver necklace adorned with a aquamarine pendant. You can wear it if you like, but it won't provide any effects.", + "color": "light_blue" + }, + { + "id": "emerald_silver_pendant_necklace", + "copy-from": "garnet_silver_pendant_necklace", + "type": "ARMOR", + "name": { "str": "emerald and silver pendant necklace" }, + "description": "A shiny, silver necklace adorned with a emerald pendant. You can wear it if you like, but it won't provide any effects.", + "color": "green" + }, + { + "id": "alexandrite_silver_pendant_necklace", + "copy-from": "garnet_silver_pendant_necklace", + "type": "ARMOR", + "name": { "str": "alexandrite and silver pendant necklace" }, + "description": "A shiny, silver necklace adorned with a alexandrite pendant. You can wear it if you like, but it won't provide any effects.", + "color": "green" + }, + { + "id": "ruby_silver_pendant_necklace", + "copy-from": "garnet_silver_pendant_necklace", + "type": "ARMOR", + "name": { "str": "ruby and silver pendant necklace" }, + "description": "A shiny, silver necklace adorned with a ruby pendant. You can wear it if you like, but it won't provide any effects." + }, + { + "id": "peridot_silver_pendant_necklace", + "copy-from": "garnet_silver_pendant_necklace", + "type": "ARMOR", + "name": { "str": "peridot and silver pendant necklace" }, + "description": "A shiny, silver necklace adorned with a peridot pendant. You can wear it if you like, but it won't provide any effects.", + "color": "light_green" + }, + { + "id": "sapphire_silver_pendant_necklace", + "copy-from": "garnet_silver_pendant_necklace", + "type": "ARMOR", + "name": { "str": "sapphire and silver pendant necklace" }, + "description": "A shiny, silver necklace adorned with a sapphire pendant. You can wear it if you like, but it won't provide any effects.", + "color": "blue" + }, + { + "id": "tourmaline_silver_pendant_necklace", + "copy-from": "garnet_silver_pendant_necklace", + "type": "ARMOR", + "name": { "str": "tourmaline and silver pendant necklace" }, + "description": "A shiny, silver necklace adorned with a tourmaline pendant. You can wear it if you like, but it won't provide any effects.", + "color": "light_red" + }, + { + "id": "citrine_silver_pendant_necklace", + "copy-from": "garnet_silver_pendant_necklace", + "type": "ARMOR", + "name": { "str": "citrine and silver pendant necklace" }, + "description": "A shiny, silver necklace adorned with a citrine pendant. You can wear it if you like, but it won't provide any effects.", + "color": "yellow" + }, + { + "id": "blue_topaz_silver_pendant_necklace", + "copy-from": "garnet_silver_pendant_necklace", + "type": "ARMOR", + "name": { "str": "blue topaz and silver pendant necklace" }, + "description": "A shiny, silver necklace adorned with a blue topaz pendant. You can wear it if you like, but it won't provide any effects.", + "color": "light_blue" + }, + { + "id": "opal_silver_pendant_necklace", + "copy-from": "garnet_silver_pendant_necklace", + "type": "ARMOR", + "name": { "str": "opal and silver pendant necklace" }, + "description": "A shiny, silver necklace adorned with a opal pendant. You can wear it if you like, but it won't provide any effects.", + "color": "white" + }, + { + "id": "pearl_silver_pendant_necklace", + "copy-from": "garnet_silver_pendant_necklace", + "type": "ARMOR", + "name": { "str": "pearl and silver pendant necklace" }, + "description": "A shiny, silver necklace adorned with a pearl pendant. You can wear it if you like, but it won't provide any effects.", + "color": "white" + }, + { + "id": "garnet_platinum_pendant_necklace", + "type": "ARMOR", + "name": { "str": "garnet and platinum necklace" }, + "description": "A shiny, platinum necklace adorned with a garnet pendant. You can wear it if you like, but it won't provide any effects.", + "weight": "70 g", + "volume": 0, + "price": 50000, + "price_postapoc": 6000, + "material": [ "platinum", "gemstone" ], + "looks_like": "platinum_necklace", + "symbol": "[", + "color": "red", + "flags": [ "FANCY" ] + }, + { + "id": "diamond_platinum_pendant_necklace", + "copy-from": "garnet_platinum_pendant_necklace", + "type": "ARMOR", + "name": { "str": "diamond and platinum pendant necklace" }, + "description": "A shiny, platinum necklace adorned with a diamond pendant. You can wear it if you like, but it won't provide any effects.", + "material": [ "platinum", "diamond" ], + "color": "white" + }, + { + "id": "amethyst_platinum_pendant_necklace", + "copy-from": "garnet_platinum_pendant_necklace", + "type": "ARMOR", + "name": { "str": "amethyst and platinum pendant necklace" }, + "description": "A shiny, platinum necklace adorned with a amethyst pendant. You can wear it if you like, but it won't provide any effects.", + "color": "blue" + }, + { + "id": "aquamarine_platinum_pendant_necklace", + "copy-from": "garnet_platinum_pendant_necklace", + "type": "ARMOR", + "name": { "str": "aquamarine and platinum pendant necklace" }, + "description": "A shiny, platinum necklace adorned with a aquamarine pendant. You can wear it if you like, but it won't provide any effects.", + "color": "light_blue" + }, + { + "id": "emerald_platinum_pendant_necklace", + "copy-from": "garnet_platinum_pendant_necklace", + "type": "ARMOR", + "name": { "str": "emerald and platinum pendant necklace" }, + "description": "A shiny, platinum necklace adorned with a emerald pendant. You can wear it if you like, but it won't provide any effects.", + "color": "green" + }, + { + "id": "alexandrite_platinum_pendant_necklace", + "copy-from": "garnet_platinum_pendant_necklace", + "type": "ARMOR", + "name": { "str": "alexandrite and platinum pendant necklace" }, + "description": "A shiny, platinum necklace adorned with a alexandrite pendant. You can wear it if you like, but it won't provide any effects.", + "color": "green" + }, + { + "id": "ruby_platinum_pendant_necklace", + "copy-from": "garnet_platinum_pendant_necklace", + "type": "ARMOR", + "name": { "str": "ruby and platinum pendant necklace" }, + "description": "A shiny, platinum necklace adorned with a ruby pendant. You can wear it if you like, but it won't provide any effects." + }, + { + "id": "peridot_platinum_pendant_necklace", + "copy-from": "garnet_platinum_pendant_necklace", + "type": "ARMOR", + "name": { "str": "peridot and platinum pendant necklace" }, + "description": "A shiny, platinum necklace adorned with a peridot pendant. You can wear it if you like, but it won't provide any effects.", + "color": "light_green" + }, + { + "id": "sapphire_platinum_pendant_necklace", + "copy-from": "garnet_platinum_pendant_necklace", + "type": "ARMOR", + "name": { "str": "sapphire and platinum pendant necklace" }, + "description": "A shiny, platinum necklace adorned with a sapphire pendant. You can wear it if you like, but it won't provide any effects.", + "color": "blue" + }, + { + "id": "tourmaline_platinum_pendant_necklace", + "copy-from": "garnet_platinum_pendant_necklace", + "type": "ARMOR", + "name": { "str": "tourmaline and platinum pendant necklace" }, + "description": "A shiny, platinum necklace adorned with a tourmaline pendant. You can wear it if you like, but it won't provide any effects.", + "color": "light_red" + }, + { + "id": "citrine_platinum_pendant_necklace", + "copy-from": "garnet_platinum_pendant_necklace", + "type": "ARMOR", + "name": { "str": "citrine and platinum pendant necklace" }, + "description": "A shiny, platinum necklace adorned with a citrine pendant. You can wear it if you like, but it won't provide any effects.", + "color": "yellow" + }, + { + "id": "blue_topaz_platinum_pendant_necklace", + "copy-from": "garnet_platinum_pendant_necklace", + "type": "ARMOR", + "name": { "str": "blue topaz and platinum pendant necklace" }, + "description": "A shiny, platinum necklace adorned with a blue topaz pendant. You can wear it if you like, but it won't provide any effects.", + "color": "light_blue" + }, + { + "id": "opal_platinum_pendant_necklace", + "copy-from": "garnet_platinum_pendant_necklace", + "type": "ARMOR", + "name": { "str": "opal and platinum pendant necklace" }, + "description": "A shiny, platinum necklace adorned with a opal pendant. You can wear it if you like, but it won't provide any effects.", + "color": "white" + }, + { + "id": "pearl_platinum_pendant_necklace", + "copy-from": "garnet_platinum_pendant_necklace", + "type": "ARMOR", + "name": { "str": "pearl and platinum pendant necklace" }, + "description": "A shiny, platinum necklace adorned with a pearl pendant. You can wear it if you like, but it won't provide any effects.", + "color": "white" + }, + { + "id": "garnet_platinum_tiara", + "type": "ARMOR", + "name": { "str": "garnet and platinum tiara" }, + "description": "A shiny, platinum tiara adorned with garnets.", + "weight": "100 g", + "volume": "100 ml", + "price": 500000, + "price_postapoc": 8000, + "material": [ "platinum", "gemstone" ], + "looks_like": "crown_golden", + "symbol": "[", + "color": "red", + "coverage": 5, + "encumbrance": 1, + "material_thickness": 1, + "flags": [ "SUPER_FANCY" ] + }, + { + "id": "diamond_platinum_tiara", + "copy-from": "garnet_platinum_tiara", + "type": "ARMOR", + "name": { "str": "diamond and platinum tiara" }, + "description": "A shiny, platinum tiara adorned with diamonds.", + "material": [ "platinum", "diamond" ], + "color": "white" + }, + { + "id": "amethyst_platinum_tiara", + "copy-from": "garnet_platinum_tiara", + "type": "ARMOR", + "name": { "str": "amethyst and platinum tiara" }, + "description": "A shiny, platinum tiara adorned with amethyst.", + "color": "blue" + }, + { + "id": "aquamarine_platinum_tiara", + "copy-from": "garnet_platinum_tiara", + "type": "ARMOR", + "name": { "str": "aquamarine and platinum tiara" }, + "description": "A shiny, platinum tiara adorned with aquamarine.", + "color": "light_blue" + }, + { + "id": "emerald_platinum_tiara", + "copy-from": "garnet_platinum_tiara", + "type": "ARMOR", + "name": { "str": "emerald and platinum tiara" }, + "description": "A shiny, platinum tiara adorned with emeralds.", + "color": "green" + }, + { + "id": "alexandrite_platinum_tiara", + "copy-from": "garnet_platinum_tiara", + "type": "ARMOR", + "name": { "str": "alexandrite and platinum tiara" }, + "description": "A shiny, platinum tiara adorned with alexandrites.", + "color": "green" + }, + { + "id": "ruby_platinum_tiara", + "copy-from": "garnet_platinum_tiara", + "type": "ARMOR", + "name": { "str": "ruby and platinum tiara" }, + "description": "A shiny, platinum tiara adorned with rubies." + }, + { + "id": "peridot_platinum_tiara", + "copy-from": "garnet_platinum_tiara", + "type": "ARMOR", + "name": { "str": "peridot and platinum tiara" }, + "description": "A shiny, platinum tiara adorned with peridots.", + "color": "light_green" + }, + { + "id": "sapphire_platinum_tiara", + "copy-from": "garnet_platinum_tiara", + "type": "ARMOR", + "name": { "str": "sapphire and platinum tiara" }, + "description": "A shiny, platinum tiara adorned with sapphires.", + "color": "blue" + }, + { + "id": "tourmaline_platinum_tiara", + "copy-from": "garnet_platinum_tiara", + "type": "ARMOR", + "name": { "str": "tourmaline and platinum tiara" }, + "description": "A shiny, platinum tiara adorned with tourmalines.", + "color": "light_red" + }, + { + "id": "citrine_platinum_tiara", + "copy-from": "garnet_platinum_tiara", + "type": "ARMOR", + "name": { "str": "citrine and platinum tiara" }, + "description": "A shiny, platinum tiara adorned with citrines.", + "color": "yellow" + }, + { + "id": "blue_topaz_platinum_tiara", + "copy-from": "garnet_platinum_tiara", + "type": "ARMOR", + "name": { "str": "blue topaz and platinum tiara" }, + "description": "A shiny, platinum tiara adorned with blue topaz.", + "color": "light_blue" + }, + { + "id": "opal_platinum_tiara", + "copy-from": "garnet_platinum_tiara", + "type": "ARMOR", + "name": { "str": "opal and platinum tiara" }, + "description": "A shiny, platinum tiara adorned with opals.", + "color": "white" + }, + { + "id": "pearl_platinum_tiara", + "copy-from": "garnet_platinum_tiara", + "type": "ARMOR", + "name": { "str": "pearl and platinum tiara" }, + "description": "A shiny, platinum tiara adorned with pearls.", + "color": "white" + }, + { + "id": "garnet_gold_tiara", + "type": "ARMOR", + "name": { "str": "garnet and gold tiara" }, + "description": "A shiny, gold tiara adorned with garnets.", + "weight": "100 g", + "volume": "100 ml", + "price": 400000, + "price_postapoc": 6000, + "material": [ "gold", "gemstone" ], + "looks_like": "crown_golden", + "symbol": "[", + "color": "red", + "coverage": 5, + "encumbrance": 1, + "material_thickness": 1, + "flags": [ "SUPER_FANCY" ] + }, + { + "id": "diamond_gold_tiara", + "copy-from": "garnet_gold_tiara", + "type": "ARMOR", + "name": { "str": "diamond and gold tiara" }, + "description": "A shiny, gold tiara adorned with diamonds.", + "material": [ "gold", "diamond" ], + "color": "white" + }, + { + "id": "amethyst_gold_tiara", + "copy-from": "garnet_gold_tiara", + "type": "ARMOR", + "name": { "str": "amethyst and gold tiara" }, + "description": "A shiny, gold tiara adorned with amethyst.", + "color": "blue" + }, + { + "id": "aquamarine_gold_tiara", + "copy-from": "garnet_gold_tiara", + "type": "ARMOR", + "name": { "str": "aquamarine and gold tiara" }, + "description": "A shiny, gold tiara adorned with aquamarine.", + "color": "light_blue" + }, + { + "id": "emerald_gold_tiara", + "copy-from": "garnet_gold_tiara", + "type": "ARMOR", + "name": { "str": "emerald and gold tiara" }, + "description": "A shiny, gold tiara adorned with emeralds.", + "color": "green" + }, + { + "id": "alexandrite_gold_tiara", + "copy-from": "garnet_gold_tiara", + "type": "ARMOR", + "name": { "str": "alexandrite and gold tiara" }, + "description": "A shiny, gold tiara adorned with alexandrites.", + "color": "green" + }, + { + "id": "ruby_gold_tiara", + "copy-from": "garnet_gold_tiara", + "type": "ARMOR", + "name": { "str": "ruby and gold tiara" }, + "description": "A shiny, gold tiara adorned with rubies." + }, + { + "id": "peridot_gold_tiara", + "copy-from": "garnet_gold_tiara", + "type": "ARMOR", + "name": { "str": "peridot and gold tiara" }, + "description": "A shiny, gold tiara adorned with peridots.", + "color": "light_green" + }, + { + "id": "sapphire_gold_tiara", + "copy-from": "garnet_gold_tiara", + "type": "ARMOR", + "name": { "str": "sapphire and gold tiara" }, + "description": "A shiny, gold tiara adorned with sapphires.", + "color": "blue" + }, + { + "id": "tourmaline_gold_tiara", + "copy-from": "garnet_gold_tiara", + "type": "ARMOR", + "name": { "str": "tourmaline and gold tiara" }, + "description": "A shiny, gold tiara adorned with tourmalines.", + "color": "light_red" + }, + { + "id": "citrine_gold_tiara", + "copy-from": "garnet_gold_tiara", + "type": "ARMOR", + "name": { "str": "citrine and gold tiara" }, + "description": "A shiny, gold tiara adorned with citrines.", + "color": "yellow" + }, + { + "id": "blue_topaz_gold_tiara", + "copy-from": "garnet_gold_tiara", + "type": "ARMOR", + "name": { "str": "blue topaz and gold tiara" }, + "description": "A shiny, gold tiara adorned with blue topaz.", + "color": "light_blue" + }, + { + "id": "opal_gold_tiara", + "copy-from": "garnet_gold_tiara", + "type": "ARMOR", + "name": { "str": "opal and gold tiara" }, + "description": "A shiny, gold tiara adorned with opals.", + "color": "white" + }, + { + "id": "pearl_gold_tiara", + "copy-from": "garnet_gold_tiara", + "type": "ARMOR", + "name": { "str": "pearl and gold tiara" }, + "description": "A shiny, gold tiara adorned with pearls.", + "color": "white" + }, + { + "id": "garnet_silver_tiara", + "type": "ARMOR", + "name": { "str": "garnet and silver tiara" }, + "description": "A shiny, silver tiara adorned with garnets.", + "weight": "100 g", + "volume": "100 ml", + "price": 200000, + "price_postapoc": 2000, + "material": [ "silver", "gemstone" ], + "looks_like": "crown_golden", + "symbol": "[", + "color": "red", + "coverage": 5, + "encumbrance": 1, + "material_thickness": 1, + "flags": [ "SUPER_FANCY" ] + }, + { + "id": "diamond_silver_tiara", + "copy-from": "garnet_silver_tiara", + "type": "ARMOR", + "name": { "str": "diamond and silver tiara" }, + "description": "A shiny, silver tiara adorned with diamonds.", + "material": [ "silver", "diamond" ], + "color": "white" + }, + { + "id": "amethyst_silver_tiara", + "copy-from": "garnet_silver_tiara", + "type": "ARMOR", + "name": { "str": "amethyst and silver tiara" }, + "description": "A shiny, silver tiara adorned with amethyst.", + "color": "blue" + }, + { + "id": "aquamarine_silver_tiara", + "copy-from": "garnet_silver_tiara", + "type": "ARMOR", + "name": { "str": "aquamarine and silver tiara" }, + "description": "A shiny, silver tiara adorned with aquamarine.", + "color": "light_blue" + }, + { + "id": "emerald_silver_tiara", + "copy-from": "garnet_silver_tiara", + "type": "ARMOR", + "name": { "str": "emerald and silver tiara" }, + "description": "A shiny, silver tiara adorned with emeralds.", + "color": "green" + }, + { + "id": "alexandrite_silver_tiara", + "copy-from": "garnet_silver_tiara", + "type": "ARMOR", + "name": { "str": "alexandrite and silver tiara" }, + "description": "A shiny, silver tiara adorned with alexandrites.", + "color": "green" + }, + { + "id": "ruby_silver_tiara", + "copy-from": "garnet_silver_tiara", + "type": "ARMOR", + "name": { "str": "ruby and silver tiara" }, + "description": "A shiny, silver tiara adorned with rubies." + }, + { + "id": "peridot_silver_tiara", + "copy-from": "garnet_silver_tiara", + "type": "ARMOR", + "name": { "str": "peridot and silver tiara" }, + "description": "A shiny, silver tiara adorned with peridots.", + "color": "light_green" + }, + { + "id": "sapphire_silver_tiara", + "copy-from": "garnet_silver_tiara", + "type": "ARMOR", + "name": { "str": "sapphire and silver tiara" }, + "description": "A shiny, silver tiara adorned with sapphires.", + "color": "blue" + }, + { + "id": "tourmaline_silver_tiara", + "copy-from": "garnet_silver_tiara", + "type": "ARMOR", + "name": { "str": "tourmaline and silver tiara" }, + "description": "A shiny, silver tiara adorned with tourmalines.", + "color": "light_red" + }, + { + "id": "citrine_silver_tiara", + "copy-from": "garnet_silver_tiara", + "type": "ARMOR", + "name": { "str": "citrine and silver tiara" }, + "description": "A shiny, silver tiara adorned with citrines.", + "color": "yellow" + }, + { + "id": "blue_topaz_silver_tiara", + "copy-from": "garnet_silver_tiara", + "type": "ARMOR", + "name": { "str": "blue topaz and silver tiara" }, + "description": "A shiny, silver tiara adorned with blue topaz.", + "color": "light_blue" + }, + { + "id": "opal_silver_tiara", + "copy-from": "garnet_silver_tiara", + "type": "ARMOR", + "name": { "str": "opal and silver tiara" }, + "description": "A shiny, silver tiara adorned with opals.", + "color": "white" + }, + { + "id": "pearl_silver_tiara", + "copy-from": "garnet_silver_tiara", + "type": "ARMOR", + "name": { "str": "pearl and silver tiara" }, + "description": "A shiny, silver tiara adorned with pearls.", + "color": "white" } ] diff --git a/data/json/items/armor/pets_horse_armor.json b/data/json/items/armor/pets_horse_armor.json index c4640b3106bd2..6e68706090474 100644 --- a/data/json/items/armor/pets_horse_armor.json +++ b/data/json/items/armor/pets_horse_armor.json @@ -99,7 +99,7 @@ "type": "PET_ARMOR", "id": "leatherbone_armor_horse", "copy-from": "leather_armor_horse", - "name": "boiled leather horse barding with bones", + "name": { "str": "boiled leather horse barding with bones", "str_pl": "boiled leather horse bardings 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" ] @@ -129,7 +129,7 @@ { "id": "saddlebag", "type": "ARMOR", - "name": "saddle bags", + "name": { "str": "pair of saddle bags", "str_pl": "pairs of saddle bags" }, "description": "A pair of covered pouches laid across the back of a horse behind the saddle.", "weight": "1000 g", "volume": "7500 ml", diff --git a/data/json/items/bionics.json b/data/json/items/bionics.json index c52a5dc389c0b..26e58bd1dc69e 100644 --- a/data/json/items/bionics.json +++ b/data/json/items/bionics.json @@ -19,7 +19,7 @@ "abstract": "bionic_general_npc_usable", "copy-from": "bionic_general", "type": "BIONIC_ITEM", - "name": "abstract bionic module (npc usable)", + "name": { "str": "abstract bionic module (npc usable)", "str_pl": "abstract bionic modules (npc usable)" }, "extend": { "flags": [ "BIONIC_NPC_USABLE" ] } }, { diff --git a/data/json/items/book/archery.json b/data/json/items/book/archery.json index ed857dfb03b06..0f28f9d046a8e 100644 --- a/data/json/items/book/archery.json +++ b/data/json/items/book/archery.json @@ -2,8 +2,7 @@ { "id": "book_archery", "type": "BOOK", - "name": "Lessons for the Novice Bowhunter", - "name_plural": "Lessons for the Novice Bowhunter", + "name": { "str": "Lessons for the Novice Bowhunter", "str_pl": "copies of Lessons for the Novice Bowhunter" }, "description": "This hefty paperback book contains all the information needed for novice archers to get started hunting with a variety of bows and crossbows.", "weight": "932 g", "volume": "1250 ml", @@ -20,8 +19,7 @@ { "id": "mag_archery", "type": "BOOK", - "name": "Archery for Kids", - "name_plural": "Archery for Kids", + "name": { "str": "Archery for Kids", "str_pl": "issues of Archery for Kids" }, "description": "Will you be able to place the arrow right into the bullseye? It is not that easy, but once you know how it's done, you will have a lot of fun with archery.", "weight": "60 g", "volume": "250 ml", @@ -39,8 +37,7 @@ { "id": "manual_archery", "type": "BOOK", - "name": "Zen and the Art of Archery", - "name_plural": "Zen and the Art of Archery", + "name": { "str": "Zen and the Art of Archery", "str_pl": "copies of Zen and the Art of Archery" }, "description": "This massive book contains a wealth of vital information for the novice archer.", "weight": "1454 g", "volume": "1250 ml", diff --git a/data/json/items/book/barter.json b/data/json/items/book/barter.json index d5d04d686add3..3748b0e412fde 100644 --- a/data/json/items/book/barter.json +++ b/data/json/items/book/barter.json @@ -19,8 +19,7 @@ { "id": "manual_business", "type": "BOOK", - "name": "How to Succeed in Business", - "name_plural": "How to Succeed in Business", + "name": { "str": "How to Succeed in Business", "str_pl": "copies of How to Succeed in Business" }, "description": "Useful if you want to get a good deal when purchasing goods.", "weight": "454 g", "volume": "750 ml", @@ -38,8 +37,7 @@ { "id": "textbook_business", "type": "BOOK", - "name": "Advanced Economics", - "name_plural": "Advanced Economics", + "name": { "str": "Advanced Economics", "str_pl": "copies of Advanced Economics" }, "//": "Biz majors can afford it. Surely you're gonna make US$60K/yr out of school, and twice that in five years?", "description": "A college textbook on economics.", "weight": "1587 g", diff --git a/data/json/items/book/bashing.json b/data/json/items/book/bashing.json index fb65d3412d78f..d75d249d200d3 100644 --- a/data/json/items/book/bashing.json +++ b/data/json/items/book/bashing.json @@ -2,8 +2,7 @@ { "id": "mag_bashing", "type": "BOOK", - "name": "Batter Up!", - "name_plural": "Batter Up!", + "name": { "str": "Batter Up!", "str_pl": "issues of Batter Up!" }, "description": "A baseball magazine that focuses on batting tips. There are lots of colorful, full-page photos of skilled athletes demonstrating proper form and technique.", "weight": "80 g", "volume": "250 ml", diff --git a/data/json/items/book/computer.json b/data/json/items/book/computer.json index 3050c8c90b1ad..8cae867a0877e 100644 --- a/data/json/items/book/computer.json +++ b/data/json/items/book/computer.json @@ -2,7 +2,7 @@ { "id": "SICP", "type": "BOOK", - "name": "SICP", + "name": { "str": "SICP", "str_pl": "copies of SICP" }, "description": "A classic text, \"The Structure and Interpretation of Computer Programs.\" Written with examples in LISP, but applicable to any language.", "weight": "1587 g", "volume": "1500 ml", @@ -22,8 +22,7 @@ { "id": "computer_science", "type": "BOOK", - "name": "Computer Science 301", - "name_plural": "Computer Science 301", + "name": { "str": "Computer Science 301", "str_pl": "copies of Computer Science 301" }, "description": "A college textbook on computer science.", "weight": "1587 g", "volume": "1750 ml", @@ -43,8 +42,7 @@ { "id": "howto_computer", "type": "BOOK", - "name": "How to Browse the Web", - "name_plural": "How to Browse the Web", + "name": { "str": "How to Browse the Web", "str_pl": "copies of How to Browse the Web" }, "description": "Very beginner-level information about computers.", "weight": "454 g", "volume": "750 ml", @@ -61,8 +59,7 @@ { "id": "mag_computer", "type": "BOOK", - "name": "Computer World", - "name_plural": "Computer World", + "name": { "str": "Computer World", "str_pl": "issues of Computer World" }, "description": "An informative magazine all about computers, both hardware and software.", "weight": "80 g", "volume": "250 ml", @@ -79,8 +76,7 @@ { "id": "manual_computers", "type": "BOOK", - "name": "Computer Science 101", - "name_plural": "Computer Science 101", + "name": { "str": "Computer Science 101", "str_pl": "copies of Computer Science 101" }, "//": "College-level textbooks are Cheap at $60.", "description": "An entry-level textbook about computers.", "weight": "462 g", @@ -98,8 +94,7 @@ { "id": "textbook_computer", "type": "BOOK", - "name": "Principles of Advanced Programming", - "name_plural": "Principles of Advanced Programming", + "name": { "str": "Principles of Advanced Programming", "str_pl": "copies of Principles of Advanced Programming" }, "description": "A heavy textbook dedicated to advanced-level software design, written for several different programming languages.", "weight": "2206 g", "volume": "1750 ml", diff --git a/data/json/items/book/cooking.json b/data/json/items/book/cooking.json index e8ec10af443b2..a04ac25028b5c 100644 --- a/data/json/items/book/cooking.json +++ b/data/json/items/book/cooking.json @@ -2,8 +2,7 @@ { "id": "adv_chemistry", "type": "BOOK", - "name": "Advanced Physical Chemistry", - "name_plural": "Advanced Physical Chemistry", + "name": { "str": "Advanced Physical Chemistry", "str_pl": "copies of Advanced Physical Chemistry" }, "description": "A university-level textbook on advanced principles of chemistry, both organic and inorganic.", "weight": "1712 g", "volume": "2 L", @@ -23,7 +22,7 @@ { "id": "brewing_cookbook", "type": "BOOK", - "name": "The Homebrewer's Bible", + "name": { "str": "The Homebrewer's Bible", "str_pl": "copies of The Homebrewer's Bible" }, "description": "A book full of easy-to-follow recipes and useful advice on homebrewing, malting, and fermenting. It even smells faintly of booze.", "weight": "1587 g", "volume": "1500 ml", @@ -43,7 +42,7 @@ { "id": "cookbook", "type": "BOOK", - "name": "Cooking on a Budget", + "name": { "str": "Cooking on a Budget", "str_pl": "copies of Cooking on a Budget" }, "description": "A nice cook book that goes beyond recipes and into the chemistry of food.", "weight": "454 g", "volume": "1 L", @@ -60,8 +59,7 @@ { "id": "cookbook_human", "type": "BOOK", - "name": "To Serve Man", - "name_plural": "To Serve Man", + "name": { "str": "To Serve Man", "str_pl": "copies of To Serve Man" }, "//": "Wasn't commercially traded. ('Parody' only covers so much.) Should get a serious price modifier for non-Cannibals.", "description": "It's… it's a cookbook!", "weight": "454 g", @@ -81,8 +79,7 @@ { "id": "cookbook_italian", "type": "BOOK", - "name": "Cucina Italiana", - "name_plural": "Cucina Italiana", + "name": { "str": "Cucina Italiana", "str_pl": "copies of Cucina Italiana" }, "description": "This cookbook is written in Italian, but handily illustrated with step by step photo instructions.", "weight": "454 g", "volume": "1 L", @@ -100,8 +97,7 @@ { "id": "cookbook_sushi", "type": "BOOK", - "name": "Sushi Made Easy", - "name_plural": "copies of Sushi Made Easy", + "name": { "str": "Sushi Made Easy", "str_pl": "copies of Sushi Made Easy" }, "description": "A simple text for the aspiring sushi lover, this easy to read guide is filled with lots of helpful illustrations for everything from basic rice preparation to setting a proper Japanese table.", "weight": "921 g", "volume": "750 ml", @@ -140,8 +136,7 @@ { "id": "mag_cooking", "type": "BOOK", - "name": "Bon Appetit", - "name_plural": "Bon Appetit", + "name": { "str": "Bon Appetit", "str_pl": "issues of Bon Appetit" }, "description": "Exciting recipes and restaurant reviews. Full of handy tips about cooking.", "weight": "60 g", "volume": "250 ml", @@ -159,7 +154,7 @@ { "id": "mag_glam", "type": "BOOK", - "name": "Glamopolitan", + "name": { "str": "Glamopolitan", "str_pl": "issues of Glamopolitan" }, "description": "This is a full-size glossy women's magazine. There are a few unoriginal recipes and some simple cooking tips somewhere in between the fashion photos and the sex advice columns.", "weight": "160 g", "volume": "500 ml", @@ -177,8 +172,7 @@ { "id": "modern_tanner", "type": "BOOK", - "name": "The Modern Tanner", - "name_plural": "copies of The Modern Tanner", + "name": { "str": "The Modern Tanner", "str_pl": "copies of The Modern Tanner" }, "description": "A in-depth and easy to read guide that details a very modern take on the ancient art of leather tanning.", "weight": "568 g", "volume": "750 ml", @@ -196,8 +190,7 @@ { "id": "recipe_alpha", "type": "BOOK", - "name": "PE050 \"Alpha\": Preliminary Report", - "name_plural": "PE050 \"Alpha\": Preliminary Report", + "name": { "str": "PE050 \"Alpha\": Preliminary Report", "str_pl": "copies of PE050 \"Alpha\": Preliminary Report" }, "description": "This sheaf of papers-dated two weeks before all this started-describes some new chemical formula, and its effects on human subjects. It's stamped \"APPROVED\"…", "weight": "50 g", "volume": "500 ml", @@ -216,8 +209,7 @@ { "id": "recipe_animal", "type": "BOOK", - "name": "lab journal-Dionne", - "name_plural": "lab journals-Dionne", + "name": { "str": "lab journal-Dionne", "str_pl": "lab journals-Dionne" }, "description": "This team logbook details several varieties of mutagenic experiments, focusing on those derived from various Earth fauna. The team seems quite enthusiastic--if not eager--about their results.", "weight": "1700 g", "volume": "500 ml", @@ -236,8 +228,7 @@ { "id": "recipe_chimera", "type": "BOOK", - "name": "PE065 \"Chimera\": Best Practices", - "name_plural": "PE065 \"Chimera\": Best Practices", + "name": { "str": "PE065 \"Chimera\": Best Practices", "str_pl": "copies of PE065 \"Chimera\": Best Practices" }, "description": "This sheaf of papers describes a new chemical formula in detail and supplies instructions for its use as some sort of… crowd-control catalyst? That can't be right…", "weight": "50 g", "volume": "500 ml", @@ -256,8 +247,7 @@ { "id": "recipe_creepy", "type": "BOOK", - "name": "lab journal-Smythe", - "name_plural": "lab journals-Smythe", + "name": { "str": "lab journal-Smythe", "str_pl": "lab journals-Smythe" }, "description": "This team logbook details several varieties of mutagenic experiments, focusing on those derived from flesh contaminated with XE037. The results look promising but the procurement methods seem awfully vague…", "weight": "1700 g", "volume": "500 ml", @@ -295,8 +285,7 @@ { "id": "recipe_labchem", "type": "BOOK", - "name": "chemical reference-CLASSIFIED", - "name_plural": "chemical references-CLASSIFIED", + "name": { "str": "chemical reference-CLASSIFIED", "str_pl": "chemical references-CLASSIFIED" }, "description": "This somewhat technical binder has several intimidating security warnings on the cover, yet guarantees unauthorized readers \"permanent employment, for life\". It contains useful information on \"basic\" chemical projects like methamphetamine and heroin, along with briefing on things called \"XE037\" and \"PE012\".", "weight": "2000 g", "volume": "500 ml", @@ -315,8 +304,7 @@ { "id": "recipe_maiar", "type": "BOOK", - "name": "lab journal-x-|xp", - "name_plural": "lab journals-x-|xp", + "name": { "str": "lab journal-x-|xp", "str_pl": "lab journals-x-|xp" }, "description": "This damaged team logbook lacks (deliberately?) any identifying information, but still contains useful information on several types of mutagen and their development.", "weight": "1700 g", "volume": "500 ml", @@ -335,8 +323,10 @@ { "id": "recipe_medicalmut", "type": "BOOK", - "name": "PE023 \"Medical\": Application and Findings", - "name_plural": "PE023 \"Medical\": Application and Findings", + "name": { + "str": "PE023 \"Medical\": Application and Findings", + "str_pl": "copies of PE023 \"Medical\": Application and Findings" + }, "description": "This binder of highly technical papers describes some new chemical formula, and its effects on human subjects. It's stamped \"APPROVED\"…", "weight": "1934 g", "volume": "1750 ml", @@ -356,8 +346,7 @@ { "id": "recipe_raptor", "type": "BOOK", - "name": "PE070 \"Raptor\": Proposal", - "name_plural": "PE070 \"Raptor\": Proposal", + "name": { "str": "PE070 \"Raptor\": Proposal", "str_pl": "copies of PE070 \"Raptor\": Proposal" }, "description": "This sheaf of papers is a highly speculative proposal for focusing \"PE065\". Scribbled notes throughout seem to think that it might work, but that there's no time.", "weight": "50 g", "volume": "500 ml", @@ -376,8 +365,7 @@ { "id": "recipe_serum", "type": "BOOK", - "name": "Best Practices for Compound Delivery", - "name_plural": "Best Practices for Compound Delivery", + "name": { "str": "Best Practices for Compound Delivery", "str_pl": "copies of Best Practices for Compound Delivery" }, "description": "This internal manual details several varieties of mutagenic experiments, as well as describing the protocols used to concentrate mutagens for quicker results. The authors recommend that researchers ensure that their subjects are well-fed and in good health, as the concentrated serums draw heavily on subjects' bodies.", "weight": "1700 g", "volume": "500 ml", @@ -396,8 +384,7 @@ { "id": "reference_cooking", "type": "BOOK", - "name": "CRC-Merck handbook, 4th edition", - "name_plural": "copies of the CRC-Merck handbook, 4th edition", + "name": { "str": "CRC-Merck Handbook, 4th edition", "str_pl": "copies of CRC-Merck Handbook, 4th edition" }, "description": "This huge hardbound book is a collection of reference data and formulae pertinent to many technical disciplines. If poring over tables of chemical and physical data is your thing, this is the book for you.", "weight": "5790 g", "volume": "1750 ml", @@ -414,9 +401,11 @@ { "id": "scots_cookbook", "type": "BOOK", - "name": "Ye Scots Beuk o Cuikery", - "name_plural": "copies of Ye Scots Beuk o Cuikery", - "//": "That would translate out to The Scottish Book of Cookery, or The Scottish Cookbook.", + "name": { + "//~": "That would translate out to The Scottish Book of Cookery, or The Scottish Cookbook.", + "str": "Ye Scots Beuk o Cuikery", + "str_pl": "copies of Ye Scots Beuk o Cuikery" + }, "description": "A semi-translated cookbook from thirteenth century Scotland. While a bit difficult to read, as there are a disquieting number of illustrations of people stabbing each other mixed amongst the recipes, it provides insights into medieval Scottish culture and fashion as well as new uses for oatmeal, fish, and sheep liver.", "weight": "1887 g", "volume": "1250 ml", diff --git a/data/json/items/book/cutting.json b/data/json/items/book/cutting.json index 8ba1131f47f9b..1d835f80c9d78 100644 --- a/data/json/items/book/cutting.json +++ b/data/json/items/book/cutting.json @@ -2,8 +2,7 @@ { "id": "mag_cutting", "type": "BOOK", - "name": "All About Swords", - "name_plural": "All About Swords", + "name": { "str": "All About Swords", "str_pl": "issues of All About Swords" }, "description": "An interesting magazine that contains information about swords and sword fighting techniques from all across the world.", "weight": "80 g", "volume": "250 ml", @@ -21,8 +20,7 @@ { "id": "manual_cutting", "type": "BOOK", - "name": "knife fighter's notes", - "name_plural": "knife fighter's notes", + "name": { "str": "knife fighter's notes", "str_pl": "knife fighter's notes" }, "description": "It seems to be a guide to edged weapon combat, poorly photocopied and released on spiral- bound paper. Still, there are lots of useful tips for beginners.", "weight": "454 g", "volume": "250 ml", @@ -39,8 +37,7 @@ { "id": "manual_knives", "type": "BOOK", - "name": "Spetsnaz Knife Techniques", - "name_plural": "Spetsnaz Knife Techniques", + "name": { "str": "Spetsnaz Knife Techniques", "str_pl": "copies of Spetsnaz Knife Techniques" }, "description": "A classic Soviet text on the art of attacking with a blade.", "weight": "454 g", "volume": "250 ml", diff --git a/data/json/items/book/dodge.json b/data/json/items/book/dodge.json index f12cb67e9074c..4d87ea352c5cc 100644 --- a/data/json/items/book/dodge.json +++ b/data/json/items/book/dodge.json @@ -2,8 +2,7 @@ { "id": "mag_dodge", "type": "BOOK", - "name": "Dance Dance Dance!", - "name_plural": "Dance Dance Dance!", + "name": { "str": "Dance Dance Dance!", "str_pl": "issues of Dance Dance Dance!" }, "description": "Learn the moves of the trendiest dances right now.", "weight": "60 g", "volume": "250 ml", @@ -21,8 +20,7 @@ { "id": "manual_dodge", "type": "BOOK", - "name": "The Book of Dances", - "name_plural": "Books of Dances", + "name": { "str": "The Book of Dances", "str_pl": "copies of The Book of Dances" }, "description": "This massive antique book documents dances from all around the world in great detail. A perceptive reader could learn a lot about defensive footwork from some of the war dances.", "weight": "2330 g", "volume": "1250 ml", @@ -39,8 +37,7 @@ { "id": "manual_dodge_kid", "type": "BOOK", - "name": "Break a Leg!", - "name_plural": "Break a Leg!", + "name": { "str": "Break a Leg!", "str_pl": "copies of Break a Leg!" }, "description": "The Kids' Guide to Acting and Stagecraft.", "weight": "72 g", "volume": "250 ml", diff --git a/data/json/items/book/driving.json b/data/json/items/book/driving.json index bd4225196c532..b03f8c89770f5 100644 --- a/data/json/items/book/driving.json +++ b/data/json/items/book/driving.json @@ -2,8 +2,7 @@ { "id": "decoy_anarch", "type": "BOOK", - "name": "AAA Guide", - "name_plural": "AAA Guide", + "name": { "str": "AAA Guide", "str_pl": "copies of AAA Guide" }, "description": "A tourist-centric guide to points of interest throughout the country. Though it focuses on the north-central US, the driving sections contain some practical tips on proper driving techniques.", "weight": "220 g", "volume": "500 ml", @@ -39,8 +38,7 @@ { "id": "manual_driving", "type": "BOOK", - "name": "The Rules of the Road", - "name_plural": "The Rules of the Road", + "name": { "str": "The Rules of the Road", "str_pl": "copies of The Rules of the Road" }, "description": "A thick textbook for beginning drivers. It contains chapters on laws, safe vehicle operation, and defensive driving concepts.", "weight": "404 g", "volume": "500 ml", @@ -57,8 +55,7 @@ { "id": "textbook_anarch", "type": "BOOK", - "name": "AAA Guide", - "name_plural": "AAA Guide", + "name": { "str": "AAA Guide", "str_pl": "copies of AAA Guide" }, "description": "A tourist-centric guide to points of interest throughout the country. This particular copy is apparently the Anonymous Anarchist's Annual: the cover conceals a wealth of ways to help stick it to The Man, along with plenty of advice for avoiding police.", "weight": "223 g", "volume": "500 ml", diff --git a/data/json/items/book/electronics.json b/data/json/items/book/electronics.json index d7ff922f69fee..80b15457a23ef 100644 --- a/data/json/items/book/electronics.json +++ b/data/json/items/book/electronics.json @@ -2,8 +2,7 @@ { "id": "advanced_electronics", "type": "BOOK", - "name": "Advanced Electronics", - "name_plural": "Advanced Electronics", + "name": { "str": "Advanced Electronics", "str_pl": "copies of Advanced Electronics" }, "description": "A college textbook on circuit design.", "weight": "1587 g", "volume": "1750 ml", @@ -23,8 +22,7 @@ { "id": "mag_electronics", "type": "BOOK", - "name": "Ham Radio Illustrated", - "name_plural": "Ham Radio Illustrated", + "name": { "str": "Ham Radio Illustrated", "str_pl": "issues of Ham Radio Illustrated" }, "description": "An amusing magazine about ham radio, with lots of diagrams and illustrations for making your own electronic devices.", "weight": "45 g", "volume": "250 ml", @@ -42,8 +40,7 @@ { "id": "manual_electronics", "type": "BOOK", - "name": "What's a Transistor?", - "name_plural": "What's a Transistor?", + "name": { "str": "What's a Transistor?", "str_pl": "copies of What's a Transistor?" }, "description": "A basic manual of electronics and circuit design.", "weight": "454 g", "volume": "750 ml", @@ -60,8 +57,7 @@ { "id": "radio_book", "type": "BOOK", - "name": "Amateur Home Radio for Enthusiasts", - "name_plural": "Amateur Home Radio for Enthusiasts", + "name": { "str": "Amateur Home Radio for Enthusiasts", "str_pl": "copies of Amateur Home Radio for Enthusiasts" }, "description": "A book about ham radio and citizen's band radio. It contains numerous diagrams and illustrations explaining the science behind the electronics.", "weight": "1587 g", "volume": "1750 ml", @@ -100,8 +96,7 @@ { "id": "recipe_augs", "type": "BOOK", - "name": "Augmentative Tech Review", - "name_plural": "Augmentative Tech Review", + "name": { "str": "Augmentative Tech Review", "str_pl": "issues of Augmentative Tech Review" }, "description": "This annual publication covers the various ways in which people use technology to improve their bodies. There are a few in-depth and thoroughly illustrated articles on bionic systems, though they tend to use too much jargon.", "weight": "1909 g", "volume": "500 ml", @@ -120,8 +115,7 @@ { "id": "recipe_lab_elec", "type": "BOOK", - "name": "lab journal-Herrera", - "name_plural": "lab journals-Herrera", + "name": { "str": "lab journal-Herrera", "str_pl": "lab journals-Herrera" }, "description": "This hefty binder contains a multitude of diagrams and technical specifications for various electronic materials. Some of the diagrams use symbols you've not seen before…", "weight": "2000 g", "volume": "500 ml", @@ -140,8 +134,7 @@ { "id": "recipe_mil_augs", "type": "BOOK", - "name": "2XI design binder-CLASSIFIED", - "name_plural": "2XI design binders-CLASSIFIED", + "name": { "str": "2XI design binder-CLASSIFIED", "str_pl": "2XI design binders-CLASSIFIED" }, "description": "This Doubletech Industries binder has several intimidating security warnings on the cover. Probably because it contains complete design specs, technical drawings, and test results for their military-grade bionic implants.", "weight": "1409 g", "volume": "500 ml", @@ -160,8 +153,7 @@ { "id": "repeater_mod_guide", "type": "BOOK", - "name": "plans for a radio repeater mod", - "name_plural": "plans for a radio repeater mod", + "name": { "str": "plans for a radio repeater mod", "str_pl": "plans for a radio repeater mod" }, "description": "Instructions on how to create a mod for a radio station terminal which converts the entire system into a repeater.", "weight": "5 g", "volume": "250 ml", @@ -180,8 +172,7 @@ { "id": "textbook_electronics", "type": "BOOK", - "name": "Electronic Circuit Theory", - "name_plural": "Electronic Circuit Theory", + "name": { "str": "Electronic Circuit Theory", "str_pl": "copies of Electronic Circuit Theory" }, "description": "An advanced college textbook on circuit theory, design, and organization.", "weight": "1587 g", "volume": "1750 ml", @@ -201,8 +192,7 @@ { "id": "textbook_robots", "type": "BOOK", - "name": "Robots for Fun & Profit", - "name_plural": "Robots for Fun & Profit", + "name": { "str": "Robots for Fun & Profit", "str_pl": "copies of Robots for Fun & Profit" }, "description": "A rare book on the design of robots, with lots of helpful step-by-step guides.", "weight": "2063 g", "volume": "2 L", @@ -222,7 +212,7 @@ { "abstract": "schematics_generic", "type": "BOOK", - "name": "schematics generic", + "name": { "str": "schematics", "str_pl": "schematics" }, "description": "seeing this is a bug", "weight": "30 g", "volume": "250 ml", @@ -241,136 +231,119 @@ { "id": "schematics_nursebot", "type": "BOOK", - "name": "nurse bot schematics", - "name_plural": "nurse bot schematics", + "name": { "str": "nurse bot schematics", "str_pl": "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.", "copy-from": "schematics_generic" }, { "id": "schematics_grocerybot", "type": "BOOK", - "name": "grocery bot schematics", - "name_plural": "grocery bot schematics", + "name": { "str": "grocery bot schematics", "str_pl": "grocery bot schematics" }, "description": "Bearing the logo of Uncanny, those are assembly plans, design specs, and technical drawings for the grocery 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" }, { "id": "schematics_copbot", "type": "BOOK", - "name": "police bot schematics", - "name_plural": "police bot schematics", + "name": { "str": "police bot schematics", "str_pl": "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.", "copy-from": "schematics_generic" }, { "id": "schematics_eyebot", "type": "BOOK", - "name": "eyebot schematics", - "name_plural": "eyebot schematics", + "name": { "str": "eyebot schematics", "str_pl": "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.", "copy-from": "schematics_generic" }, { "id": "schematics_secubot", "type": "BOOK", - "name": "security bot schematics", - "name_plural": "security bot schematics", + "name": { "str": "security bot schematics", "str_pl": "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.", "copy-from": "schematics_generic" }, { "id": "schematics_skitterbot", "type": "BOOK", - "name": "skitterbot schematics", - "name_plural": "skitterbot schematics", + "name": { "str": "skitterbot schematics", "str_pl": "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.", "copy-from": "schematics_generic" }, { "id": "schematics_chickenbot", "type": "BOOK", - "name": "chicken walker schematics", - "name_plural": "chicken walker schematics", + "name": { "str": "chicken walker schematics", "str_pl": "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.", "copy-from": "schematics_generic" }, { "id": "schematics_hazmatbot", "type": "BOOK", - "name": "cleaner bot schematics", - "name_plural": "cleaner bot schematics", + "name": { "str": "cleaner bot schematics", "str_pl": "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.", "copy-from": "schematics_generic" }, { "id": "schematics_molebot", "type": "BOOK", - "name": "miner bot schematics", - "name_plural": "miner bot schematics", + "name": { "str": "miner bot schematics", "str_pl": "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.", "copy-from": "schematics_generic" }, { "id": "schematics_riotbot", "type": "BOOK", - "name": "riot control bot schematics", - "name_plural": "riot control bot schematics", + "name": { "str": "riot control bot schematics", "str_pl": "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.", "copy-from": "schematics_generic" }, { "id": "schematics_sciencebot", "type": "BOOK", - "name": "lab defense bot schematics", - "name_plural": "lab defense bot schematics", + "name": { "str": "lab defense bot schematics", "str_pl": "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.", "copy-from": "schematics_generic" }, { "id": "schematics_tankbot", "type": "BOOK", - "name": "tank drone schematics", - "name_plural": "tank drone schematics", + "name": { "str": "tank drone schematics", "str_pl": "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.", "copy-from": "schematics_generic" }, { "id": "schematics_tripod", "type": "BOOK", - "name": "tripod schematics", - "name_plural": "tripod schematics", + "name": { "str": "tripod schematics", "str_pl": "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.", "copy-from": "schematics_generic" }, { "id": "schematics_dispatch", "type": "BOOK", - "name": "dispatch schematics", - "name_plural": "dispatch schematics", + "name": { "str": "dispatch schematics", "str_pl": "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.", "copy-from": "schematics_generic" }, { "id": "schematics_dispatch_military", "type": "BOOK", - "name": "military dispatch schematics", - "name_plural": "military dispatch schematics", + "name": { "str": "military dispatch schematics", "str_pl": "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.", "copy-from": "schematics_generic" }, { "id": "schematics_antimateriel", "type": "BOOK", - "name": "anti-materiel turret schematics", - "name_plural": "anti-materiel turret schematics", + "name": { "str": "anti-materiel turret schematics", "str_pl": "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.", "copy-from": "schematics_generic" }, { "id": "schematics_searchlight", "type": "BOOK", - "name": "milspec searchlight schematics", - "name_plural": "milspec searchlight schematics", + "name": { "str": "milspec searchlight schematics", "str_pl": "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.", "copy-from": "schematics_generic" } diff --git a/data/json/items/book/fabrication.json b/data/json/items/book/fabrication.json index 4e577957a37d2..c8fc6477f7451 100644 --- a/data/json/items/book/fabrication.json +++ b/data/json/items/book/fabrication.json @@ -2,8 +2,7 @@ { "id": "glassblowing_book", "type": "BOOK", - "name": "The Art of Glassblowing", - "name_plural": "The Art of Glassblowing", + "name": { "str": "The Art of Glassblowing", "str_pl": "copies of The Art of Glassblowing" }, "description": "A textbook that illustrates the science and technique of the ancient art of glassblowing.", "weight": "1620 g", "volume": "1250 ml", @@ -22,8 +21,7 @@ { "id": "jewelry_book", "type": "BOOK", - "name": "Antique Adornments", - "name_plural": "Antique Adornments", + "name": { "str": "Antique Adornments", "str_pl": "copies of Antique Adornments" }, "description": "A comprehensive and illustrated history of crown, bracelet, necklace and others.", "weight": "600 g", "volume": "1250 ml", @@ -41,8 +39,7 @@ { "id": "mag_fabrication", "type": "BOOK", - "name": "Crafty Crafter's Quarterly", - "name_plural": "Crafty Crafter's Quarterly", + "name": { "str": "Crafty Crafter's Quarterly", "str_pl": "Crafty Crafter's Quarterlies" }, "description": "A fun quarterly magazine all about macaroni art and things you can make by supergluing found objects together.", "weight": "60 g", "volume": "250 ml", @@ -60,8 +57,7 @@ { "id": "manual_fabrication", "type": "BOOK", - "name": "101 Crafts for Beginners", - "name_plural": "101 Crafts for Beginners", + "name": { "str": "101 Crafts for Beginners", "str_pl": "copies of 101 Crafts for Beginners" }, "description": "A large, paperback book detailing a hundred and one beginner's projects in fabrication.", "weight": "510 g", "volume": "750 ml", @@ -79,8 +75,7 @@ { "id": "recipe_arrows", "type": "BOOK", - "name": "The Fletcher's Friend", - "name_plural": "The Fletcher's Friend", + "name": { "str": "The Fletcher's Friend", "str_pl": "copies of The Fletcher's Friend" }, "description": "This hefty book is devoted to folks looking to handcraft their own arrows. It starts with a hip and snappy disclaimer about the risks, both physical and legal, of using explosives and flammable materials. Look for its companion, \"The Bowyer's Buddy\"!", "weight": "1454 g", "volume": "1250 ml", @@ -98,8 +93,7 @@ { "id": "recipe_bows", "type": "BOOK", - "name": "The Bowyer's Buddy", - "name_plural": "The Bowyer's Buddy", + "name": { "str": "The Bowyer's Buddy", "str_pl": "copies of The Bowyer's Buddy" }, "description": "This hefty book is dedicated to craftsfolk and outdoors-y types looking to make their own bows. It recommends its companion volume \"The Fletcher's Friend\" for instructions on producing their ammunition.", "weight": "1454 g", "volume": "1250 ml", @@ -117,8 +111,7 @@ { "id": "recipe_bullets", "type": "BOOK", - "name": "The Handloader's Helper", - "name_plural": "The Handloader's Helper", + "name": { "str": "The Handloader's Helper", "str_pl": "copies of The Handloader's Helper" }, "description": "Everything you could ever want to know about handloading ammunition, sealed with a… childproof cover. Apparently a liability thing, because the chapter on explosive rounds covers them in excellent detail too.", "weight": "1454 g", "volume": "1500 ml", @@ -155,8 +148,7 @@ { "id": "recipe_lab_cvd", "type": "BOOK", - "name": "lab journal-Gustav", - "name_plural": "lab journals-Gustav", + "name": { "str": "lab journal-Gustav", "str_pl": "lab journals-Gustav" }, "description": "This paper notebook is mostly full of boring logs, experimental observations and notes. Mixed in, however, are musings on how to use the lab's vapor deposition machine to deposit amorphous carbon in a diamond-like form onto common metals. The author's intended goal was a better non-stick frying pan, but you can think of a couple of better uses for it.", "weight": "2000 g", "volume": "500 ml", @@ -175,7 +167,7 @@ { "id": "recipe_melee", "type": "BOOK", - "name": "The Streetfighter's Sidekick", + "name": { "str": "The Streetfighter's Sidekick", "str_pl": "copies of The Streetfighter's Sidekick" }, "description": "A sizable how-to guide for making hand-to-hand combat weapons. Though the processes are thoroughly detailed and several illustrations are provided, they rely heavily on technical jargon. More for machinists-turned-weaponsmiths than streetfighters, really.", "weight": "954 g", "volume": "1500 ml", @@ -193,8 +185,7 @@ { "id": "recipe_mininuke_launch", "type": "BOOK", - "name": "238-NK: Practicality Enhancement", - "name_plural": "238-NK: Practicality Enhancement", + "name": { "str": "238-NK: Practicality Enhancement", "str_pl": "copies of 238-NK: Practicality Enhancement" }, "description": "The authors of this thoroughly researched and documented proposal make a very persuasive case for the adoption of spring-driven nuclear shells. It's stamped \"DENIED\".", "weight": "854 g", "volume": "1500 ml", @@ -212,8 +203,7 @@ { "id": "textbook_armeast", "type": "BOOK", - "name": "The Art of Japanese Armormaking", - "name_plural": "The Art of Japanese Armormaking", + "name": { "str": "The Art of Japanese Armormaking", "str_pl": "copies of The Art of Japanese Armormaking" }, "description": "This in-depth and technical text details various forms of ancient Japanese armor crafting, and is well illustrated with lots of photos.", "weight": "654 g", "volume": "1250 ml", @@ -232,8 +222,7 @@ { "id": "textbook_armschina", "type": "BOOK", - "name": "Arms and Armor of Imperial China", - "name_plural": "Arms and Armor of Imperial China", + "name": { "str": "Arms and Armor of Imperial China", "str_pl": "copies of Arms and Armor of Imperial China" }, "description": "This textbook details the military history of ancient China, with a particular focus on the nature of historical arms and armor. It also details some of the equipment used by other cultures that came into conflict with the empire over various dynasties.", "weight": "654 g", "volume": "1250 ml", @@ -252,8 +241,7 @@ { "id": "textbook_armwest", "type": "BOOK", - "name": "Studies in Historic Armorsmithing", - "name_plural": "Studies in Historic Armorsmithing", + "name": { "str": "Studies in Historic Armorsmithing", "str_pl": "copies of Studies in Historic Armorsmithing" }, "description": "This in-depth and technical text details various forms of ancient European armor crafting, and is well illustrated with lots of photos.", "weight": "654 g", "volume": "1250 ml", @@ -272,7 +260,7 @@ { "id": "textbook_fabrication", "type": "BOOK", - "name": "DIY Compendium", + "name": { "str": "DIY Compendium", "str_pl": "copies of DIY Compendium" }, "description": "A thick, hardbound book detailing countless projects for inventions that claim to improve all aspects of life.", "weight": "2100 g", "volume": "1750 ml", @@ -291,8 +279,7 @@ { "id": "textbook_fireman", "type": "BOOK", - "name": "A History of Firefighting", - "name_plural": "A History of Firefighting", + "name": { "str": "A History of Firefighting", "str_pl": "copies of A History of Firefighting" }, "description": "This in-depth and technical text details the history of firefighting from ancient times into the modern era, with a focus on the technology used to save lives.", "weight": "528 g", "volume": "1 L", @@ -310,8 +297,7 @@ { "id": "textbook_gaswarfare", "type": "BOOK", - "name": "Art and Science of Chemical Warfare", - "name_plural": "Art and Science of Chemical Warfare", + "name": { "str": "Art and Science of Chemical Warfare", "str_pl": "copies of Art and Science of Chemical Warfare" }, "description": "This in-depth and technical text covers the design, development, dissemination of, and defenses against various chemical weapons throughout the centuries. The photographs the author chose make it a difficult read at times, though the information is top-notch.", "weight": "854 g", "volume": "1500 ml", @@ -330,8 +316,7 @@ { "id": "textbook_weapeast", "type": "BOOK", - "name": "The Swords of the Samurai", - "name_plural": "The Swords of the Samurai", + "name": { "str": "The Swords of the Samurai", "str_pl": "copies of The Swords of the Samurai" }, "description": "This in-depth and technical text details various forms of ancient Japanese sword smithing, and is well illustrated with step by step photo instructions.", "weight": "654 g", "volume": "1250 ml", @@ -350,8 +335,7 @@ { "id": "textbook_weapwest", "type": "BOOK", - "name": "The Historic Weaponsmith", - "name_plural": "The Historic Weaponsmith", + "name": { "str": "The Historic Weaponsmith", "str_pl": "copies of The Historic Weaponsmith" }, "description": "This in-depth and technical text details various forms of ancient European weapon smithing, and is well illustrated with step by step photo instructions.", "weight": "654 g", "volume": "1250 ml", @@ -370,8 +354,7 @@ { "id": "welding_book", "type": "BOOK", - "name": "Welding and Metallurgy", - "name_plural": "Welding and Metallurgy", + "name": { "str": "Welding and Metallurgy", "str_pl": "copies of Welding and Metallurgy" }, "description": "A rather technical textbook that illustrates the science and technique of becoming a better welder.", "weight": "2100 g", "volume": "1750 ml", @@ -390,8 +373,7 @@ { "id": "101_carpentry", "type": "BOOK", - "name": "101 Home Repairs", - "name_plural": "101 Home Repairs", + "name": { "str": "101 Home Repairs", "str_pl": "copies of 101 Home Repairs" }, "description": "A paperback book detailing 101 home repair projects the novice carpenter.", "weight": "454 g", "volume": "500 ml", @@ -408,8 +390,7 @@ { "id": "carpentry_book", "type": "BOOK", - "name": "The Complete Home Repair Guide", - "name_plural": "Complete Home Repair Guides", + "name": { "str": "The Complete Home Repair Guide", "str_pl": "copies of The Complete Home Repair Guide" }, "description": "A massive book that details virtually every aspect of remodeling and repairing a home, with concise terminology aimed at experienced carpenters.", "weight": "2490 g", "volume": "2 L", @@ -429,8 +410,7 @@ { "id": "mag_carpentry", "type": "BOOK", - "name": "Birdhouse Monthly", - "name_plural": "Birdhouse Monthlies", + "name": { "str": "Birdhouse Monthly", "str_pl": "Birdhouse Monthlies" }, "description": "A riveting periodical all about birdhouses and their construction.", "weight": "60 g", "volume": "250 ml", @@ -448,8 +428,7 @@ { "id": "manual_carpentry", "type": "BOOK", - "name": "Building for Beginners", - "name_plural": "Building for Beginners", + "name": { "str": "Building for Beginners", "str_pl": "copies of Building for Beginners" }, "description": "A large, paperback book detailing several beginner's projects in construction.", "weight": "454 g", "volume": "500 ml", @@ -466,8 +445,7 @@ { "id": "textbook_carpentry", "type": "BOOK", - "name": "Engineering 301", - "name_plural": "Engineering 301", + "name": { "str": "Engineering 301", "str_pl": "copies of Engineering 301" }, "description": "A textbook on civil engineering and construction.", "weight": "1587 g", "volume": "1500 ml", @@ -487,8 +465,7 @@ { "id": "reference_fabrication1", "type": "BOOK", - "name": "Machinery's Handbook", - "name_plural": "copies of Machinery's Handbook", + "name": { "str": "Machinery's Handbook", "str_pl": "copies of Machinery's Handbook" }, "description": "This classic reference work contains extensive, dense chapters and tables on materials, metrology, toolmaking, gears, threading and more. This recent edition includes extensive data on what was the latest techniques in additive manufacturing. If you need to know how best complete a certain machining operation, the answer lies somewhere in these pages.", "weight": "454 g", "volume": "500 ml", diff --git a/data/json/items/book/firstaid.json b/data/json/items/book/firstaid.json index 2041525d4a31b..d377313f3d07e 100644 --- a/data/json/items/book/firstaid.json +++ b/data/json/items/book/firstaid.json @@ -2,8 +2,7 @@ { "id": "emergency_book", "type": "BOOK", - "name": "Guide to Advanced Emergency Care", - "name_plural": "Guides to Advanced Emergency Care", + "name": { "str": "Guide to Advanced Emergency Care", "str_pl": "copies of Guide to Advanced Emergency Care" }, "description": "A thick textbook for paramedics describing advanced lifesaving procedures and field-expedient care methods.", "weight": "2063 g", "volume": "2 L", @@ -23,8 +22,7 @@ { "id": "mag_firstaid", "type": "BOOK", - "name": "Paramedics", - "name_plural": "Paramedics", + "name": { "str": "Paramedics", "str_pl": "issues of Paramedics" }, "description": "An educational magazine for EMTs.", "weight": "60 g", "volume": "250 ml", @@ -42,8 +40,7 @@ { "id": "manual_first_aid", "type": "BOOK", - "name": "The Big Book of First Aid", - "name_plural": "Big Books of First Aid", + "name": { "str": "The Big Book of First Aid", "str_pl": "copies of The Big Book of First Aid" }, "description": "It's big and heavy, but full of great information about first aid.", "weight": "454 g", "volume": "1250 ml", @@ -60,8 +57,7 @@ { "id": "pocket_firstaid", "type": "BOOK", - "name": "Pocket Guide to First Aid", - "name_plural": "Pocket Guides to First Aid", + "name": { "str": "Pocket Guide to First Aid", "str_pl": "copies of Pocket Guide to First Aid" }, "description": "This pocket-sized leather-bound guide to first aid combines a wealth of concise information with simple to follow instructions and easy to read illustrations.", "weight": "192 g", "volume": "250 ml", @@ -78,7 +74,7 @@ { "id": "textbook_firstaid", "type": "BOOK", - "name": "First Responder Handbook", + "name": { "str": "First Responder Handbook", "str_pl": "copies of First Responder Handbook" }, "//": "College-level textbooks are Cheap at $60. Med book is likely more expensive.", "description": "A hardbound book detailing advanced first aid techniques and field-expedient medical care.", "weight": "1360 g", @@ -98,8 +94,7 @@ { "id": "booklet_firstaid", "type": "BOOK", - "name": "First Aid Kit Instruction Booklet", - "name_plural": "First Aid Kit Instruction Booklets", + "name": { "str": "First Aid Kit Instruction Booklet", "str_pl": "copies of First Aid Kit Instruction Booklet" }, "description": "Illustrated how-to guide for your first aid kit.", "weight": "60 g", "volume": "250 ml", @@ -116,8 +111,7 @@ { "id": "reference_firstaid1", "type": "BOOK", - "name": "Physicians' Desk Reference", - "name_plural": "copies of the Physicians' Desk Reference", + "name": { "str": "Physicians' Desk Reference", "str_pl": "copies of Physicians' Desk Reference" }, "description": "This hefty volume contains all the legally mandated information relevant to physicians for writing prescriptions, generously supported by the efforts and contributions of major pharmaceutical companies. For the most part, it provides information identical to what is available on that of medication packaging inserts, and cannot match the completeness of digital pharmaceutical references like Medisoft. At least it doesn't need power to be used.", "weight": "2268 g", "volume": "500 ml", @@ -134,8 +128,7 @@ { "id": "reference_firstaid2", "type": "BOOK", - "name": "Merck Veterinary Manual", - "name_plural": "copies of The Merck Veterinary Manual", + "name": { "str": "Merck Veterinary Manual", "str_pl": "copies of Merck Veterinary Manual" }, "description": "This expansive text covers 'all domestic species and diseases in veterinary medicine worldwide'. Should you need information regarding zoonotic diseases, off-label use of medication for animals, common dysfunctions and diseases of animals, or any other veterinary reference info, this is your book. There are some interesting new chapters on animal cloning in this edition.", "weight": "5790 g", "volume": "500 ml", diff --git a/data/json/items/book/gun.json b/data/json/items/book/gun.json index 09cd27cf309c8..c6dc427b66eb0 100644 --- a/data/json/items/book/gun.json +++ b/data/json/items/book/gun.json @@ -2,8 +2,7 @@ { "id": "mag_guns", "type": "BOOK", - "name": "Guns n Ammo", - "name_plural": "Guns n Ammo", + "name": { "str": "Guns n Ammo", "str_pl": "issues of Guns n Ammo" }, "description": "Reviews of firearms, and various useful tips about their use.", "weight": "60 g", "volume": "250 ml", @@ -21,7 +20,7 @@ { "id": "manual_gun", "type": "BOOK", - "name": "The Gun Owner's Handbook", + "name": { "str": "The Gun Owner's Handbook", "str_pl": "copies of The Gun Owner's Handbook" }, "description": "A thick soft-cover book that claims to be a complete guide to safely operating, maintaining, and repairing firearms.", "weight": "462 g", "volume": "500 ml", @@ -38,8 +37,7 @@ { "id": "pocket_firearms", "type": "BOOK", - "name": "Pocket Guide to Firearm Safety", - "name_plural": "Pocket Guides to Firearm Safety", + "name": { "str": "Pocket Guide to Firearm Safety", "str_pl": "copies of Pocket Guide to Firearm Safety" }, "description": "This pocket-sized leather-bound guide to firearm safety combines a wealth of concise information with simple to follow instructions and easy to read illustrations.", "weight": "226 g", "volume": "250 ml", diff --git a/data/json/items/book/launcher.json b/data/json/items/book/launcher.json index 40c26ba624071..a8ac9ee8d3ef6 100644 --- a/data/json/items/book/launcher.json +++ b/data/json/items/book/launcher.json @@ -2,8 +2,7 @@ { "id": "mag_launcher", "type": "BOOK", - "name": "High Explosives Quarterly", - "name_plural": "High Explosives Quarterlies", + "name": { "str": "High Explosives Quarterly", "str_pl": "High Explosives Quarterlies" }, "description": "An interesting quarterly report about rocket launchers and recoilless rifles. There are lots of large, exciting photos of explosions and weaponry.", "weight": "90 g", "volume": "250 ml", @@ -21,8 +20,7 @@ { "id": "manual_launcher", "type": "BOOK", - "name": "Jane's Mortars and Rocket Launchers", - "name_plural": "copies of Jane's Mortars and Rocket Launchers", + "name": { "str": "Jane's Mortars and Rocket Launchers", "str_pl": "copies of Jane's Mortars and Rocket Launchers" }, "description": "An incredibly detailed guide to modern rockets, mortars, grenade launchers, and recoilless weaponry. Lavishly illustrated with color photographs, it contains a wealth of information.", "weight": "734 g", "volume": "250 ml", diff --git a/data/json/items/book/mechanics.json b/data/json/items/book/mechanics.json index bc404e925683d..5669d96a9aaf9 100644 --- a/data/json/items/book/mechanics.json +++ b/data/json/items/book/mechanics.json @@ -2,8 +2,7 @@ { "id": "book_icef", "type": "BOOK", - "name": "Internal Combustion Fundamentals", - "name_plural": "Internal Combustion Fundamentals", + "name": { "str": "Internal Combustion Fundamentals", "str_pl": "copies of Internal Combustion Fundamentals" }, "description": "A college-level textbook that details the operation, maintenance, and repair of internal combustion engines.", "weight": "1587 g", "volume": "1500 ml", @@ -24,16 +23,14 @@ "id": "mag_fieldrepair", "copy-from": "book_magazine", "type": "BOOK", - "name": "army improvised field repairs", - "name_plural": "army improvised field repairs", + "name": "army improvised field repairs manual", "description": "A compact manual with faded print detailing a number of improvised field repairs that can be made to vehicles.", "skill": "mechanics" }, { "id": "mag_mechanics", "type": "BOOK", - "name": "Popular Mechanics", - "name_plural": "Popular Mechanics", + "name": { "str": "Popular Mechanics", "str_pl": "issues of Popular Mechanics" }, "description": "A magazine about mechanical innovations. Full of entertaining articles and advertisements for esoteric gadgets.", "weight": "70 g", "volume": "250 ml", @@ -51,7 +48,7 @@ { "id": "manual_mechanics", "type": "BOOK", - "name": "Under the Hood", + "name": { "str": "Under the Hood", "str_pl": "copies of Under the Hood" }, "description": "An advanced mechanics manual, covering all sorts of topics.", "weight": "454 g", "volume": "750 ml", @@ -69,8 +66,7 @@ "id": "textbook_atomic_lab", "type": "BOOK", "copy-from": "recipe_lab_cvd", - "name": "lab journal-Curie", - "name_plural": "lab journals-Curie", + "name": { "str": "lab journal-Curie", "str_pl": "lab journals-Curie" }, "description": "This lab notebook is filled with the collective discoveries and refinements of a research team dedicated to nuclear energy. You don't think you're ready to start a second Cataclysm, but the general information provided might be useful…", "skill": "mechanics", "required_level": 6 @@ -78,8 +74,7 @@ { "id": "textbook_biodiesel", "type": "BOOK", - "name": "Biodiesel: Renewable Fuel Resource", - "name_plural": "Biodiesel: Renewable Fuel Resource", + "name": { "str": "Biodiesel: Renewable Fuel Resource", "str_pl": "copies of Biodiesel: Renewable Fuel Resource" }, "description": "A large textbook for college students about biodiesel.", "weight": "1200 g", "volume": "2 L", @@ -98,8 +93,7 @@ { "id": "textbook_mechanics", "type": "BOOK", - "name": "Mechanical Mastery", - "name_plural": "Mechanical Mastery", + "name": { "str": "Mechanical Mastery", "str_pl": "copies of Mechanical Mastery" }, "description": "An advanced guide on mechanics and welding, covering topics like \"Grinding off rust\" and \"Making cursive E's\".", "weight": "1587 g", "volume": "1500 ml", diff --git a/data/json/items/book/melee.json b/data/json/items/book/melee.json index ad4781bd29931..d04e6eee75e83 100644 --- a/data/json/items/book/melee.json +++ b/data/json/items/book/melee.json @@ -2,8 +2,7 @@ { "id": "mag_melee", "type": "BOOK", - "name": "CQB Monthly", - "name_plural": "CQB Monthlies", + "name": { "str": "CQB Monthly", "str_pl": "CQB Monthlies" }, "description": "An in-depth look at various styles of close quarters fighting. There's an amusing essay about dirty tricks in the front section.", "weight": "70 g", "volume": "250 ml", @@ -21,7 +20,7 @@ { "id": "manual_melee", "type": "BOOK", - "name": "Close Quarter Fighting Manual", + "name": { "str": "Close Quarter Fighting Manual", "str_pl": "copies of Close Quarter Fighting Manual" }, "description": "A well-thumbed hardbound book which illustrates simple strategies and techniques for close quarters combat encounters.", "weight": "564 g", "volume": "250 ml", diff --git a/data/json/items/book/misc.json b/data/json/items/book/misc.json index 2910271ea11b2..696ec8657e82e 100644 --- a/data/json/items/book/misc.json +++ b/data/json/items/book/misc.json @@ -2,7 +2,7 @@ { "id": "ZSG", "type": "BOOK", - "name": "Zombie Survival Guide", + "name": { "str": "Zombie Survival Guide", "str_pl": "copies of Zombie Survival Guide" }, "description": "While this seems like it would be very useful in this situation, the sheer amount of misinformation present makes it practically useless.", "weight": "227 g", "volume": "1 L", @@ -53,8 +53,7 @@ { "id": "commune_prospectus", "type": "BOOK", - "name": "Ranch Prospectus", - "name_plural": "Ranch Prospectus", + "name": { "str": "Ranch Prospectus", "str_pl": "Ranch Prospectus" }, "description": "A short paper of the economic viability of constructing an agricultural outpost.", "weight": "1 g", "volume": "250 ml", @@ -86,8 +85,7 @@ { "id": "essay_book", "type": "BOOK", - "name": "book of essays", - "name_plural": "books of essays", + "name": { "str": "book of essays", "str_pl": "books of essays" }, "description": "A collection of essays by various authors from around the world, including works by Churchill, Mailer, Eco, and Voltaire.", "weight": "700 g", "volume": "750 ml", @@ -104,8 +102,7 @@ { "id": "fairy_tales", "type": "BOOK", - "name": "book of fairy tales", - "name_plural": "books of fairy tales", + "name": { "str": "book of fairy tales", "str_pl": "books of fairy tales" }, "description": "An amusing collection of folklore featuring the usual cast of fairies, goblins, and trolls.", "weight": "410 g", "volume": "750 ml", @@ -199,8 +196,7 @@ { "id": "guidebook", "type": "BOOK", - "name": "The Hitchhiker's Guide to the Cataclysm", - "name_plural": "Hitchhiker's Guides to the Cataclysm", + "name": { "str": "The Hitchhiker's Guide to the Cataclysm", "str_pl": "copies of The Hitchhiker's Guide to the Cataclysm" }, "description": "Inscribed on the cover in large, friendly letters, is the message \"Don't Panic\".", "weight": "1764 g", "volume": "1 L", @@ -216,7 +212,7 @@ { "id": "mycenacean_hymns", "type": "BOOK", - "name": "Mycenacean Hymns", + "name": { "str": "Mycenacean Hymns", "str_pl": "copies of Mycenacean Hymns" }, "description": "A vellum book containing the hymns central to Marloss faith. As the verses lead to each other, the text sings of unity and promised paradise.", "weight": "368 g", "volume": "1 L", @@ -233,7 +229,7 @@ { "id": "holybook_bible1", "type": "BOOK", - "name": "King James Bible", + "name": { "str": "King James Bible", "str_pl": "copies of King James Bible" }, "description": "An English translation of the Christian Bible, which originated in England in the early 1600s.", "weight": "368 g", "volume": "1 L", @@ -250,7 +246,7 @@ { "id": "holybook_bible2", "type": "BOOK", - "name": "Eastern Orthodox Bible", + "name": { "str": "Eastern Orthodox Bible", "str_pl": "copies of Eastern Orthodox Bible" }, "description": "An English copy of the Eastern Orthodox translation of The Holy Bible.", "weight": "428 g", "volume": "1250 ml", @@ -267,7 +263,7 @@ { "id": "holybook_bible3", "type": "BOOK", - "name": "Gideon Bible", + "name": { "str": "Gideon Bible", "str_pl": "copies of Gideon Bible" }, "description": "An English translation of the Christian Bible, distributed free of charge by Gideons International.", "weight": "368 g", "volume": "1 L", @@ -284,8 +280,7 @@ { "id": "holybook_granth", "type": "BOOK", - "name": "The Guru Granth Sahib", - "name_plural": "copies of The Guru Granth Sahib", + "name": { "str": "The Guru Granth Sahib", "str_pl": "copies of The Guru Granth Sahib" }, "description": "A single-volume copy of the central religious texts of Sikhism.", "weight": "590 g", "volume": "1 L", @@ -302,7 +297,7 @@ { "id": "holybook_hadith", "type": "BOOK", - "name": "Hadith", + "name": { "str": "Hadith", "str_pl": "copies of Hadith" }, "description": "A Muslim religious text containing an account of the sayings and actions of the prophet Muhammad.", "weight": "398 g", "volume": "1 L", @@ -319,8 +314,7 @@ { "id": "holybook_kallisti", "type": "BOOK", - "name": "Principia Discordia", - "name_plural": "copies of Principia Discordia", + "name": { "str": "Principia Discordia", "str_pl": "copies of Principia Discordia" }, "description": "A book that embodies the main beliefs of Discordianism. It seems to primarily concern chaos, and features a card in the back which informs you that you are now a 'genuine and authorized Pope of Discordia'.", "weight": "292 g", "volume": "1 L", @@ -337,8 +331,7 @@ { "id": "holybook_kojiki", "type": "BOOK", - "name": "The Kojiki", - "name_plural": "copies of The Kojiki", + "name": { "str": "The Kojiki", "str_pl": "copies of The Kojiki" }, "description": "The oldest extant chronicle of Japan's myths and history, the stories contained in the Kojiki are part of the inspiration behind Shinto practices.", "weight": "368 g", "volume": "1 L", @@ -355,8 +348,7 @@ { "id": "holybook_mormon", "type": "BOOK", - "name": "The Book of Mormon", - "name_plural": "copies of The Book of Mormon", + "name": { "str": "The Book of Mormon", "str_pl": "copies of The Book of Mormon" }, "description": "The sacred text of the Latter Day Saint movement of Christianity, originally published in 1830 by Joseph Smith.", "weight": "368 g", "volume": "1 L", @@ -373,8 +365,10 @@ { "id": "holybook_pastafarian", "type": "BOOK", - "name": "The Gospel of the Flying Spaghetti Monster", - "name_plural": "copies of The Gospel of the Flying Spaghetti Monster", + "name": { + "str": "The Gospel of the Flying Spaghetti Monster", + "str_pl": "copies of The Gospel of the Flying Spaghetti Monster" + }, "description": "A book that embodies the main beliefs of the Church of the Flying Spaghetti Monster. It seems to involve a lot of pirates and some sort of invisible drunken monster made of pasta.", "weight": "292 g", "volume": "1 L", @@ -391,7 +385,7 @@ { "id": "holybook_quran", "type": "BOOK", - "name": "Quran", + "name": { "str": "Quran", "str_pl": "copies of Quran" }, "description": "An English translation of the Muslim book of holy scriptures, with explanatory notes and commentaries to aid in understanding.", "weight": "412 g", "volume": "1 L", @@ -408,8 +402,7 @@ { "id": "holybook_scientology", "type": "BOOK", - "name": "Dianetics", - "name_plural": "copies of Dianetics", + "name": { "str": "Dianetics", "str_pl": "copies of Dianetics" }, "description": "This book is the canonical text of Scientology. Written by a science fiction author, it contains self-improvement techniques and musings on psychology called Dianetics.", "weight": "486 g", "volume": "1 L", @@ -426,8 +419,7 @@ { "id": "holybook_slack", "type": "BOOK", - "name": "The Book of the SubGenius", - "name_plural": "copies of The Book of the SubGenius", + "name": { "str": "The Book of the SubGenius", "str_pl": "copies of The Book of the SubGenius" }, "description": "A book about the Church of the SubGenius. It seems to involve a salesman named J. R. \"Bob\" Dobbs and a concept called 'slack'.", "weight": "292 g", "volume": "1 L", @@ -444,8 +436,7 @@ { "id": "holybook_sutras", "type": "BOOK", - "name": "The Sutras of the Buddha", - "name_plural": "copies of The Sutras of the Buddha", + "name": { "str": "The Sutras of the Buddha", "str_pl": "copies of The Sutras of the Buddha" }, "description": "A collection of discourses attributed to the Buddha and his close disciples.", "weight": "496 g", "volume": "1 L", @@ -462,7 +453,7 @@ { "id": "holybook_talmud", "type": "BOOK", - "name": "Talmud", + "name": { "str": "Talmud", "str_pl": "copies of Talmud" }, "description": "One of the central texts of Rabbinic Judaism, the Talmud expounds upon the Hebrew Bible with teachings and opinions of thousands of rabbis.", "weight": "460 g", "volume": "1 L", @@ -479,7 +470,7 @@ { "id": "holybook_tanakh", "type": "BOOK", - "name": "Tanakh", + "name": { "str": "Tanakh", "str_pl": "copies of Tanakh" }, "description": "A single-volume book containing the complete canon of the Jewish Bible.", "weight": "512 g", "volume": "1 L", @@ -496,8 +487,7 @@ { "id": "holybook_tripitaka", "type": "BOOK", - "name": "The Tripitaka", - "name_plural": "copies of the Tripitaka", + "name": { "str": "The Tripitaka", "str_pl": "copies of The Tripitaka" }, "description": "A collection of sacred Buddhist writings describing their canons of scriptures.", "weight": "513 g", "volume": "1 L", @@ -514,8 +504,7 @@ { "id": "holybook_upanishads", "type": "BOOK", - "name": "The Upanishads", - "name_plural": "copies of The Upanishads", + "name": { "str": "The Upanishads", "str_pl": "copies of The Upanishads" }, "description": "A collection of sacred Hindu writings regarding the nature of reality and describing the character and form of human salvation.", "weight": "482 g", "volume": "1 L", @@ -532,8 +521,7 @@ { "id": "holybook_vedas", "type": "BOOK", - "name": "The Four Vedas", - "name_plural": "copies of The Four Vedas", + "name": { "str": "The Four Vedas", "str_pl": "copies of The Four Vedas" }, "description": "A single volume containing all four Vedas, which are the oldest scriptures of Hinduism.", "weight": "540 g", "volume": "1 L", @@ -565,7 +553,7 @@ { "id": "mag_gaming", "type": "BOOK", - "name": "Computer Gaming", + "name": { "str": "Computer Gaming", "str_pl": "issues of Computer Gaming" }, "description": "Reviews of recently released computer games and previews of upcoming titles.", "weight": "60 g", "volume": "250 ml", @@ -597,7 +585,7 @@ { "id": "mag_porn", "type": "BOOK", - "name": "Playboy", + "name": { "str": "Playboy", "str_pl": "issues of Playboy" }, "description": "You can read it for the articles. Or not.", "weight": "60 g", "volume": "250 ml", @@ -614,7 +602,6 @@ "id": "necropolis_freq", "type": "BOOK", "name": "frequency list", - "name_plural": "frequency lists", "description": "A notepad with a number of frequencies scribbled on it.", "weight": "1 g", "volume": "250 ml", @@ -630,7 +617,7 @@ { "id": "news_regional", "type": "BOOK", - "name": "Rural Digest-Examiner", + "name": { "str": "Rural Digest-Examiner", "str_pl": "issues of Rural Digest-Examiner" }, "description": "A newsweekly covering regional events. There is an article on the winter's snowstorms and several letters to the editor concerning the community response.", "weight": "80 g", "volume": "250 ml", @@ -1205,8 +1192,7 @@ { "id": "philosophy_book", "type": "BOOK", - "name": "book of philosophy", - "name_plural": "books of philosophy", + "name": { "str": "book of philosophy", "str_pl": "books of philosophy" }, "description": "A deep discussion of morality with an emphasis on epistemology and logic.", "snippet_category": [ { @@ -1373,7 +1359,6 @@ "id": "phonebook", "type": "BOOK", "name": "phone book", - "name_plural": "phone books", "description": "This hefty volume contains the telephone numbers of individuals, businesses, and utilities in the nearby area, pretty useless during the apocalypse and all.", "weight": "854 g", "volume": "2500 ml", @@ -1408,8 +1393,7 @@ { "id": "plays_book", "type": "BOOK", - "name": "book of plays", - "name_plural": "books of plays", + "name": { "str": "book of plays", "str_pl": "books of plays" }, "description": "A collection of plays by various authors from around the world, including scripts by Wilde, Beckett, Checkov, and Shakespeare.", "weight": "700 g", "volume": "750 ml", @@ -1426,8 +1410,7 @@ { "id": "poetry_book", "type": "BOOK", - "name": "book of poetry", - "name_plural": "books of poetry", + "name": { "str": "book of poetry", "str_pl": "books of poetry" }, "description": "A collection of poetry by various authors from around the world, including writings by Dickinson, Goethe, Thoreau, and Yeats.", "weight": "400 g", "volume": "500 ml", @@ -1444,8 +1427,7 @@ { "id": "priest_diary", "type": "BOOK", - "name": "priest's diary", - "name_plural": "priest's diaries", + "name": { "str": "priest's diary", "str_pl": "priests' diaries" }, "description": "A small book filled with journal entries in Latin.", "weight": "340 g", "volume": "750 ml", @@ -1480,8 +1462,7 @@ { "id": "record_patient", "type": "BOOK", - "name": "patient treatment records", - "name_plural": "patient treatment records", + "name": { "str": "patient treatment records", "str_pl": "patient treatment records" }, "description": "A massive stack of medical records that contain every gory detail.", "weight": "680 g", "volume": "1500 ml", @@ -1498,8 +1479,7 @@ { "id": "record_weather", "type": "BOOK", - "name": "national weather transcripts", - "name_plural": "national weather transcripts", + "name": { "str": "national weather transcripts", "str_pl": "national weather transcripts" }, "description": "Old weather records are about as interesting as a rock.", "weight": "454 g", "volume": "1750 ml", @@ -1516,8 +1496,7 @@ { "id": "story_book", "type": "BOOK", - "name": "big book of short stories", - "name_plural": "big books of short stories", + "name": { "str": "big book of short stories", "str_pl": "big books of short stories" }, "description": "This humongous volume contains a vast collection of short stories by different authors, spanning a wide variety of topics and genres.", "weight": "1720 g", "volume": "1 L", @@ -1534,8 +1513,7 @@ { "id": "tall_tales", "type": "BOOK", - "name": "book of tall tales", - "name_plural": "books of tall tales", + "name": { "str": "book of tall tales", "str_pl": "books of tall tales" }, "description": "An entertaining collection of early American folklore, featuring tales of larger than life individuals and their amazing adventures.", "weight": "360 g", "volume": "750 ml", @@ -1552,8 +1530,7 @@ { "id": "visions_solitude", "type": "BOOK", - "name": "Visions in Solitude", - "name_plural": "Visions in Solitude", + "name": { "str": "Visions in Solitude", "str_pl": "copies of Visions in Solitude" }, "description": "A small book detailing 'visions' a prisoner had on death row.", "weight": "227 g", "volume": "750 ml", @@ -1571,8 +1548,7 @@ { "id": "holybook_havamal", "type": "BOOK", - "name": "Hávamál", - "name_plural": "copies of Hávamál", + "name": { "str": "Hávamál", "str_pl": "copies of Hávamál" }, "description": "An English translation of several Old Norse poems. The poems contain proverbs and stories attributed to the god Odin, many transcribed from oral history.", "weight": "292 g", "volume": "750 ml", @@ -1589,8 +1565,7 @@ { "type": "BOOK", "id": "classic_literature", - "name": "book of classic literature", - "name_plural": "books of classic literature", + "name": { "str": "book of classic literature", "str_pl": "books of classic literature" }, "description": "A book of classic literature, timeless and enjoyable but a bit dense to read.", "snippet_category": [ { "id": "classic1", "text": "This is a copy of Dickens' \"Bleak House\"." }, @@ -1706,8 +1681,7 @@ { "type": "BOOK", "id": "collector_book", - "name": "collector's edition book", - "name_plural": "collector's edition book", + "name": { "str": "collector's edition book", "str_pl": "collector's edition books" }, "description": "A unique, valuable book that has been kept as a collector's item.", "snippet_category": [ { "id": "fancy1", "text": "This is a high-quality leather bound copy of Charles Dickens' \"A Tale of Two Cities\"." }, diff --git a/data/json/items/book/pistol.json b/data/json/items/book/pistol.json index fef628353557d..fd430f258c2c5 100644 --- a/data/json/items/book/pistol.json +++ b/data/json/items/book/pistol.json @@ -2,7 +2,7 @@ { "id": "mag_pistol", "type": "BOOK", - "name": "Tactical Handgun Digest", + "name": { "str": "Tactical Handgun Digest", "str_pl": "issues of Tactical Handgun Digest" }, "description": "A glossy magazine all about handguns and shooting. There is a good article about proper sighting near the middle.", "weight": "90 g", "volume": "250 ml", @@ -20,8 +20,7 @@ { "id": "manual_pistol", "type": "BOOK", - "name": "The Tao of the Handgun", - "name_plural": "copies of The Tao of the Handgun", + "name": { "str": "The Tao of the Handgun", "str_pl": "copies of The Tao of the Handgun" }, "description": "This introspective volume covers proper usage of handguns, from safety and stance, to maintenance and proper sighting technique.", "weight": "440 g", "volume": "500 ml", diff --git a/data/json/items/book/rifle.json b/data/json/items/book/rifle.json index 1cbb9a5d5a524..ea8152753836f 100644 --- a/data/json/items/book/rifle.json +++ b/data/json/items/book/rifle.json @@ -2,8 +2,7 @@ { "id": "mag_rifle", "type": "BOOK", - "name": "Modern Rifleman", - "name_plural": "Modern Rifleman", + "name": { "str": "Modern Rifleman", "str_pl": "issues of Modern Rifleman" }, "description": "An informative magazine all about rifles and shooting. There is an excellent article about proper maintenance in this issue.", "weight": "100 g", "volume": "250 ml", diff --git a/data/json/items/book/shotgun.json b/data/json/items/book/shotgun.json index c1c70b3f9c50f..bfab71b29a5a4 100644 --- a/data/json/items/book/shotgun.json +++ b/data/json/items/book/shotgun.json @@ -2,8 +2,7 @@ { "id": "mag_shotgun", "type": "BOOK", - "name": "Trap and Field", - "name_plural": "Trap and Field", + "name": { "str": "Trap and Field", "str_pl": "issues of Trap and Field" }, "description": "An in-depth magazine all about shotguns and shooting. There is an informative article about proper shooting stance in the back pages.", "weight": "90 g", "volume": "250 ml", @@ -21,8 +20,7 @@ { "id": "manual_shotgun", "type": "BOOK", - "name": "Shotguns: The art and science", - "name_plural": "Shotguns: The art and science", + "name": { "str": "Shotguns: The Art and Science", "str_pl": "copies of Shotguns: The Art and Science" }, "description": "This book claims to address every problem the shotgunner is likely to face, and offers solutions to ensure that shooters can make every shot count.", "weight": "400 g", "volume": "500 ml", diff --git a/data/json/items/book/smg.json b/data/json/items/book/smg.json index 00bba565cc233..4a3cd54499fbe 100644 --- a/data/json/items/book/smg.json +++ b/data/json/items/book/smg.json @@ -2,8 +2,7 @@ { "id": "mag_smg", "type": "BOOK", - "name": "Submachine Gun Enthusiast", - "name_plural": "Submachine Gun Enthusiast", + "name": { "str": "Submachine Gun Enthusiast", "str_pl": "issues of Submachine Gun Enthusiast" }, "description": "An in-depth magazine about submachine guns and shooting. There is an exhaustive article about close quarter combat techniques in the front.", "weight": "90 g", "volume": "250 ml", @@ -21,7 +20,7 @@ { "id": "manual_smg", "type": "BOOK", - "name": "The Submachine Gun Handbook", + "name": { "str": "The Submachine Gun Handbook", "str_pl": "copies of The Submachine Gun Handbook" }, "description": "This concise guide details the proper care and operation of most forms of machine pistols and submachine guns currently used by regular armed and reserve forces as well as several obsolete weapons.", "weight": "362 g", "volume": "500 ml", diff --git a/data/json/items/book/speech.json b/data/json/items/book/speech.json index 93d0aa259ed82..6028c789af9ff 100644 --- a/data/json/items/book/speech.json +++ b/data/json/items/book/speech.json @@ -2,8 +2,7 @@ { "id": "mag_tv", "type": "BOOK", - "name": "US Weekly", - "name_plural": "US Weeklies", + "name": { "str": "US Weekly", "str_pl": "US Weeklies" }, "description": "Weekly news about a bunch of famous people who're all (un)dead now.", "weight": "60 g", "volume": "250 ml", @@ -21,8 +20,7 @@ { "id": "manual_speech", "type": "BOOK", - "name": "Self-Esteem for Dummies", - "name_plural": "Self-Esteem for Dummies", + "name": { "str": "Self-Esteem for Dummies", "str_pl": "copies of Self-Esteem for Dummies" }, "description": "Full of useful tips for showing confidence in your speech.", "weight": "454 g", "volume": "750 ml", @@ -39,8 +37,7 @@ { "id": "textbook_speech", "type": "BOOK", - "name": "Principles of Effective Communication", - "name_plural": "Principles of Effective Communication", + "name": { "str": "Principles of Effective Communication", "str_pl": "copies of Principles of Effective Communication" }, "description": "A hardbound book devoted to being an effective and persuasive speaker.", "weight": "1120 g", "volume": "2 L", @@ -59,8 +56,7 @@ { "id": "dnd_handbook", "type": "BOOK", - "name": "Dungeon Master's Guide: 6th Edition", - "name_plural": "Dungeon Master's Guide: 6th Editions", + "name": { "str": "Dungeon Master's Guide: 6th Edition", "str_pl": "copies of Dungeon Master's Guide: 6th Edition" }, "description": "A thick, hardcover volume with everything needed to weave legendary stories. It's full of information, but finding the things you're looking for can be a chore.", "weight": "2267 g", "volume": "2500 ml", diff --git a/data/json/items/book/survival.json b/data/json/items/book/survival.json index 5187f041763d0..11a7761052785 100644 --- a/data/json/items/book/survival.json +++ b/data/json/items/book/survival.json @@ -2,8 +2,7 @@ { "id": "atomic_survival", "type": "BOOK", - "name": "Survival Under Atomic Attack", - "name_plural": "copies of Survival Under Atomic Attack", + "name": { "str": "Survival Under Atomic Attack", "str_pl": "copies of Survival Under Atomic Attack" }, "description": "A wordy and intricate guide to wilderness and urban survival in a worst case scenario. While filled with loads of useful information, the madman who wrote this was a terrible writer, and gleaning knowledge from the rants is a chore.", "weight": "1920 g", "volume": "2 L", @@ -23,8 +22,7 @@ { "id": "fun_survival", "type": "BOOK", - "name": "Through the Lens", - "name_plural": "Through the Lens", + "name": { "str": "Through the Lens", "str_pl": "copies of Through the Lens" }, "description": "A colorful digest devoted to backpacking and wilderness photography. The photos are beautiful, though the terminology in the sections on survivalcraft assume some proficiency.", "weight": "440 g", "volume": "250 ml", @@ -43,8 +41,7 @@ { "id": "mag_dude", "type": "BOOK", - "name": "Alpha Male Quarterly", - "name_plural": "Alpha Male Quarterlies", + "name": { "str": "Alpha Male Quarterly", "str_pl": "Alpha Male Quarterlies" }, "description": "This is a full-size glossy men's magazine. There's a brief article about hiking and a list of simple wilderness survival tips somewhere in between the photos of bikini-clad women and the gadget advertisements.", "weight": "180 g", "volume": "500 ml", @@ -62,8 +59,7 @@ { "id": "mag_survival", "type": "BOOK", - "name": "Outdoor Adventures", - "name_plural": "Outdoor Adventures", + "name": { "str": "Outdoor Adventures", "str_pl": "issues of Outdoor Adventures" }, "description": "A glossy magazine about surviving and hunting in the wilderness. There's an exciting article about a bear attack in the back pages.", "weight": "80 g", "volume": "250 ml", @@ -81,8 +77,7 @@ { "id": "manual_survival", "type": "BOOK", - "name": "Pitching a Tent", - "name_plural": "copies of Pitching a Tent", + "name": { "str": "Pitching a Tent", "str_pl": "copies of Pitching a Tent" }, "description": "A guide detailing the basics of woodsmanship and outdoor survival.", "weight": "454 g", "volume": "750 ml", @@ -99,7 +94,7 @@ { "id": "pocket_survival", "type": "BOOK", - "name": "Pocket Survival Guide", + "name": { "str": "Pocket Survival Guide", "str_pl": "copies of Pocket Survival Guide" }, "description": "This pocket-sized leather-bound survival guide combines a wealth of concise information with simple to follow instructions and easy to read illustrations.", "weight": "212 g", "volume": "250 ml", @@ -116,8 +111,7 @@ { "id": "survival_book", "type": "BOOK", - "name": "Autobiography of a Mountain Man", - "name_plural": "Autobiography of a Mountain Man", + "name": { "str": "Autobiography of a Mountain Man", "str_pl": "copies of Autobiography of a Mountain Man" }, "//": "Since it's a novel, price point is much more reasonable.", "description": "An amusing historical novel filled with detailed descriptions of surviving in the wild, potentially containing great insights for an experienced outdoorsman.", "weight": "1920 g", @@ -138,7 +132,7 @@ { "id": "textbook_survival", "type": "BOOK", - "name": "Outdoor Survival Guide", + "name": { "str": "Outdoor Survival Guide", "str_pl": "copies of Outdoor Survival Guide" }, "description": "A thick soft-cover book filled with vital information about surviving in the wild, aimed at the experienced backpacker.", "weight": "910 g", "volume": "2 L", @@ -157,8 +151,7 @@ { "id": "isherwood_herbal_remedies", "type": "BOOK", - "name": "Natural Remedies of New England", - "name_plural": "copies of Natural Remedies of New England", + "name": { "str": "Natural Remedies of New England", "str_pl": "copies of Natural Remedies of New England" }, "description": "A leather bound manuscript, it features native herbal remedies with hand colored illustrations of each plant.", "weight": "400 g", "volume": "1250 ml", diff --git a/data/json/items/book/swimming.json b/data/json/items/book/swimming.json index b119956fadb85..4a8a1596655e7 100644 --- a/data/json/items/book/swimming.json +++ b/data/json/items/book/swimming.json @@ -2,8 +2,7 @@ { "id": "mag_swimming", "type": "BOOK", - "name": "Swim Planet", - "name_plural": "Swim Planet", + "name": { "str": "Swim Planet", "str_pl": "issues of Swim Planet" }, "description": "The world's leading resource about aquatic sports.", "weight": "60 g", "volume": "250 ml", @@ -21,7 +20,7 @@ { "id": "manual_swimming", "type": "BOOK", - "name": "Water Survival Training Field Manual", + "name": { "str": "Water Survival Training Field Manual", "str_pl": "copies of Water Survival Training Field Manual" }, "description": "A commercially produced survival guide that details swimming and deep water survival techniques tailored to emergency scenarios.", "weight": "400 g", "volume": "500 ml", diff --git a/data/json/items/book/tailor.json b/data/json/items/book/tailor.json index f86593db8e171..eab063753efe9 100644 --- a/data/json/items/book/tailor.json +++ b/data/json/items/book/tailor.json @@ -28,8 +28,7 @@ { "id": "mag_tailor", "type": "BOOK", - "name": "Sew Awesome Monthly", - "name_plural": "Sew Awesome Monthlies", + "name": { "str": "Sew Awesome Monthly", "str_pl": "Sew Awesome Monthlies" }, "description": "A well presented monthly magazine all about knitting, crocheting, and needlepoint. Filled with ideas and project patterns.", "weight": "75 g", "volume": "250 ml", @@ -47,8 +46,7 @@ { "id": "manual_tailor", "type": "BOOK", - "name": "Sew What? Clothing!", - "name_plural": "Sew What? Clothing!", + "name": { "str": "Sew What? Clothing!", "str_pl": "copies of Sew What? Clothing!" }, "description": "A colorful book about tailoring.", "weight": "454 g", "volume": "750 ml", @@ -85,7 +83,7 @@ { "id": "tailor_japanese", "type": "BOOK", - "name": "Traditional Japanese Kimono", + "name": { "str": "Traditional Japanese Kimono", "str_pl": "copies of Traditional Japanese Kimono" }, "description": "An illustrated textbook on the crafting of Japanese traditional garb.", "weight": "2400 g", "volume": "1500 ml", @@ -104,7 +102,7 @@ { "id": "recipe_fauxfur", "type": "BOOK", - "name": "Friendly, Humane Fashion", + "name": { "str": "Friendly, Humane Fashion", "str_pl": "copies of Friendly, Humane Fashion" }, "description": "An educational book detailing the uses of fake fur, as well as its benefits and disadvantages. The prose is rather passionate, and a disclaimer on the cover proudly states that the book is printed and distributed by the Gryphon Animal Rights Organization.", "weight": "2267 g", "volume": "1 L", @@ -124,8 +122,7 @@ { "id": "textbook_tailor", "type": "BOOK", - "name": "Sewing Techniques for Designers", - "name_plural": "Sewing Techniques for Designers", + "name": { "str": "Sewing Techniques for Designers", "str_pl": "copies of Sewing Techniques for Designers" }, "description": "A massive, hardbound book full of a wealth of information for the professional clothing designer.", "weight": "2600 g", "volume": "2 L", diff --git a/data/json/items/book/throw.json b/data/json/items/book/throw.json index a4eb75df873e9..f3a8a616a10d0 100644 --- a/data/json/items/book/throw.json +++ b/data/json/items/book/throw.json @@ -2,8 +2,7 @@ { "id": "mag_throwing", "type": "BOOK", - "name": "Diskobolus", - "name_plural": "Diskobolus", + "name": { "str": "Diskobolus", "str_pl": "issues of Diskobolus" }, "description": "A biannual magazine devoted to the art and science of discus-throwing.", "weight": "60 g", "volume": "250 ml", @@ -21,8 +20,7 @@ { "id": "manual_throw", "type": "BOOK", - "name": "The Complete Guide to Pitching", - "name_plural": "Complete Guides to Pitching", + "name": { "str": "The Complete Guide to Pitching", "str_pl": "copies of The Complete Guide to Pitching" }, "description": "A detailed guide for baseball pitchers that combines time-tested techniques and information mixed with a common sense approach to pitching.", "weight": "400 g", "volume": "500 ml", diff --git a/data/json/items/book/traps.json b/data/json/items/book/traps.json index 1df564da152b8..0fa13913ddd1f 100644 --- a/data/json/items/book/traps.json +++ b/data/json/items/book/traps.json @@ -2,8 +2,7 @@ { "id": "howto_traps", "type": "BOOK", - "name": "How to Trap Anything", - "name_plural": "How to Trap Anything", + "name": { "str": "How to Trap Anything", "str_pl": "copies of How to Trap Anything" }, "description": "A worn manual that describes how to set and disarm a wide variety of traps.", "weight": "454 g", "volume": "500 ml", @@ -20,8 +19,7 @@ { "id": "mag_traps", "type": "BOOK", - "name": "Trapper's Life", - "name_plural": "Trapper's Life", + "name": { "str": "Trapper's Life", "str_pl": "issues of Trapper's Life" }, "description": "An in-depth magazine about trapping game. There are lots of articles and diagrams that explain simple trap designs.", "weight": "80 g", "volume": "250 ml", @@ -38,7 +36,7 @@ { "id": "manual_traps", "type": "BOOK", - "name": "The Modern Trapper", + "name": { "str": "The Modern Trapper", "str_pl": "copies of The Modern Trapper" }, "description": "An extensive volume that details numerous methods of trapping game.", "weight": "422 g", "volume": "500 ml", @@ -55,9 +53,11 @@ { "id": "textbook_traps", "type": "BOOK", - "name": "The Compleat Trapper", - "name_plural": "The Compleat Trapper", - "//": "The spelling is intentionally archaic, as this form is commonly used in the titles of books.", + "name": { + "//~": "The spelling is intentionally archaic, as this form is commonly used in the titles of books.", + "str": "The Compleat Trapper", + "str_pl": "copies of The Compleat Trapper" + }, "description": "An in-depth book about trapping game animals, covering methods both modern and ancient.", "weight": "1100 g", "volume": "2 L", @@ -76,8 +76,7 @@ { "id": "trappers_companion", "type": "BOOK", - "name": "The Trapper's Companion", - "name_plural": "copies of The Trapper's Companion", + "name": { "str": "The Trapper's Companion", "str_pl": "copies of The Trapper's Companion" }, "description": "A folksy guide to trapping wild game using time-tested methods. A bit in-depth for the beginner, it can provide a wealth of information to a knowledgeable trapper.", "weight": "1920 g", "volume": "2 L", diff --git a/data/json/items/book/unarmed.json b/data/json/items/book/unarmed.json index 792e6e829224b..0e8852e9f3113 100644 --- a/data/json/items/book/unarmed.json +++ b/data/json/items/book/unarmed.json @@ -2,8 +2,7 @@ { "id": "mag_unarmed", "type": "BOOK", - "name": "Boxing Monthly", - "name_plural": "Boxing Monthlies", + "name": { "str": "Boxing Monthly", "str_pl": "Boxing Monthlies" }, "description": "An exciting monthly magazine about boxing. There are lots of large, colorful photos of pugilistic exploits.", "weight": "90 g", "volume": "250 ml", @@ -21,8 +20,7 @@ { "id": "manual_brawl", "type": "BOOK", - "name": "101 Wrestling Moves", - "name_plural": "101 Wrestling Moves", + "name": { "str": "101 Wrestling Moves", "str_pl": "copies of 101 Wrestling Moves" }, "description": "It seems to be a wrestling manual, poorly photocopied and released on spiral- bound paper. Still, there are lots of useful tips for unarmed combat.", "weight": "227 g", "volume": "500 ml", diff --git a/data/json/items/classes/book.json b/data/json/items/classes/book.json index ebc75337944d6..5d9e91c829537 100644 --- a/data/json/items/classes/book.json +++ b/data/json/items/classes/book.json @@ -2,7 +2,7 @@ { "abstract": "book_magazine", "type": "BOOK", - "name": "Readable magazine", + "name": "readable magazine", "weight": "70 g", "volume": "250 ml", "material": "paper", @@ -17,7 +17,7 @@ "abstract": "book_martial", "type": "GENERIC", "category": "books", - "name": "Martial art manual", + "name": "martial art manual", "weight": "150 g", "volume": "250 ml", "price": 20000, diff --git a/data/json/items/classes/gun.json b/data/json/items/classes/gun.json index e46fc93f7cf2a..64c8503cf63a2 100644 --- a/data/json/items/classes/gun.json +++ b/data/json/items/classes/gun.json @@ -206,7 +206,7 @@ "copy-from": "shotgun_pump", "type": "GUN", "//": "Anything that has the right pin arrangement for a speedloader chute", - "name": "base race shotgun, pump", + "name": { "str": "base race shotgun, pump", "str_pl": "base race shotguns, pump" }, "valid_mod_locations": [ [ "accessories", 4 ], [ "barrel", 1 ], diff --git a/data/json/items/comestibles/carnivore.json b/data/json/items/comestibles/carnivore.json index ef5065ccb2cf5..56a002e66981e 100644 --- a/data/json/items/comestibles/carnivore.json +++ b/data/json/items/comestibles/carnivore.json @@ -500,7 +500,7 @@ "color": "brown", "healthy": -8, "quench": -5, - "calories": "54", + "calories": 54, "vitamins": [ [ "vitA", 6 ], [ "vitC", 2 ], [ "calcium", 0 ], [ "iron", 8 ], [ "vitB", 155 ] ] }, { diff --git a/data/json/items/comestibles/mre.json b/data/json/items/comestibles/mre.json index 8326c0a6c5d73..84d4ac85fc7fb 100644 --- a/data/json/items/comestibles/mre.json +++ b/data/json/items/comestibles/mre.json @@ -19,7 +19,7 @@ "type": "GENERIC", "symbol": ")", "color": "brown", - "name": "MRE small box", + "name": { "str": "MRE small box", "str_pl": "MRE small boxes" }, "category": "food", "description": "A generic small MRE box, you shouldn't see this", "price": 500, diff --git a/data/json/items/corpses/inactive_bots.json b/data/json/items/corpses/inactive_bots.json index 499e8959cdbba..b70fa0b5a101b 100644 --- a/data/json/items/corpses/inactive_bots.json +++ b/data/json/items/corpses/inactive_bots.json @@ -799,7 +799,7 @@ { "id": "bot_dispatch", "type": "TOOL", - "name": "inactive dispatch", + "name": { "str": "inactive dispatch", "str_pl": "inactive dispatches" }, "description": "An inactive Northrop Dispatch, guard model, serving as a mobile assembler and deployer of kamikaze manhacks for defense. Activate it to place it onto the ground; due to a one-way switch triggered during deactivation, however, it will be nonaggressive, and serves only as a distraction.", "volume": "95 L", "weight": "250 kg", @@ -824,7 +824,7 @@ { "id": "bot_dispatch_military", "type": "TOOL", - "name": "inactive military dispatch", + "name": { "str": "inactive military dispatch", "str_pl": "inactive military dispatches" }, "description": "An inactive Northrop Dispatch, military model, serving as a mobile assembler and deployer of lethal manhacks for combat situations. Activate it to place it onto the ground; due to a one-way switch triggered during deactivation, however, it will be nonaggressive, and serves only as a distraction.", "volume": "95 L", "weight": "300 kg", diff --git a/data/json/items/fake.json b/data/json/items/fake.json index 999a2d0c6e778..129c3a737ca04 100644 --- a/data/json/items/fake.json +++ b/data/json/items/fake.json @@ -58,7 +58,7 @@ "id": "bio_scalpel", "copy-from": "fake_item", "type": "TOOL", - "name": "autonomous surgical scalpels", + "name": { "str": "autonomous surgical scalpels", "str_pl": "autonomous surgical scalpels" }, "flags": [ "TRADER_AVOID" ], "qualities": [ [ "CUT", 1 ], [ "CUT_FINE", 5 ], [ "BUTCHER", 50 ] ] }, diff --git a/data/json/items/generic.json b/data/json/items/generic.json index 2d53f6fd5c1da..25ad3fd857d77 100644 --- a/data/json/items/generic.json +++ b/data/json/items/generic.json @@ -492,65 +492,6 @@ "volume": 0, "to_hit": -3 }, - { - "id": "golf_tee", - "type": "GENERIC", - "category": "other", - "name": "golf tee", - "description": "A pin shaped piece of wood meant for holding a golf ball slightly off the ground.", - "weight": "3 g", - "volume": "250 ml", - "price": 1000, - "material": "wood", - "symbol": "-", - "color": "white" - }, - { - "id": "golf_ball", - "type": "GENERIC", - "category": "other", - "name": "golf ball", - "description": "A small ball with round indentations on it.", - "weight": "50 g", - "volume": "250 ml", - "price": 2000, - "material": "plastic", - "symbol": "*", - "color": "white", - "bashing": 5, - "to_hit": -3 - }, - { - "type": "GENERIC", - "id": "pool_ball", - "symbol": "*", - "color": "blue", - "name": "pool ball", - "description": "A colorful, hard ball. Essentially a rock.", - "category": "other", - "price": 3000, - "price_postapoc": 0, - "material": "plastic", - "weight": "170 g", - "volume": "250 ml", - "bashing": 8, - "to_hit": -3 - }, - { - "type": "GENERIC", - "id": "bowling_ball", - "symbol": "*", - "color": "blue", - "name": "bowling ball", - "description": "A large, heavy ball. Before the apocalypse, its main purpose was to be rolled along waxed floors.", - "category": "other", - "price": 30, - "material": "ceramic", - "weight": "2000 g", - "volume": "2500 ml", - "bashing": 16, - "to_hit": -2 - }, { "type": "GENERIC", "id": "candlestick", @@ -666,7 +607,7 @@ "id": "wire_mesh", "symbol": ";", "color": "light_gray", - "name": "steel mesh", + "name": { "str": "steel mesh", "str_pl": "steel meshes" }, "description": "A mat of woven fine steel wire, useful for dryer lint traps and reusable coffee filter baskets. You could put these on a window to keep mosquitoes and other bugs out, but chainlink fencing will do these days.", "category": "spare_parts", "weight": "318 g", @@ -1207,7 +1148,7 @@ "id": "broken_dispatch", "symbol": ",", "color": "yellow", - "name": "broken riot dispatch", + "name": { "str": "broken riot dispatch", "str_pl": "broken riot dispatches" }, "category": "other", "description": "A broken riot dispatch, with its mesh midsection filled with fried manhacks and its motor limp and still. Could be gutted for parts.", "price": 1000, @@ -1224,7 +1165,7 @@ "id": "broken_dispatch_military", "symbol": ",", "color": "green", - "name": "broken military dispatch", + "name": { "str": "broken military dispatch", "str_pl": "broken military dispatches" }, "category": "other", "description": "A broken military dispatch. Though the scratched, disarmed manhacks visible in its belly are disarmed, their destructive potential still inspires a spark of fear, even now. Could be gutted for parts.", "price": 1000, @@ -1556,7 +1497,7 @@ "id": "template_photonics", "copy-from": "standard_template_construct", "color": "yellow", - "name": "nanofabricator template (silicon photonics)", + "name": { "str": "nanofabricator template (silicon photonics)", "str_pl": "nanofabricator templates (silicon photonics)" }, "description": "A state-of-the-art optical storage system, containing the instruction set required for the fabrication of complex silicon photonic circuitry. The data within was once clearly worth millions, but now, you are not sure if it's anything more than a fancy, high-tech paperweight.", "price": 200000000, "//": "actually worth millions", @@ -2207,7 +2148,7 @@ "id": "ruby", "copy-from": "garnet", "color": "red", - "name": "ruby", + "name": { "str": "ruby", "str_pl": "rubies" }, "description": "A sparkling ruby." }, { diff --git a/data/json/items/generic/dining_kitchen.json b/data/json/items/generic/dining_kitchen.json index 4eb45ca9791f3..f11865e156157 100644 --- a/data/json/items/generic/dining_kitchen.json +++ b/data/json/items/generic/dining_kitchen.json @@ -49,7 +49,7 @@ }, { "id": "base_ceramic_dish", - "name": "generic dish", + "name": { "str": "generic dish", "str_pl": "generic dishes" }, "description": "generic item template", "type": "GENERIC", "symbol": ")", @@ -64,7 +64,7 @@ }, { "id": "base_glass_dish", - "name": "generic dish", + "name": { "str": "generic dish", "str_pl": "generic dishes" }, "description": "generic item template", "type": "GENERIC", "symbol": ")", @@ -79,7 +79,7 @@ }, { "id": "base_tin_dish", - "name": "generic dish", + "name": { "str": "generic dish", "str_pl": "generic dishes" }, "description": "generic item template", "type": "GENERIC", "symbol": ")", @@ -94,7 +94,7 @@ }, { "id": "base_plastic_dish", - "name": "generic dish", + "name": { "str": "generic dish", "str_pl": "generic dishes" }, "description": "generic item template", "type": "GENERIC", "symbol": ")", diff --git a/data/json/items/generic/toys_and_sports.json b/data/json/items/generic/toys_and_sports.json index b28140f1c4e9d..680a704c873c1 100644 --- a/data/json/items/generic/toys_and_sports.json +++ b/data/json/items/generic/toys_and_sports.json @@ -63,6 +63,65 @@ ], "magazine_well": 1 }, + { + "id": "golf_tee", + "type": "GENERIC", + "category": "other", + "name": "golf tee", + "description": "A pin shaped piece of wood meant for holding a golf ball slightly off the ground.", + "weight": "3 g", + "volume": "250 ml", + "price": 1000, + "material": "wood", + "symbol": "-", + "color": "white" + }, + { + "id": "golf_ball", + "type": "GENERIC", + "category": "other", + "name": "golf ball", + "description": "A small ball with round indentations on it.", + "weight": "50 g", + "volume": "250 ml", + "price": 2000, + "material": "plastic", + "symbol": "*", + "color": "white", + "bashing": 5, + "to_hit": -3 + }, + { + "type": "GENERIC", + "id": "pool_ball", + "symbol": "*", + "color": "blue", + "name": "pool ball", + "description": "A colorful, hard ball. Essentially a rock.", + "category": "other", + "price": 3000, + "price_postapoc": 0, + "material": "plastic", + "weight": "170 g", + "volume": "250 ml", + "bashing": 8, + "to_hit": -3 + }, + { + "type": "GENERIC", + "id": "bowling_ball", + "symbol": "*", + "color": "blue", + "name": "bowling ball", + "description": "A large, heavy ball. Before the apocalypse, its main purpose was to be rolled along waxed floors.", + "category": "other", + "price": 30, + "material": "ceramic", + "weight": "2000 g", + "volume": "2500 ml", + "bashing": 16, + "to_hit": -2 + }, { "type": "GENERIC", "id": "baseball", diff --git a/data/json/items/gun/22.json b/data/json/items/gun/22.json index dddea2ae55977..1bc6e5e48784b 100644 --- a/data/json/items/gun/22.json +++ b/data/json/items/gun/22.json @@ -7,7 +7,7 @@ "name": "American-180", "name_plural": "American-180", "description": "The American-180 is a submachine gun developed in the 1960's that fires .22 LR, unusual for an SMG. Though the round is low-powered, the high rate of fire and large magazine makes the 180 a formidable weapon.", - "weight": "1840 g", + "weight": "2600 g", "volume": "1250 ml", "price": 163000, "to_hit": -2, @@ -89,7 +89,7 @@ "name": "Mossberg Brownie", "name_plural": "Mossberg Brownie", "description": "The first gun produced by O.F. Mossberg & Sons. A small pocket pistol, marketed to trappers during the early 20th century. Its four barrels can accept .22 Short and .22 LR cartridges.", - "weight": "130 g", + "weight": "280 g", "volume": "137ml", "price": 110000, "to_hit": -1, @@ -201,7 +201,7 @@ "name": "Ruger 10/22", "name_plural": "Ruger 10/22", "description": "A combination of negligible recoil, high customization, and inexpensive ammunition made the Ruger 10/22 a popular choice among enthusiasts and small game hunters. Even though it fires the weak .22 round, it's perfectly capable of killing.", - "weight": "2220 g", + "weight": "2270 g", "volume": "2500 ml", "price": 27000, "to_hit": -1, @@ -241,6 +241,7 @@ "type": "GUN", "name": "Ruger LCR .22", "name_plural": "Ruger LCR .22", + "weight": "420 g", "ammo": "22", "clip_size": 8, "magazines": [ [ "22", [ "22_speedloader8" ] ] ] @@ -253,7 +254,7 @@ "name": "SIG Mosquito", "name_plural": "SIG Mosquito", "description": "A popular, small .22 LR pistol. One of the many polymer frame pistols produced during the latter 20th-early 21st centuries; it has an underbarrel rail.", - "weight": "640 g", + "weight": "700 g", "volume": "250 ml", "price": 36000, "to_hit": -2, @@ -292,7 +293,7 @@ "name": "S&W 22A", "name_plural": "S&W 22A", "description": "A popular .22 pistol.", - "weight": "900 g", + "weight": "1000 g", "volume": "500 ml", "price": 35000, "to_hit": -2, @@ -313,7 +314,7 @@ "type": "GUN", "name": "Jennings J-22", "description": "One of the quintessential 'saturday night specials', the Jennings J-22 was very affordably priced with its injection molded zinc slide and frame. Intended to fill the void left after small pocket pistols were banned from import, these were more commonly used by criminals unfazed by their glaring safety issues.", - "weight": "340 g", + "weight": "370 g", "volume": "123ml", "price": 7000, "to_hit": -3, @@ -334,7 +335,7 @@ "type": "GUN", "name": "Walther P22", "description": "The Walther P22 is a blowback operated semi-automatic pistol. It is about half the size of most Walthers. It is made mostly with plastic, with the slide and key components being made of die-cast zinc alloy", - "weight": "480 g", + "weight": "450 g", "volume": "263 ml", "price": 8500, "to_hit": -3, diff --git a/data/json/items/gun/223.json b/data/json/items/gun/223.json index f7a50127d2914..f860b767ee070 100644 --- a/data/json/items/gun/223.json +++ b/data/json/items/gun/223.json @@ -6,7 +6,7 @@ "type": "GUN", "name": "Remington ACR", "description": "This carbine was developed for military use in the early 21st century. It is damaging and accurate, though its rate of fire is a bit slower than competing .223 carbines.", - "weight": "3495 g", + "weight": "3590 g", "volume": "2 L", "price": 234300, "to_hit": -1, @@ -31,7 +31,7 @@ "name": "AR-15", "//": "This is assumed to be the standard model matching the (currently not in-game) M16. Tileset whitelist for rifles", "description": "This ubiquitous rifle is the forefather of M16 rifle series. It is lightweight and accurate, but will malfunction if not properly maintained. This one is a semi automatic civilian version.", - "weight": "2815 g", + "weight": "3500 g", "volume": "2 L", "price": 125000, "to_hit": -1, @@ -53,7 +53,7 @@ "name": "HK416 A5", "//": "*Current* milspec gear is now ridiculously overpriced, as seen with the M2010 IRL.", "description": "Designed to replace the M4A1, the Heckler and Koch 416A5 features most of the former's strengths, while being considerably more durable.", - "weight": "1920 g", + "weight": "3490 g", "volume": "1750 ml", "price": 540000, "to_hit": -1, @@ -76,7 +76,7 @@ "type": "GUN", "name": "H&K G36", "description": "Designed as a replacement for the early H&K G3 battle rifle, the G36 is more accurate, and uses the much-lighter .223 round, allowing for a higher ammo capacity.", - "weight": "3270 g", + "weight": "3630 g", "volume": "2500 ml", "price": 210000, "to_hit": -1, @@ -240,7 +240,7 @@ "type": "GUN", "name": "M249", "description": "The M249 is a mountable machine gun used by the US military and SWAT teams. Quite inaccurate and difficult to control, the M249 is designed to fire many rounds very quickly.", - "weight": "6400 g", + "weight": "7330 g", "volume": "3 L", "price": 750000, "to_hit": -1, @@ -276,7 +276,7 @@ "type": "GUN", "name": "M27 IAR", "description": "A H&K416 carbine outfitted with a heavier barrel to enable higher amounts of suppressive fire while retaining a good degree of mobility.", - "weight": "3495 g", + "weight": "3710 g", "modes": [ [ "DEFAULT", "semi-auto", 1 ], [ "AUTO", "auto", 4 ] ], "magazines": [ [ "223", [ "stanag30", "stanag50", "survivor223mag" ] ] ], "relative": { "ranged_damage": 1, "durability": 1 } @@ -288,7 +288,7 @@ "type": "GUN", "name": "M4A1", "description": "A popular carbine, long used by the US military. Though accurate, small, and lightweight, it is infamous for its unreliability when not properly maintained.", - "weight": "2520 g", + "weight": "3160 g", "volume": "1750 ml", "price": 240000, "to_hit": -1, @@ -311,7 +311,7 @@ "type": "GUN", "name": "M16A4", "description": "The M16 is a very common assault rifle descended from the AR-15, used by militaries across the world for over 50 years. It is a gas operated, rotating bolt rifle known for its accuracy and controllable recoil.", - "weight": "2890 g", + "weight": "3510 g", "volume": "1750 ml", "price": 240000, "to_hit": -1, @@ -372,7 +372,7 @@ "type": "GUN", "name": "Ruger Mini-14", "description": "A small, lightweight semi-auto carbine designed for civilian and police use. Its superb accuracy and low recoil makes it more suitable than full-auto rifles for some situations.", - "weight": "2800 g", + "weight": "3180 g", "volume": "2 L", "price": 92100, "to_hit": -1, @@ -409,7 +409,7 @@ "type": "GUN", "name": "FN SCAR-L", "description": "A highly accurate and modular assault rifle specially designed for the United States Special Operations Command. The 'L' in its name stands for light, as it uses the lightweight .223 round.", - "weight": "2960 g", + "weight": "3300 g", "volume": "2250 ml", "price": 280000, "to_hit": -1, @@ -432,7 +432,7 @@ "type": "GUN", "name": "SIG 552", "description": "A compact selective fire automatic rifle designed for the Swiss military. It features a three-round burst mode and an integrated folding stock.", - "weight": "3200 g", + "weight": "3000 g", "volume": "1750 ml", "price": 320000, "to_hit": -1, @@ -453,7 +453,7 @@ "type": "GUN", "name": "Steyr AUG", "description": "The Steyr AUG is an Austrian assault rifle that uses a bullpup design. It is used in the armed forces and police forces of many nations, and enjoys low recoil and high accuracy.", - "weight": "3184 g", + "weight": "3500 g", "volume": "1500 ml", "price": 490000, "to_hit": -1, diff --git a/data/json/items/gun/270win.json b/data/json/items/gun/270win.json index c064656d5dda4..6624a26cdbd8c 100644 --- a/data/json/items/gun/270win.json +++ b/data/json/items/gun/270win.json @@ -6,7 +6,7 @@ "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 g", + "weight": "3410 g", "volume": "3 L", "price": 112600, "to_hit": -1, diff --git a/data/json/items/gun/300.json b/data/json/items/gun/300.json index 89c19811439e8..8e39f3dcf759e 100644 --- a/data/json/items/gun/300.json +++ b/data/json/items/gun/300.json @@ -8,7 +8,7 @@ "name_plural": "M2010 ESR", "//": "http://www.guns.com/2012/05/17/remington-xm2010-army-sniper-system-esr-now-in-stores/.", "description": "A bolt-action, box-magazine-fed, sniper rifle chambered in the powerful .300 Winchester Magnum round. The M2010 had completely replaced the M24 rifle series by 2017.", - "weight": "4002 g", + "weight": "5500 g", "volume": "2750 ml", "price": 1701000, "to_hit": -1, @@ -31,7 +31,7 @@ "name_plural": "Weatherby Mark V", "//": "MSRP, believe it or not.", "description": "The Weatherby Mark V is one of the finest bolt action rifles. Designed in 1955 by Roy Weatherby and Fred Jennie, it has a strong action designed to safely fire high-pressure cartridges. These rifles were presented to celebrities as part of a marketing campaign.", - "weight": "4200 g", + "weight": "3730 g", "volume": "3 L", "price": 259500, "to_hit": -1, @@ -54,7 +54,7 @@ "name": "Winchester Model 70", "name_plural": "Winchester Model 70", "description": "The Winchester Model 70 is a bolt action sporting rifle. It has an iconic place in American sporting culture and has been held in high regard by shooters since it was introduced in 1936.", - "weight": "4100 g", + "weight": "3520 g", "volume": "3 L", "price": 46000, "to_hit": -1, diff --git a/data/json/items/gun/3006.json b/data/json/items/gun/3006.json index 993ddb3df9221..a6eab50cbf6b6 100644 --- a/data/json/items/gun/3006.json +++ b/data/json/items/gun/3006.json @@ -7,7 +7,7 @@ "name": "Browning BLR", "name_plural": "Browning BLR", "description": "A highly accurate lever-action hunting rifle chambered for the powerful .30-06 round. Notable for using a detachable magazine instead of a traditional tube.", - "weight": "3135 g", + "weight": "3300 g", "volume": "3 L", "price": 85000, "to_hit": -1, @@ -85,7 +85,7 @@ "type": "GUN", "name": "M1903 Springfield", "description": "A powerful military rifle chambered in .30-06, developed to replace the US Army's older Krag rifle. Served as the main American rifle in World War I, was used alongside the M1 Garand in World War II, and was used as a sniper rifle as late as the Vietnam War.", - "weight": "4080 g", + "weight": "3910 g", "volume": "3 L", "price": 80000, "to_hit": -1, @@ -122,7 +122,7 @@ "reload_noise_volume": 10, "name": "Browning Automatic Rifle", "description": "Designed near the end of World War I, the BAR provided fire support for the US Army from World War II all the way to the Vietnam War. Too much firepower to serve as a battle rifle, but not enough to be an ideal light machine gun, it still found a niche on the battlefield.", - "weight": "7050 g", + "weight": "8820 g", "volume": "2500 ml", "price": 350000, "to_hit": -1, @@ -162,7 +162,7 @@ "name": "Remington 700", "name_plural": "Remington 700", "description": "A very popular and durable hunting or sniping rifle. Popular among SWAT and US Marine snipers. Highly damaging, but perhaps not as accurate as the competing Browning BLR.", - "weight": "4080 g", + "weight": "3410 g", "volume": "3 L", "price": 87000, "to_hit": -1, diff --git a/data/json/items/gun/300BLK.json b/data/json/items/gun/300BLK.json index 95459c058ae58..0caba1547b4c4 100644 --- a/data/json/items/gun/300BLK.json +++ b/data/json/items/gun/300BLK.json @@ -6,7 +6,7 @@ "type": "GUN", "name": "Remington ACR .300BLK", "description": "This carbine was developed for military use in the early 21st century. It is damaging and accurate, though its rate of fire is a bit slower than competing carbines. This version is chambered for the .300 AAC Blackout round.", - "weight": "3495 g", + "weight": "3590 g", "volume": "2 L", "price": 234300, "to_hit": -1, @@ -31,7 +31,7 @@ "type": "GUN", "name": "IWI Tavor X95 .300BLK", "description": "The IWI Tavor X95 (also called Micro-Tavor or MTAR) is an Israeli bullpup assault rifle designed and produced by Israel Weapon Industries. This is the civilian version chambered for .300 AAC Blackout.", - "weight": "3400 g", + "weight": "3610 g", "volume": "1500 ml", "price": 490000, "to_hit": -1, diff --git a/data/json/items/gun/308.json b/data/json/items/gun/308.json index d60040b8aaebd..919d1f8c725df 100644 --- a/data/json/items/gun/308.json +++ b/data/json/items/gun/308.json @@ -7,7 +7,7 @@ "name": "FN FAL", "name_plural": "FN FAL", "description": "Originally designed during the Cold War, the FN FAL is probably the most successful battle rifle ever designed. Even though often labeled as obsolete, its high rate of fire and powerful ammunition make it perfectly capable of holding its ground against modern competitors.", - "weight": "3840 g", + "weight": "4250 g", "volume": "2 L", "price": 350000, "to_hit": -1, @@ -32,7 +32,7 @@ "name": "H&K G3", "name_plural": "H&K G3", "description": "An early battle rifle developed after the end of WWII. The G3 is designed to unload large amounts of deadly ammunition, but it is less suitable over long ranges.", - "weight": "3980 g", + "weight": "4380 g", "volume": "2 L", "price": 205000, "to_hit": -1, @@ -55,7 +55,7 @@ "reload_noise_volume": 10, "name": "M134D-H Minigun", "description": "The M134D-H Minigun is a (relatively) lightweight heavy rotary machine gun. Its six barrels are rotated by an electric motor, powered by UPS or vehicle. If you could find enough ammo for it, it would become a devastating weapon. It must be mounted on a vehicle before use.", - "weight": "19500 g", + "weight": "19770 g", "volume": "6 L", "price": 5500000, "to_hit": -4, @@ -84,7 +84,7 @@ "name": "M14 EBR-RI", "name_plural": "M14 EBR-RI", "description": "A highly modified version of the M14 rifle designed to cover both CQB and designated marksman roles. A very powerful and versatile rifle, if somewhat heavy.", - "weight": "4820 g", + "weight": "5070 g", "price": 195000, "material": [ "steel", "plastic" ], "modes": [ [ "DEFAULT", "semi-auto", 1 ], [ "AUTO", "auto", 4 ] ], @@ -111,7 +111,7 @@ "name": "M1A", "name_plural": "M1A", "description": "The child of the M1 Garand World War 2 rifle, the M1A is a semi-automatic variant of the M14, favored for its accuracy and modular use.", - "weight": "3940 g", + "weight": "4230 g", "volume": "2250 ml", "price": 130000, "to_hit": -1, @@ -148,7 +148,7 @@ "type": "GUN", "name": "M240", "description": "The M240 is a medium machine gun used by the US military, replacing the older M60. Quite inaccurate and difficult to control, the M240 is designed to fire many rounds very quickly.", - "weight": "8800 g", + "weight": "12400 g", "volume": "3 L", "price": 1000000, "to_hit": -1, @@ -185,7 +185,7 @@ "type": "GUN", "name": "M60", "description": "The M60 is a general-purpose machine gun developed to replace the .30-caliber M1918 and M1919. Heavy and difficult to handle fired from the shoulder, as most people aren't action-movie heroes.", - "weight": "8300 g", + "weight": "10500 g", "volume": "3 L", "price": 1000000, "to_hit": -1, @@ -288,6 +288,7 @@ "name": "FN SCAR-H", "name_plural": "FN SCAR-H", "description": "A highly accurate and modular battle rifle specially designed for the United States Special Operations Command. The 'H' in its name stands for heavy, as it uses the powerful .308 round.", + "weight": "3640 g", "ammo": "308", "ranged_damage": -3, "min_cycle_recoil": 2700, @@ -302,7 +303,7 @@ "name": "M24", "name_plural": "M24", "description": "The M24 Sniper is the military and police version of the Remington Model 700 rifle, M24 being the model name assigned by the United States Army after adoption as their standard sniper rifle in 1988. The M24 is referred to as a 'weapon system' because it consists of not only a rifle, but also a detachable telescopic sight and other accessories.", - "weight": "4500 g", + "weight": "5000 g", "volume": "2750 ml", "price": 350000, "to_hit": -1, @@ -340,7 +341,7 @@ "type": "GUN", "name": "HK417 A2", "description": "A German battle rifle with a 13\" barrel and telescopic stock. It is a gas operated, rotating bolt rifle with a short-stroke piston design similar to that of the G36.", - "weight": "3870 g", + "weight": "4220 g", "volume": "1750 ml", "price": 320000, "to_hit": -1, @@ -364,7 +365,7 @@ "type": "GUN", "name": "M110A1", "description": "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.", - "weight": "3800 g", + "weight": "4330 g", "volume": "2 L", "price": 320000, "to_hit": -1, diff --git a/data/json/items/gun/32.json b/data/json/items/gun/32.json index 1667b4d01f7c5..3c01b063ddc6f 100644 --- a/data/json/items/gun/32.json +++ b/data/json/items/gun/32.json @@ -45,7 +45,7 @@ "name": "Skorpion Vz. 61", "//": "Total unloaded weight of gun 1301.81 grams, rounded to 1302. Current weight of folding stock 200 grams.", "description": "The Skorpion Vz. 61 is a Czechoslovak submachine gun from the 1950s, chambered in .32 ACP.", - "weight": "1102 g", + "weight": "1300 g", "volume": "750 ml", "price": 150000, "to_hit": -2, @@ -85,7 +85,7 @@ "name": "Walther PPK", "name_plural": "Walther PPK", "description": "One of the most famous handguns of the 20th century. Your name is not Bond, but you might find this little gun still useful.", - "weight": "525 g", + "weight": "540 g", "volume": "250 ml", "price": 45000, "to_hit": -1, diff --git a/data/json/items/gun/357sig.json b/data/json/items/gun/357sig.json index 15dfae8dc94f8..8987be3569345 100644 --- a/data/json/items/gun/357sig.json +++ b/data/json/items/gun/357sig.json @@ -6,7 +6,7 @@ "type": "GUN", "name": "SIG P226", "description": "A SIG Sauer P226 chambered for .357 SIG. The P226 is a DA/SA, short-recoil operated semi-automatic pistol.", - "weight": "800 g", + "weight": "960 g", "volume": "500 ml", "price": 50000, "to_hit": -1, @@ -26,6 +26,7 @@ "type": "GUN", "name": "Glock 31", "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.", + "weight": "660 g", "ammo": [ "357sig" ], "magazines": [ [ "357sig", [ "glock40mag", "glock40bigmag" ] ] ] }, @@ -36,7 +37,7 @@ "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 g", + "weight": "751 g", "volume": "500 ml", "price": 69000, "to_hit": -2, diff --git a/data/json/items/gun/38.json b/data/json/items/gun/38.json index e7c09fd00c44e..dac2a1ef0d441 100644 --- a/data/json/items/gun/38.json +++ b/data/json/items/gun/38.json @@ -41,7 +41,7 @@ "type": "GUN", "name": "COP .357 Derringer", "description": "A small, chubby derringer pistol bearing a slight resemblance to the Mossberg Brownie. It uses a rotating firing pin to fire the individual hammers of the four barrels arranged in a square formation.", - "weight": "857 g", + "weight": "800 g", "volume": "399ml", "price": 120000, "to_hit": -1, diff --git a/data/json/items/gun/380.json b/data/json/items/gun/380.json index 1650d4c0c0f2d..e0acdf714ab7a 100644 --- a/data/json/items/gun/380.json +++ b/data/json/items/gun/380.json @@ -21,7 +21,7 @@ "type": "GUN", "name": "Kel-Tec P3AT", "description": "Essentially a slightly scaled up Kel-tec P32 in .380 ACP, the ever popular P3AT offers better ballistics in a small, concealable lightweight package. Handling leaves something to be desired due to snappier recoil and diminuitive controls.", - "weight": "240 g", + "weight": "220 g", "volume": "231ml", "price": 25000, "ammo": "380", @@ -35,7 +35,7 @@ "type": "GUN", "name": "FN 1910 .380", "description": "Made infamous in Sarajevo in 1914, the FN1910 was a popular pocket pistol, albeit in .32 ACP. Collectors value the .380 model for its notoriety and more modern terminal performance. If such a humble firearm could start a world war, could it perhaps protect you from the undead?", - "weight": "680 g", + "weight": "590 g", "volume": "186ml", "price": 75000, "to_hit": -3, @@ -75,7 +75,7 @@ "type": "GUN", "name": "Hi-Point CF-380", "description": "The Hi-Point CF-380 is a blowback operated semi automatic pistol designed by Hi-Point Firearms, which is known for making inexpensive firearms, and for making said firearms bulky and uncomfortable. Hi-Points have slides made with a zinc pot-metal which is relatively fragile compared to steel slides.", - "weight": "709 g", + "weight": "820 g", "volume": "539 ml", "price": 7500, "to_hit": -2, diff --git a/data/json/items/gun/38super.json b/data/json/items/gun/38super.json index 61d8c08b3a157..b4b58f0e27b59 100644 --- a/data/json/items/gun/38super.json +++ b/data/json/items/gun/38super.json @@ -44,7 +44,7 @@ "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 g", + "weight": "1110 g", "volume": "500 ml", "price": 78400, "to_hit": -2, diff --git a/data/json/items/gun/40.json b/data/json/items/gun/40.json index afd179307586a..2cad78a994ae0 100644 --- a/data/json/items/gun/40.json +++ b/data/json/items/gun/40.json @@ -7,7 +7,7 @@ "name": "Glock 22", "name_plural": "Glock 22", "description": "A .40 S&W variant of the popular Glock 17 pistol. The standard-issue firearm of the FBI and of countless other law enforcement agencies worldwide.", - "weight": "440 g", + "weight": "650 g", "volume": "500 ml", "price": 69000, "to_hit": -2, @@ -85,7 +85,7 @@ "name": "SIG Pro .40", "name_plural": "SIG Pro .40", "description": "Originally marketed as a lightweight and compact alternative to older SIG handguns, the Pro .40 is popular among European police forces.", - "weight": "680 g", + "weight": "820 g", "volume": "500 ml", "price": 75000, "to_hit": -2, @@ -200,7 +200,7 @@ "name": "S&W 610", "name_plural": "S&W 610", "description": "The Smith and Wesson 610 is a classic six-shooter revolver chambered for 10mm rounds, or for S&W's own .40 round.", - "weight": "1133 g", + "weight": "1200 g", "volume": "500 ml", "price": 74000, "to_hit": -2, @@ -272,7 +272,7 @@ "type": "GUN", "name": "Hi-Point Model JCP", "description": "The Hi-Point Model JCP is a blowback operated semi automatic pistol designed by Hi-Point Firearms, which is known for making inexpensive firearms, and for making said firearms bulky and uncomfortable. Hi-Points have slides made with a zinc pot-metal which is relatively fragile compared to steel slides.", - "weight": "800 g", + "weight": "990 g", "volume": "703 ml", "price": 7500, "to_hit": -2, diff --git a/data/json/items/gun/410shot.json b/data/json/items/gun/410shot.json index c9ed0c8127ebf..17901b169636d 100644 --- a/data/json/items/gun/410shot.json +++ b/data/json/items/gun/410shot.json @@ -6,7 +6,7 @@ "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 g", + "weight": "3400 g", "volume": "2750 ml", "price": 189000, "to_hit": -1, diff --git a/data/json/items/gun/44.json b/data/json/items/gun/44.json index d5287ee4b4216..162da16e8edff 100644 --- a/data/json/items/gun/44.json +++ b/data/json/items/gun/44.json @@ -7,7 +7,7 @@ "name": "Desert Eagle .44", "name_plural": "Desert Eagle .44", "description": "One of the most recognizable handguns due to its popularity in movies and video games, the Desert Eagle is better known for its menacing appearance than its performance. It's a large pistol, but its heavy weight reduces recoil.", - "weight": "1800 g", + "weight": "1700 g", "volume": "750 ml", "price": 87500, "to_hit": -2, @@ -154,7 +154,7 @@ "name": "S&W 629", "name_plural": "S&W 629", "description": "A stainless steel, six-shot, double-action revolver with a matte black plastic handle manufactured by Smith & Wesson. Though hardly the most powerful handgun in the world any more, it could still blow a zombie's head clean off.", - "weight": "1276 g", + "weight": "1267 g", "volume": "750 ml", "price": 86100, "bashing": 10, diff --git a/data/json/items/gun/44paper.json b/data/json/items/gun/44paper.json index 7963b6fa5464e..05f9b27b4f78c 100644 --- a/data/json/items/gun/44paper.json +++ b/data/json/items/gun/44paper.json @@ -7,7 +7,7 @@ "name": "Colt M1860 Army", "name_plural": "Colt M1860 Army", "description": "The Colt Army Model 1860 is a cap & ball .44-caliber revolver. It was used during the American Civil War, and made by Colt's Manufacturing Company.", - "weight": "1220 g", + "weight": "1200 g", "volume": "750 ml", "price": 43000, "to_hit": -1, @@ -26,7 +26,7 @@ "type": "GUN", "name": "LeMat revolver", "description": "A Pietta reproduction of the civil war era LeMat revolver, a rare and unusual cap & ball .44-caliber revolver. While its original non-standard .42 or .35 caliber curbed its usefulness for the CSA army, this reproduction is offered in more prevalent .44 caliber. Despite modern quality materials, the design is still rather delicate.", - "weight": "1295 g", + "weight": "1410 g", "volume": "851 ml", "price": 120000, "bashing": 4, diff --git a/data/json/items/gun/45.json b/data/json/items/gun/45.json index b7502c23b9306..488353a01e8e8 100644 --- a/data/json/items/gun/45.json +++ b/data/json/items/gun/45.json @@ -6,7 +6,7 @@ "reload_noise_volume": 10, "name": "TDI Vector", "description": "The TDI Vector is a submachine gun with a unique, in-line design that makes recoil very manageable, even in the powerful .45 caliber.", - "weight": "2600 g", + "weight": "3100 g", "volume": "1750 ml", "price": 310000, "to_hit": -2, @@ -85,7 +85,7 @@ "name": "M1911", "//": "You can get 'em for over US$1K if you want. This is a fairly cheap remake.", "description": "The M1911 was the US Military standard-issue sidearm for most of the 20th Century. It remains one of the most popular .45 pistols today.", - "weight": "1035 g", + "weight": "1120 g", "volume": "500 ml", "price": 78400, "to_hit": -2, @@ -121,7 +121,7 @@ "reload_noise_volume": 10, "name": "MAC-10", "description": "The MAC-10 is a popular machine pistol originally designed for military use. For many years they were the most inexpensive automatic weapon in the US, and enjoyed great popularity among criminals less concerned with quality firearms.", - "weight": "2630 g", + "weight": "2840 g", "volume": "750 ml", "price": 180000, "to_hit": -2, @@ -264,7 +264,7 @@ "reload_noise_volume": 10, "name": "Thompson submachine gun", "description": "An American-made submachine gun developed during the very end of World War I, too late to see action. Infamous during the 1920s for its use by gangsters, and was used during World War II before being mostly replaced with less-expensive alternatives.", - "weight": "4630 g", + "weight": "5910 g", "volume": "2 L", "price": 450000, "to_hit": -2, @@ -302,6 +302,7 @@ "copy-from": "usp_9mm", "type": "GUN", "name": "USP .45", + "weight": "930 g", "ammo": "45", "ranged_damage": 0, "built_in_mods": [ "match_trigger" ], @@ -313,7 +314,7 @@ "type": "GUN", "name": "MK 23 MOD 0", "description": "Jokingly referred to as \"The World's Only Crew-Served Pistol\", this massive pistol was designed as a primary weapon for select \"special operators\". Its cumbersome nature, the introduction of the derivative HK USP series and the logistics of getting .45 ACP ammunition in theater doomed this behemoth to US SOCOM armories. Like the USP, the Mk 23 is a remarkably reliable gun; someone could probably take out a nuclear equipped walking tank with this in their holster.", - "weight": "1200 g", + "weight": "1120 g", "volume": "1607 ml", "default_mods": [ "suppressor", "laser_sight" ], "flags": [ "WATERPROOF_GUN", "NEVER_JAMS" ] @@ -344,7 +345,7 @@ "type": "GUN", "name": "Hi-Point Model JHP", "description": "The Hi-Point Model JHP is a blowback operated semi automatic pistol designed by Hi-Point Firearms, which is known for making inexpensive firearms, and for making said firearms bulky and uncomfortable. Hi-Points have slides made with a zinc pot-metal which is relatively fragile compared to steel slides.", - "weight": "800 g", + "weight": "990 g", "volume": "720 ml", "price": 7500, "to_hit": -2, diff --git a/data/json/items/gun/454.json b/data/json/items/gun/454.json index 6ae2c40fabafd..436d1bb6aa234 100644 --- a/data/json/items/gun/454.json +++ b/data/json/items/gun/454.json @@ -7,7 +7,7 @@ "name": "Taurus Raging Bull", "name_plural": "Taurus Raging Bull", "description": "The Taurus Raging Bull is a 5-shot revolver chambered in .454 Casull. It has impressive stopping power.", - "weight": "1700 g", + "weight": "1790 g", "volume": "750 ml", "price": 64100, "to_hit": -2, diff --git a/data/json/items/gun/4570.json b/data/json/items/gun/4570.json index 10f8df2560f8a..3047760e6add6 100644 --- a/data/json/items/gun/4570.json +++ b/data/json/items/gun/4570.json @@ -71,7 +71,7 @@ "name": "1874 Sharps", "name_plural": "1874 Sharps", "description": "A reproduction of an antique single-shot .45-70 rifle once used to hunt buffalo and other large game in the late 19th Century. Highly accurate and powerful for the time, this one is made to handle modern smokeless ammunition.", - "weight": "5500 g", + "weight": "5000 g", "volume": "3250 ml", "price": 210000, "to_hit": 1, diff --git a/data/json/items/gun/46.json b/data/json/items/gun/46.json index 45dac19c34820..426a883d17e4c 100644 --- a/data/json/items/gun/46.json +++ b/data/json/items/gun/46.json @@ -6,7 +6,7 @@ "reload_noise_volume": 10, "name": "H&K MP7A2", "description": "Designed as a personal defense weapon, the MP7 fires the high powered 4.6x30mm round while being lightweight, compact in size, and practically recoil free.", - "weight": "1780 g", + "weight": "1800 g", "volume": "2034 ml", "price": 175000, "to_hit": -2, diff --git a/data/json/items/gun/50.json b/data/json/items/gun/50.json index b8fceecbb9950..8a94e4a05488c 100644 --- a/data/json/items/gun/50.json +++ b/data/json/items/gun/50.json @@ -95,7 +95,7 @@ "type": "GUN", "name": "AI AS50", "description": ".50 caliber anti-materiel rifle made by Accuracy International. With high accuracy for long range target and high fire rate, this weapon is still being used by Greek national guard.", - "weight": "14000 g", + "weight": "13330 g", "volume": "3500 ml", "price": 1500000, "to_hit": -1, @@ -120,7 +120,7 @@ "type": "GUN", "name": "McMillan TAC-50", "description": "A long-range anti-materiel and anti-personnel sniper rifle made by McMillan Firearms, serving the Canadian Army since 2000 as the C15, and the Navy Seals as the Mk 15 Mod 0. This .50 caliber bolt-action rifle is capable of defeating light vehicles, radar installations and crew served weapons at extreme distances. It notably holds the longest range confirmed sniper kill, as well as the 4th and 5th longest.", - "weight": "11800 g", + "weight": "11020 g", "volume": "3127 ml", "price": 870000, "to_hit": -1, @@ -145,7 +145,7 @@ "type": "GUN", "name": "Serbu BFG-50", "description": "A single-shot, bolt-action rifle made by Serbu Firearms, the BFG-50 is a very affordable firearm for those wishing to shoot .50 BMG.", - "weight": "8504 g", + "weight": "8144 g", "volume": "1387 ml", "price": 239500, "to_hit": -1, diff --git a/data/json/items/gun/500.json b/data/json/items/gun/500.json index 6f3f6694b60f0..acc3f00276d54 100644 --- a/data/json/items/gun/500.json +++ b/data/json/items/gun/500.json @@ -43,7 +43,7 @@ "name": "S&W 500", "name_plural": "S&W 500", "description": "The 5-shot Smith and Wesson 500 revolver fires the comparably-named .500 S&W Magnum. It's an impressive weapon.", - "weight": "2055 g", + "weight": "1960 g", "volume": "750 ml", "price": 90000, "to_hit": -2, diff --git a/data/json/items/gun/545x39.json b/data/json/items/gun/545x39.json index 8f3fac8ea789c..845deed0a4758 100644 --- a/data/json/items/gun/545x39.json +++ b/data/json/items/gun/545x39.json @@ -7,7 +7,7 @@ "name": "AK-74M", "//": "AKs likewise aren't commercially traded in the US, plus this is newer.", "description": "The successor to the well-known AK-47 rifle. It combines the reliability of the AK series with the high-velocity, lightweight 5.45x39mm cartridge.", - "weight": "3170 g", + "weight": "3400 g", "volume": "1750 ml", "price": 390000, "to_hit": -1, @@ -45,7 +45,7 @@ "reload_noise_volume": 10, "name": "AN-94", "description": "Intended to replace the AK-74, this rifle uses a sophisticated mechanism to delay felt recoil, along with a very fast two-round burst mode. While its increased complexity prevented it from being adopted by the Russian military, it has seen service among their special forces.", - "weight": "3620 g", + "weight": "3850 g", "volume": "1750 ml", "price": 420000, "to_hit": -1, diff --git a/data/json/items/gun/57.json b/data/json/items/gun/57.json index 0c2e2d8b7edd8..eb396fdaff1cd 100644 --- a/data/json/items/gun/57.json +++ b/data/json/items/gun/57.json @@ -6,7 +6,7 @@ "reload_noise_volume": 10, "name": "FN Five-Seven", "description": "Designed to work with FN's proprietary 5.7x28mm round, the Five-Seven is a lightweight pistol with a very high capacity, best used against armored opponents.", - "weight": "490 g", + "weight": "600 g", "volume": "500 ml", "price": 124900, "to_hit": -2, @@ -43,7 +43,7 @@ "reload_noise_volume": 10, "name": "FN P90", "description": "The first in a new genre of guns, termed \"personal defense weapons.\" FN designed the P90 to use their proprietary 5.7x28mm ammunition. It is made for firing bursts manageably.", - "weight": "2300 g", + "weight": "2640 g", "volume": "1500 ml", "price": 350000, "to_hit": -2, diff --git a/data/json/items/gun/762.json b/data/json/items/gun/762.json index 745915174ea58..f99818dbc6bb1 100644 --- a/data/json/items/gun/762.json +++ b/data/json/items/gun/762.json @@ -6,7 +6,7 @@ "reload_noise_volume": 10, "name": "AKM", "description": "One of the most recognizable assault rifles ever made, the AKM is renowned for its durability even under the worst conditions.", - "weight": "2710 g", + "weight": "3300 g", "volume": "1750 ml", "price": 290000, "to_hit": -1, @@ -46,7 +46,7 @@ "name_plural": "Beretta ARX-160", "//": "Total unloaded weight of gun 3000 grams. Current weight of folding stock 200 grams.", "description": "The Beretta ARX-160 was a Phase II contender in the United States Army Individual Carbine competition to replace the M4 carbine. It failed to replace it, but it is widely used by military all around the world. This version is chambered for 7.62x39mm.", - "weight": "2800 g", + "weight": "3450 g", "volume": "1750 ml", "price": 450000, "to_hit": -1, diff --git a/data/json/items/gun/762R.json b/data/json/items/gun/762R.json index 1ad817a62305d..7a9dc055a6545 100644 --- a/data/json/items/gun/762R.json +++ b/data/json/items/gun/762R.json @@ -6,8 +6,9 @@ "name": "Mosin-Nagant M44", "name_plural": "Mosin-Nagant M44", "description": "The Model 44 is the carbine sized variant of the standard 1891/30. It has a shorter barrel, therefore it is weaker than the 1891/30, but easier to carry.", + "weight": "4100 g", "price": 23000, - "relative": { "weight": -500, "volume": -2, "range": -6, "ranged_damage": -3, "dispersion": 60, "barrel_length": -2 } + "relative": { "volume": -2, "range": -6, "ranged_damage": -3, "dispersion": 60, "barrel_length": -2 } }, { "id": "mosin44_ebr", @@ -16,6 +17,7 @@ "name": "Mosin-Nagant M44-EBR", "name_plural": "Mosin-Nagant M44-EBR", "description": "This carbine packs the classic Mosin-Nagant model 44 action in a modern-day stock capable of accepting modifications.", + "weight": "4330 g", "material": [ "steel", "plastic" ], "color": "light_gray", "valid_mod_locations": [ @@ -73,6 +75,7 @@ "name": "Mosin-Nagant 1891/30-EBR", "name_plural": "Mosin-Nagant 1891/30-EBR", "description": "This Mosin-Nagant has exchanged the classic wooden stock for a modern synthetic model, carefully balanced to the same weight and handling yet offering support for modern accessories.", + "weight": "4230 g", "material": [ "steel", "plastic" ], "color": "light_gray", "valid_mod_locations": [ diff --git a/data/json/items/gun/762x25.json b/data/json/items/gun/762x25.json index 7b3aad011a54b..b2a196d0ac7b0 100644 --- a/data/json/items/gun/762x25.json +++ b/data/json/items/gun/762x25.json @@ -48,7 +48,7 @@ "name_plural": "Tokarev TT-33", "//": "And it's therefore expensive.", "description": "The Tokarev TT-33 is an antique Russian semiautomatic pistol, famous for its durability, accuracy, and uncomfortable grip angle. It was chambered for the 7.62x25mm due to the popularity of the C96 pistol among Russian revolutionaries.", - "weight": "798 g", + "weight": "870 g", "volume": "500 ml", "price": 100000, "to_hit": -2, diff --git a/data/json/items/gun/9mm.json b/data/json/items/gun/9mm.json index 3fa05b1022a2d..6db4ec28df1d3 100644 --- a/data/json/items/gun/9mm.json +++ b/data/json/items/gun/9mm.json @@ -8,7 +8,7 @@ "name_plural": "Calico M960", "//": "Automatic variant. Cyclic fire rate: 750 rpm", "description": "The Calico M960 is an automatic carbine with a unique circular magazine that allows for high capacities and reduced recoil.", - "weight": "1680 g", + "weight": "2270 g", "volume": "1 L", "price": 240000, "to_hit": -2, @@ -48,7 +48,7 @@ "reload_noise_volume": 10, "name": "Cx4 Storm", "description": "A small pistol caliber carbine designed for police use and civilian self-defense, the Cx4 Storm uses magazines that are interchangeable with other Beretta 9x19mm handguns.", - "weight": "2300 g", + "weight": "2580 g", "volume": "1500 ml", "price": 90000, "to_hit": -1, @@ -89,7 +89,7 @@ "type": "GUN", "name": "Glock 19", "description": "Possibly the most popular pistol in existence. The Glock 19 is often derided for its plastic construction, but it is easy to shoot.", - "weight": "595 g", + "weight": "600 g", "volume": "500 ml", "price": 69000, "to_hit": -2, @@ -113,7 +113,7 @@ "reload_noise_volume": 10, "name": "H&K MP5A2", "description": "The Heckler & Koch MP5 is one of the most widely-used submachine guns in the world, and has been adopted by special police forces and militaries alike. Its high degree of accuracy and low recoil are universally praised.", - "weight": "2550 g", + "weight": "2730 g", "volume": "2894 ml", "price": 280000, "to_hit": -2, @@ -152,6 +152,7 @@ "type": "GUN", "name": "H&K MP5SD", "description": "The H&K MP5SD offers subsonic performance in almost the same footprint as the H&K MP5, retaining its handiness. The large suppressor cuts down on muzzle flash greatly, aiding in night operations. It has also seen some popularity with SWAT teams, as it lowers the risk of fire and explosions in illegal laboratories. With body armor in more common use, the MP5SD has waned in popularity among special forces due to its decreased terminal performance.", + "weight": "3230 g", "price": 3000000, "valid_mod_locations": [ [ "accessories", 3 ], @@ -175,6 +176,7 @@ "copy-from": "hk_mp5", "name": "H&K MP5K-PDW", "description": "The Heckler & Koch MP5 is one of the most widely-used submachine guns in the world, and has been adopted by special police forces and militaries alike. Its high degree of accuracy and low recoil are universally praised. The MP5K-PDW model features a shorter barrel, a built in foregrip, and a side folding stock for vehicle or aircraft crew use.", + "weight": "2360 g", "volume": "1753 ml", "bashing": 8, "dispersion": 270, @@ -201,7 +203,7 @@ "copy-from": "hk_mp5", "name": "PTR 603", "description": "The PTR 603 is a semi-automatic copy of the famous MP5 series, domestically produced for the US market on original Heckler and Koch tooling by PTR Industries. Like the MP5, its roller delayed blowback action offers smooth shooting and precision, setting it apart from other submachine guns and pistol caliber carbines. This model is configured as a pistol to avoid inconvenient and costly NFA regulations. A welded on section of M1913 rail offers convenient mounting for aftermarket optics, but precludes the use of claw mounts.", - "relative": { "weight": -300, "volume": "-500 ml", "handling_modifier": -6 }, + "relative": { "weight": -550, "volume": "-500 ml", "handling_modifier": -6 }, "//": "Attach a pistol stock and you get a semi MP5 again.", "modes": [ [ "DEFAULT", "semi-auto", 1 ] ], "bashing": 7, @@ -228,7 +230,7 @@ "type": "GUN", "name": "H&K operational briefcase", "description": "This is a hard-sided briefcase with a trigger in the handle and a concealed hole in the side. To fire the internally mounted MP5K-PDW, one braces the briefcase at the waist, ensures the briefcase is pointed at the enemy, and squeezes the trigger. Precision and handling are severely hampered all around, however if you need to 'hand over the goods' or look low profile while bodyguarding, this is your gun. When the briefcase is open the MP5 may be reloaded or dismounted.", - "weight": "3500 g", + "weight": "3570 g", "volume": "15 L", "price": 480000, "bashing": 15, @@ -247,7 +249,7 @@ "name": "Kel-Tec SUB-2000", "name_plural": "Kel-Tec SUB-2000", "description": "A uniquely designed pistol caliber carbine with an integral folding stock and that makes use of 9x19mm Glock magazines.", - "weight": "1985 g", + "weight": "1930 g", "volume": "1750 ml", "price": 75000, "to_hit": -1, @@ -449,7 +451,7 @@ "reload_noise_volume": 10, "name": "STEN", "description": "A British submachine gun developed during World War II, to make up for shortages of supplies. Designed to be made using unskilled labor and not known for reliability, its main advantages were low cost and being able to use German 9mm ammunition.", - "weight": "2945 g", + "weight": "3200 g", "volume": "1750 ml", "price": 40000, "bashing": 10, @@ -485,7 +487,7 @@ "name": "TEC-9", "name_plural": "TEC-9", "description": "The TEC-9 is a machine pistol made of cheap polymers and machine stamped parts. Its rise in popularity among criminals is largely due to its intimidating looks and low cost.", - "weight": "1080 g", + "weight": "1400 g", "volume": "500 ml", "price": 125000, "to_hit": -2, @@ -525,7 +527,7 @@ "name": "USP 9mm", "name_plural": "USP 9mm", "description": "A popular pistol, widely used among law enforcement. Extensively tested for durability, it has been found to stay accurate even after being subjected to extreme abuse.", - "weight": "520 g", + "weight": "770 g", "volume": "500 ml", "price": 68000, "to_hit": -2, @@ -551,7 +553,7 @@ "name_plural": "Uzi 9mm", "//": "SMGs aren't as commercially traded as rifles/handguns/SGs, so no cite for price points. Total weight of gun 3500 grams. Current weight of folding stock 200 grams.", "description": "The Uzi 9x19mm has enjoyed immense popularity, selling more units than any other submachine gun. It is widely used as a personal defense weapon, or as a primary weapon by elite frontline forces.", - "weight": "3300 g", + "weight": "2700 g", "volume": "1250 ml", "price": 208000, "to_hit": -2, @@ -589,7 +591,7 @@ "type": "GUN", "name": "Glock 17", "description": "Designed for all shooters, the Glock 17 is marketed towards law-enforcement and military.", - "weight": "595 g", + "weight": "630 g", "volume": "500 ml", "price": 69000, "to_hit": -2, @@ -612,6 +614,7 @@ "type": "GUN", "name": "Glock 18C", "description": "A selective fire variation on the Glock 17, originally designed for Austria's EKO Cobra unit. It has compensator cuts along its barrel to make recoil more manageable.", + "weight": "620 g", "price": 100000, "modes": [ [ "DEFAULT", "semi-auto", 1 ], [ "AUTO", "auto", 6 ] ], "built_in_mods": [ "barrel_ported" ] @@ -638,7 +641,7 @@ "type": "GUN", "name": "M17", "description": "The M17 is a semi automatic, short recoil operated pistol derived from the SIG Sauer P320.", - "weight": "800 g", + "weight": "840 g", "volume": "500 ml", "price": 69000, "to_hit": -2, @@ -679,7 +682,7 @@ "type": "GUN", "name": "Walther P38", "description": "The Walther P38 is a semi-automatic handgun adopted shortly before the second world war. Developed due to the high production costs of its predecessor, the Luger P08, the P38 is also chambered in 9mm Parabellum. This early DA/SA locked-breech design would introduce features later seen on more modern firearms such as the Beretta 92 series, and served Germany until 2004.", - "weight": "950 g", + "weight": "800 g", "volume": "547 ml", "price": 39000, "to_hit": -2, @@ -718,7 +721,7 @@ "type": "GUN", "name": "Hi-Point C-9", "description": "The Hi-Point C-9 is a blowback operated semi automatic pistol designed by Hi-Point Firearms, which is known for making inexpensive firearms, and for making said firearms bulky and uncomfortable. Hi-Points have slides made with a zinc pot-metal which is relatively fragile compared to steel slides.", - "weight": "709 g", + "weight": "820 g", "volume": "539 ml", "price": 7500, "to_hit": -2, @@ -738,7 +741,7 @@ "type": "GUN", "name": "CZ-75", "description": "The CZ-75 is a semi-automatic pistol developed in Czechoslovakia, and is one of the original wonder nines. Though designed for export to western countries, it was declared a state secret; lack of international patent protection meant that many clones and variants were produced and distributed around the world, with Česká zbrojovka only joining in the 90's. This pistol remains wildly popular among competition shooters.", - "weight": "1120 g", + "weight": "1000 g", "volume": "526 ml", "price": 10000, "to_hit": -2, @@ -758,7 +761,7 @@ "type": "GUN", "name": "Walther CCP", "description": "The Walther CCP is a gas-delayed blowback semi-automatic pistol intended for the concealed carry consumer market. Internally, it is nearly identical to the cult classic H&K P7. Its fixed barrel design makes it potentially more accurate than many other pistols, though this may difficult to realize with its average trigger and short sight radius.", - "weight": "633 g", + "weight": "570 g", "volume": "318 ml", "price": 12500, "to_hit": -2, diff --git a/data/json/items/gun/9x18.json b/data/json/items/gun/9x18.json index 6a3fd5e7c56a2..7a23a072d4faa 100644 --- a/data/json/items/gun/9x18.json +++ b/data/json/items/gun/9x18.json @@ -42,7 +42,7 @@ "name": "Skorpion Vz. 82", "//": "Total unloaded weight of gun 1451.496 grams, rounded to 1451. Current weight of folding stock 200 grams.", "description": "A version of the Skorpion submachine gun chambered in 9x18mm Makarov, with a slightly longer barrel than the original design.", - "weight": "1251 g", + "weight": "1440 g", "ammo": "9x18", "min_cycle_recoil": 270, "modes": [ [ "DEFAULT", "semi-auto", 1 ], [ "AUTO", "auto", 5 ] ], diff --git a/data/json/items/gun/shot.json b/data/json/items/gun/shot.json index ca70ed0ea790c..6e2a1db29ef91 100644 --- a/data/json/items/gun/shot.json +++ b/data/json/items/gun/shot.json @@ -115,8 +115,8 @@ "name": "M1014 shotgun", "name_plural": "M1014 shotguns", "description": "Benelli's first gas-operated shotgun, featuring dual pistons for enhanced reliability with various loads and a collapsible buttstock that reduces length by almost 8 inches. Adopted in 1999 as the M1014 Joint Service Combat Shotgun, the Benelli M4 is one of the finest combat shotguns available.", - "weight": "3820 g", - "volume": "2069 ml", + "weight": "3550 g", + "volume": "2500 ml", "price": 169900, "to_hit": -1, "bashing": 12, @@ -146,8 +146,8 @@ "name": "Mossberg 500 Field", "name_plural": "Mossberg 500 Field", "description": "The Mossberg 500 is a popular series of pump-action shotguns, often acquired for military use. It is noted for its high durability and low recoil. This one is fitted with a 28 inch barrel with sight rib.", - "weight": "3401 g", - "volume": "2942 ml", + "weight": "3180 g", + "volume": "2500 ml", "price": 53800, "to_hit": -1, "bashing": 13, @@ -333,7 +333,7 @@ "id": "remington_870_express", "copy-from": "remington_870", "type": "GUN", - "name": "Remington 870 express", + "name": { "str": "Remington 870 express", "str_pl": "Remington 870 expresses" }, "description": "With over 10 million made, the Remington 870 is one of the most popular shotguns on the market, and finds use with hunters and law enforcement agencies alike thanks to its high accuracy and muzzle velocity. This one is an 18.5 inch barreled defensive model.", "weight": "3402 g", "volume": "2696 ml", @@ -413,9 +413,9 @@ "type": "GUN", "name": "Saiga-12", "description": "The Saiga-12 is a semi-automatic shotgun designed on the same Kalashnikov pattern as the AK47 rifle. It reloads with a magazine, rather than one shell at a time like most shotguns. It is one of the last designs of Mikhail Kalashnikov, and was popular in open division shotgun competitions prior to its ban from import via executive order.", - "weight": "3550 g", - "volume": "3279 ml", - "price": 75000, + "weight": "3600 g", + "volume": "2750 ml", + "price": 189000, "to_hit": -1, "bashing": 12, "material": [ "steel", "plastic" ], diff --git a/data/json/items/gunmod/grip.json b/data/json/items/gunmod/grip.json index 32eae74d5fa27..f32743265640d 100644 --- a/data/json/items/gunmod/grip.json +++ b/data/json/items/gunmod/grip.json @@ -15,7 +15,8 @@ "mod_targets": [ "pistol", "smg", "rifle", "shotgun", "crossbow", "launcher" ], "handling_modifier": -2, "min_skills": [ [ "weapon", 3 ] ], - "flags": [ "REDUCED_WEIGHT", "REDUCED_BASHING" ] + "weight_multiplier": 0.75, + "flags": [ "REDUCED_BASHING" ] }, { "id": "pistol_grip", diff --git a/data/json/items/gunmod/laser_gunmods.json b/data/json/items/gunmod/laser_gunmods.json index 1d44d81c4b3c2..91651a8f41c8c 100644 --- a/data/json/items/gunmod/laser_gunmods.json +++ b/data/json/items/gunmod/laser_gunmods.json @@ -20,7 +20,7 @@ { "id": "focusing_lens", "type": "GUNMOD", - "name": "focusing lens", + "name": { "str": "focusing lens", "str_pl": "focusing lenses" }, "description": "A set of optics to concentrate the laser beam on a smaller focus point. This increases range and damage output, but complicates targeting.", "weight": "380 g", "volume": "250 ml", diff --git a/data/json/items/melee/knives_kitchen.json b/data/json/items/melee/knives_kitchen.json index 08bf943232987..03be51eec5b49 100644 --- a/data/json/items/melee/knives_kitchen.json +++ b/data/json/items/melee/knives_kitchen.json @@ -1,7 +1,7 @@ [ { "id": "base_kitchen_knife", - "name": "generic kitchen knife", + "name": { "str": "generic kitchen knife", "str_pl": "generic kitchen knives" }, "description": "generic item template", "type": "TOOL", "material": "steel", diff --git a/data/json/items/obsolete.json b/data/json/items/obsolete.json index 412372e9fdc41..907b1fe810ec6 100644 --- a/data/json/items/obsolete.json +++ b/data/json/items/obsolete.json @@ -765,7 +765,7 @@ { "type": "GENERIC", "id": "lily_flower", - "name": "lily", + "name": { "str": "lily", "str_pl": "lilies" }, "description": "A lily stalk with some petals.", "weight": "40 g", "to_hit": -3, @@ -791,7 +791,7 @@ { "type": "GENERIC", "id": "lotus_flower", - "name": "lotus", + "name": { "str": "lotus", "str_pl": "lotuses" }, "description": "A lotus stalk with some petals.", "weight": "40 g", "to_hit": -3, diff --git a/data/json/items/robot_parts.json b/data/json/items/robot_parts.json index 37d22cda8344e..46f009b9e8d1d 100644 --- a/data/json/items/robot_parts.json +++ b/data/json/items/robot_parts.json @@ -50,7 +50,7 @@ { "type": "GENERIC", "id": "self_monitoring_module", - "name": "self monitoring sensors", + "name": { "str": "self monitoring sensors", "str_pl": "self monitoring sensors" }, "description": "A array of sensors and diagnostic modules allowing the robot to perceive itself.", "copy-from": "robot_module_abstract" }, diff --git a/data/json/items/tool/deployable.json b/data/json/items/tool/deployable.json index 545a15cfd1fae..bc74b04e9482b 100644 --- a/data/json/items/tool/deployable.json +++ b/data/json/items/tool/deployable.json @@ -173,7 +173,7 @@ "to_hit": -4, "bashing": 7, "material": [ "wood" ], - "looks_like": [ "f_wood_keg" ], + "looks_like": "f_wood_keg", "symbol": "u", "color": "light_gray", "use_action": { "type": "deploy_furn", "furn_type": "f_butter_churn" }, diff --git a/data/json/items/tool/handloading.json b/data/json/items/tool/handloading.json index 4e08303a23068..cd64a3f65a18a 100644 --- a/data/json/items/tool/handloading.json +++ b/data/json/items/tool/handloading.json @@ -2,7 +2,7 @@ { "id": "press", "type": "TOOL", - "name": "hand press", + "name": { "str": "hand press", "str_pl": "hand presses" }, "description": "This is a small hand press for hand loading firearm ammunition. It comes with everything you need to start hand loading your own munitions.", "weight": "6350 g", "volume": "500 ml", @@ -16,7 +16,7 @@ { "id": "press_dowel", "type": "TOOL", - "name": "makeshift shotshell 'press'", + "name": { "str": "makeshift shotshell 'press'", "str_pl": "makeshift shotshell 'presses'" }, "description": "This is a collection of items improvised for field reloading of shotshells. A plank with a hole cut in the center, a medium sized nail, and a whittled dowel are used to seat wads, decap primers, and reprime (carefully!) hulls. Powder and shot are measured with a cut down fired shotshell. The opposite side of the plank has been shaped to allow for roll crimping of the plastic hulls. There's no provision for resizing, so reloaded hulls will fire best in the firearm they were fired from.", "weight": "348 g", "volume": "250 ml", diff --git a/data/json/items/tool_armor.json b/data/json/items/tool_armor.json index 1f8a870637201..91f065b64932f 100644 --- a/data/json/items/tool_armor.json +++ b/data/json/items/tool_armor.json @@ -2736,7 +2736,7 @@ "id": "scuba_tank_on", "type": "TOOL_ARMOR", "category": "other", - "name": "scuba tank (on)", + "name": { "str": "scuba tank (on)", "str_pl": "scuba tanks (on)" }, "description": "This is a high-pressure 232 bar diving tank that can contain up to 12L of compressed mixture of oxygen and nitrogen. It is equipped with a on-demand regulator and a mouthpiece designed mostly for underwater use.", "looks_like": "oxygen_tank", "weight": "16000 g", @@ -2791,7 +2791,7 @@ "id": "small_scuba_tank_on", "type": "TOOL_ARMOR", "category": "other", - "name": "small scuba tank (on)", + "name": { "str": "small scuba tank (on)", "str_pl": "small scuba tanks (on)" }, "description": "This is a small high-pressure 200 bar backup diving tank, that can contain 4L of compressed mixture of oxygen and nitrogen. It is equipped with a on-demand regulator and a mouthpiece designed mostly for underwater use.", "looks_like": "smoxygen_tank", "weight": "7000 g", diff --git a/data/json/items/tools.json b/data/json/items/tools.json index d1533f0bec7f9..e5d325d979edc 100644 --- a/data/json/items/tools.json +++ b/data/json/items/tools.json @@ -1814,7 +1814,7 @@ { "id": "tindalos_whistle", "type": "TOOL", - "name": "Whistle of Tindalos", + "name": { "str": "Whistle of Tindalos", "str_pl": "Whistles of Tindalos" }, "description": "Who is this Tindalos guy?", "weight": "22 g", "volume": 0, @@ -4026,7 +4026,7 @@ { "id": "brush", "type": "TOOL", - "name": "scrub brush", + "name": { "str": "scrub brush", "str_pl": "scrub brushes" }, "description": "This is a simple scrub brush.", "weight": "70 g", "volume": "250 ml", @@ -6271,7 +6271,7 @@ "id": "tool_rocket_candy", "type": "TOOL", "category": "weapons", - "name": "rocket candy", + "name": { "str": "rocket candy", "str_pl": "rocket candies" }, "description": "A pear-shaped chunk of rocket candy obtained by heating saltpeter with sugar and casting the obtained liquid. Can serve as a rocket fuel, but also as a smokescreen - if you lit the narrow end, you should be able to throw it before the flame reaches the broad end.", "weight": "250 g", "volume": "250 ml", @@ -6295,7 +6295,7 @@ "id": "tool_rocket_candy_act", "type": "TOOL", "category": "weapons", - "name": "burning rocket candy", + "name": { "str": "burning rocket candy", "str_pl": "burning rocket candies" }, "description": "This is a chunk of rocket candy that has been lit on fire and burns with a loud hiss, spewing forth large amounts of smoke.", "weight": "250 g", "volume": "250 ml", @@ -7394,7 +7394,8 @@ "to_hit": -2, "bashing": 6, "material": "steel", - "use_action": { "type": "weigh_self", "max_weight": 150000 } + "use_action": { "type": "weigh_self", "max_weight": 150000 }, + "flags": [ "ALLOWS_REMOTE_USE" ] }, { "id": "acetylene_machine", diff --git a/data/json/items/vehicle/tables.json b/data/json/items/vehicle/tables.json index 97b028be904e5..52c76358d6f90 100644 --- a/data/json/items/vehicle/tables.json +++ b/data/json/items/vehicle/tables.json @@ -26,7 +26,7 @@ { "type": "GENERIC", "id": "workbench", - "name": "workbench", + "name": { "str": "workbench", "str_pl": "workbenches" }, "description": "A sturdy workbench built out of metal. It is perfect for crafting large and heavy things.", "weight": "23000 g", "material": [ "steel" ], diff --git a/data/json/items/vehicle/wheel.json b/data/json/items/vehicle/wheel.json index ccf5045e81599..3f3090fd7a5ae 100644 --- a/data/json/items/vehicle/wheel.json +++ b/data/json/items/vehicle/wheel.json @@ -16,7 +16,7 @@ "id": "wheel_mount_medium", "type": "GENERIC", "category": "veh_parts", - "name": "medium wheel hub assembly", + "name": { "str": "medium wheel hub assembly", "str_pl": "medium wheel hub assemblies" }, "description": "A metal assembly that allows bolting a wheel on a car. Fit for a car wheel.", "weight": "5 kg", "volume": "6 L", @@ -31,7 +31,7 @@ "id": "wheel_mount_heavy", "type": "GENERIC", "category": "veh_parts", - "name": "heavy wheel hub assembly", + "name": { "str": "heavy wheel hub assembly", "str_pl": "heavy wheel hub assemblies" }, "description": "A heavy metal assembly that allows bolting a wheel on a car. Fit for a large car wheel.", "weight": "6 kg", "volume": "7 L", @@ -188,7 +188,7 @@ }, { "id": "wheel_rail_small_pair", - "name": "pair of small rail wheels", + "name": { "str": "pair of small rail wheels", "str_pl": "pairs of small rail wheels" }, "type": "WHEEL", "description": "A pair of small rail wheels. It fits small railroad rails found in places like amusement parks. Mostly for hobby purposes rather then transportation.", "copy-from": "wheel_rail", diff --git a/data/json/items/vehicle_parts.json b/data/json/items/vehicle_parts.json index 60fd123b72f37..781f5cf511b21 100644 --- a/data/json/items/vehicle_parts.json +++ b/data/json/items/vehicle_parts.json @@ -95,7 +95,7 @@ { "id": "yoke_harness", "type": "WHEEL", - "name": "yoke and harness", + "name": { "str": "yoke and harness", "str_pl": "yokes and harnesses" }, "category": "veh_parts", "description": "A bar and harness to attach a creature to a wheeled vehicle, they then should be able to pull it.", "weight": "1000 g", diff --git a/data/json/mapgen/garage.json b/data/json/mapgen/garage.json index f09175017c530..0b8dfc194b2c7 100644 --- a/data/json/mapgen/garage.json +++ b/data/json/mapgen/garage.json @@ -64,7 +64,7 @@ "p": "f_hydraulic_press", "l": "f_heavy_lathe", "t": "f_toilet", - "x": "f_crate_c", + "x": "f_utility_shelf", "h": "f_chair", "U": [ "f_dumpster", "f_recycle_bin" ] }, @@ -72,7 +72,7 @@ "L": { "item": "clothing_work_set", "chance": 55 }, "c": { "item": "mechanics", "chance": 60 }, "S": { "item": "mechanics", "chance": 80, "repeat": [ 1, 6 ] }, - "x": { "item": "mechanics", "chance": 80, "repeat": [ 1, 3 ] } + "x": { "item": "SUS_welding_gear", "chance": 80, "repeat": [ 1, 2 ] } }, "place_vehicles": [ { "vehicle": "garage", "x": [ 8, 8 ], "y": [ 9, 10 ], "chance": 25, "rotation": 90 }, @@ -263,8 +263,8 @@ " |c........c|-------+-|X", " |c.xx..xx.p|xx.+T|<..OX", " |l.xx..xx.c|x..-|----|X", - " |S.........O..xx|4UUXXX", - " |ScccccccSS|----|UXXXXX", + " |w.........O..xx|4UUXXX", + " |ScccccccwS|----|UXXXXX", " |----------|WWWWWWWWWWW", " " ], @@ -305,6 +305,7 @@ "S": "f_utility_shelf", "s": "f_sink", "t": "f_toilet", + "w": "f_utility_shelf", "x": "f_crate_c", "f": "f_filing_cabinet", "h": "f_chair", @@ -316,6 +317,7 @@ "c": { "item": "mechanics", "chance": 60 }, "S": { "item": "mechanics", "chance": 80, "repeat": [ 1, 6 ] }, "x": { "item": "mechanics", "chance": 80, "repeat": [ 1, 6 ] }, + "w": { "item": "SUS_welding_gear", "chance": 80, "repeat": [ 1, 2 ] }, "f": { "item": "office", "chance": 70, "repeat": [ 1, 6 ] }, "d": { "item": "office", "chance": 70, "repeat": [ 1, 6 ] }, "T": { "item": "cleaning", "chance": 70, "repeat": [ 1, 6 ] } diff --git a/data/json/mapgen/hazardous_waste_sarcophagus.json b/data/json/mapgen/hazardous_waste_sarcophagus.json index 21b9f73f80cc7..12532ead88c59 100644 --- a/data/json/mapgen/hazardous_waste_sarcophagus.json +++ b/data/json/mapgen/hazardous_waste_sarcophagus.json @@ -148,7 +148,12 @@ "F": { "item": "office_paper", "chance": 50 } }, "place_item": [ { "item": "id_military", "x": 22, "y": 20 }, { "item": "cleansuit", "x": 28, "y": 24 } ], - "set": [ { "square": "radiation", "amount": [ 10, 30 ], "x": 0, "y": 0, "x2": 47, "y2": 47 } ], + "set": [ + { "square": "radiation", "amount": [ 10, 30 ], "x": 0, "y": 0, "x2": 23, "y2": 23 }, + { "square": "radiation", "amount": [ 10, 30 ], "x": 0, "y": 24, "x2": 23, "y2": 47 }, + { "square": "radiation", "amount": [ 10, 30 ], "x": 24, "y": 0, "x2": 47, "y2": 23 }, + { "square": "radiation", "amount": [ 10, 30 ], "x": 24, "y": 24, "x2": 47, "y2": 47 } + ], "place_monster": [ { "monster": "mon_hazmatbot", "x": 36, "y": 20 }, { "monster": "mon_hazmatbot", "x": 13, "y": 29 }, @@ -287,7 +292,12 @@ "~": [ { "item": "trash", "chance": 50 }, { "item": "sewer", "chance": 50 }, { "item": "nanomaterials", "chance": 3 } ] }, "place_item": [ { "item": "sarcophagus_access_code", "x": 20, "y": 31 } ], - "set": [ { "square": "radiation", "amount": [ 10, 70 ], "x": 0, "y": 0, "x2": 47, "y2": 47 } ], + "set": [ + { "square": "radiation", "amount": [ 10, 30 ], "x": 0, "y": 0, "x2": 23, "y2": 23 }, + { "square": "radiation", "amount": [ 10, 30 ], "x": 0, "y": 24, "x2": 23, "y2": 47 }, + { "square": "radiation", "amount": [ 10, 30 ], "x": 24, "y": 0, "x2": 47, "y2": 23 }, + { "square": "radiation", "amount": [ 10, 30 ], "x": 24, "y": 24, "x2": 47, "y2": 47 } + ], "monster": { " ": { "monster": "mon_zombie", "chance": 10 } }, "monsters": { "~": { "monster": "GROUP_VANILLA", "chance": 20, "density": 0.1 } }, "computers": { @@ -319,6 +329,7 @@ { "id": "nanomaterials", "type": "item_group", + "subtype": "collection", "entries": [ { "item": "nanomaterial", "prob": 100 } ] } ] diff --git a/data/json/mapgen/shelter.json b/data/json/mapgen/shelter.json index 08c04be62d0d2..c334dc18539ce 100644 --- a/data/json/mapgen/shelter.json +++ b/data/json/mapgen/shelter.json @@ -5,16 +5,29 @@ "subtype": "collection", "//": "now used for shelters that have been looted by kids, see SUS groups for general shelter supplies", "items": [ - [ "jacket_evac", 10 ], - [ "emer_blanket", 40 ], [ "wrapper", 90 ], + [ "evac_pamphlet", 80 ], [ "glass_shard", 80 ], + [ "emer_blanket", 40 ], [ "bottle_plastic", 30 ], [ "plastic_knife", 20 ], [ "plastic_spoon", 20 ], [ "plastic_fork", 20 ], [ "bowl_plastic", 10 ], - [ "evac_pamphlet", 80 ], + [ "jacket_evac", 15 ], + [ "folding_poncho", 10 ], + [ "sponge", 10 ], + [ "mask_dust", 9 ], + [ "handflare_dead", 9 ], + [ "whistle", 7 ], + [ "teddy_bear", 7 ], + { "item": "vinegar", "prob": 6, "charges-min": 1 }, + [ "candle", 5 ], + [ "pliers", 4 ], + [ "mirror", 4 ], + [ "wearable_light", 2 ], + [ "calcium_tablet", 1 ], + [ "vitamins", 1 ], { "item": "protein_bar_evac", "count": [ 0, 3 ] } ] }, diff --git a/data/json/mapgen/steel_mill/steel_mill_z2.json b/data/json/mapgen/steel_mill/steel_mill_z2.json index b18b63b7901e9..f4b994053c9af 100644 --- a/data/json/mapgen/steel_mill/steel_mill_z2.json +++ b/data/json/mapgen/steel_mill/steel_mill_z2.json @@ -133,7 +133,7 @@ "::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::", "::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::" ], - "terrain": [ { "M": "t_grate" }, { "8": "t_grate" } ], + "terrain": { "M": "t_grate", "8": "t_grate" }, "furniture": { }, "palettes": [ "steel_mill_palette" ], "place_monsters": [ diff --git a/data/json/monsterdrops/monster_drops.json b/data/json/monsterdrops/monster_drops.json index 292cf5b945653..367f8cdfd1b30 100644 --- a/data/json/monsterdrops/monster_drops.json +++ b/data/json/monsterdrops/monster_drops.json @@ -347,38 +347,6 @@ { "item": "cash_card", "charges-min": 0, "charges-max": 50000 } ] }, - { - "type": "item_group", - "subtype": "collection", - "id": "mon_zombie_bio_op_death_drops", - "ammo": 30, - "magazine": 100, - "entries": [ - { "group": "bio_op_boots", "damage": [ 1, 4 ] }, - { "group": "mil_armor_torso", "damage": [ 1, 4 ] }, - { "group": "mil_armor_pants", "damage": [ 1, 4 ] }, - { "group": "mil_armor_helmet", "damage": [ 1, 4 ], "prob": 50 }, - { "group": "bio_op_face", "damage": [ 1, 4 ], "prob": 50 }, - { "group": "bio_op_torso", "damage": [ 1, 4 ], "prob": 50 }, - { "group": "bio_op_gloves", "damage": [ 1, 4 ], "prob": 50 }, - { "group": "underwear", "damage": [ 1, 4 ] }, - { - "distribution": [ - { "group": "ammo_milspec", "prob": 15 }, - { "group": "guns_pistol_milspec", "prob": 5 }, - { "group": "guns_shotgun_milspec", "prob": 4 }, - { "group": "guns_smg_milspec", "prob": 5 }, - { "group": "guns_rifle_milspec", "prob": 10 }, - { "group": "bots", "prob": 1 }, - { "group": "grenades", "prob": 5 }, - { "group": "mil_accessories", "prob": 10 }, - { "group": "mil_food", "prob": 5 }, - { "group": "bionics_mil", "prob": 1 } - ] - }, - { "item": "cash_card", "charges-min": 0, "charges-max": 50000 } - ] - }, { "type": "item_group", "subtype": "collection", diff --git a/data/json/monsterdrops/zombie_soldier.json b/data/json/monsterdrops/zombie_soldier.json index ad708b90a70ab..a3698aa977ff5 100644 --- a/data/json/monsterdrops/zombie_soldier.json +++ b/data/json/monsterdrops/zombie_soldier.json @@ -8,45 +8,22 @@ "entries": [ { "distribution": [ - { "group": "clothing_soldier_set", "prob": 65, "damage-min": 1, "damage-max": 4 }, - { "group": "clothing_soldier_winter_set", "prob": 35, "damage-min": 1, "damage-max": 4 } + { "group": "clothing_soldier_set", "prob": 65, "damage": [ 1, 4 ] }, + { "group": "clothing_soldier_winter_set", "prob": 35, "damage": [ 1, 4 ] } ] }, - { "group": "gear_soldier_sidearm", "prob": 30, "damage-min": 1, "damage-max": 4 }, - { - "collection": [ - { - "distribution": [ - { "group": "guns_rifle_milspec", "prob": 75, "damage-min": 1, "damage-max": 4 }, - { "group": "guns_shotgun_milspec", "prob": 25, "damage-min": 1, "damage-max": 4 } - ] - }, - { - "distribution": [ - { "item": "red_dot_sight", "prob": 100 }, - { "item": "suppressor", "prob": 100 }, - { "item": "laser_sight", "prob": 50 }, - { "collection": [ { "item": "m320" }, { "group": "ammo_launcher_grenade" } ], "prob": 100 } - ], - "prob": 30 - } - ], - "prob": 20 - }, { "distribution": [ - { "item": "LAW_Packed", "prob": 20 }, - { "item": "e_tool", "prob": 100 }, - { "item": "mask_gas", "prob": 100, "charges-min": 1, "charges-max": 100, "damage-min": 1, "damage-max": 4 }, - { "item": "two_way_radio", "prob": 50 }, - { "item": "c4", "prob": 10 } - ], - "prob": 20 + { "group": "military_standard_assault_rifles", "prob": 75 }, + { "group": "military_standard_lmgs", "prob": 10 }, + { "group": "military_standard_sniper_rifles", "prob": 10 }, + { "group": "military_standard_shotguns", "prob": 5 } + ] }, - { "item": "grenade", "prob": 5 }, - { "group": "drugs_soldier", "prob": 20 }, - { "group": "mil_food", "prob": 15 }, - { "item": "id_military", "prob": 5 }, + { "group": "infantry_common_gear" }, + { "group": "military_standard_grenades", "count": [ 1, 3 ], "prob": 20 }, + { "group": "military_patrol_food" }, + { "distribution": [ { "group": "infantry_officer_gear" }, { "group": "infantry_medical_gear" } ], "prob": 25 }, { "item": "cash_card", "prob": 10, "charges-min": 0, "charges-max": 50000 }, { "group": "misc_smoking", "prob": 30 } ] @@ -56,5 +33,36 @@ "type": "item_group", "subtype": "distribution", "entries": [ { "group": "mon_zombie_soldier_death_drops" }, { "group": "mon_zombie_cop_death_drops" } ] + }, + { + "type": "item_group", + "subtype": "collection", + "id": "mon_zombie_bio_op_death_drops", + "magazine": 100, + "ammo": 60, + "entries": [ + { + "distribution": [ + { "group": "clothing_soldier_set", "prob": 65, "damage": [ 1, 4 ] }, + { "group": "clothing_soldier_winter_set", "prob": 35, "damage": [ 1, 4 ] } + ] + }, + { + "distribution": [ + { "group": "military_standard_assault_rifles", "contents-group": "sopmod", "prob": 75 }, + { "group": "military_standard_lmgs", "prob": 10 }, + { "group": "military_standard_sniper_rifles", "prob": 10 }, + { "group": "military_standard_shotguns", "prob": 5 } + ] + }, + { "group": "infantry_common_gear" }, + { "group": "military_standard_grenades", "count": [ 1, 3 ], "prob": 20 }, + { "group": "military_patrol_food" }, + { + "collection": [ { "group": "infantry_officer_gear", "prob": 90 }, { "group": "infantry_medical_gear", "prob": 80 } ] + }, + { "item": "cash_card", "prob": 10, "charges-min": 0, "charges-max": 50000 }, + { "group": "misc_smoking", "prob": 30 } + ] } ] diff --git a/data/json/monsters/defense_bot.json b/data/json/monsters/defense_bot.json index 53290ecf44f6e..a8b43a916600e 100644 --- a/data/json/monsters/defense_bot.json +++ b/data/json/monsters/defense_bot.json @@ -205,7 +205,7 @@ { "id": "mon_dispatch", "type": "MONSTER", - "name": { "str": "NR-031 Dispatch" }, + "name": { "str": "NR-031 Dispatch", "str_pl": "NR-031 Dispatches" }, "description": "The Northrop Dispatch, designed for crowd control situations, carries and deploys kamikaze drones of various types. 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.", "default_faction": "defense_bot", "species": [ "ROBOT" ], @@ -238,7 +238,7 @@ { "id": "mon_dispatch_military", "type": "MONSTER", - "name": { "str": "NR-V05-M Dispatch" }, + "name": { "str": "NR-V05-M Dispatch", "str_pl": "NR-V05-M Dispatches" }, "description": "The Northrop Dispatch, designed for crowd control situations, carries and deploys kamikaze drones of various types. The dark green paint job marks the lethal and feared military variant, carrying extreme and deadly firepower.", "default_faction": "defense_bot", "species": [ "ROBOT" ], diff --git a/data/json/monsters/mammal.json b/data/json/monsters/mammal.json index 04a3eda477084..6d95772cbe3f3 100644 --- a/data/json/monsters/mammal.json +++ b/data/json/monsters/mammal.json @@ -254,7 +254,7 @@ { "id": "mon_cow_calf", "type": "MONSTER", - "name": "calf", + "name": { "str": "calf", "str_pl": "calves" }, "description": "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.", "default_faction": "herbivore", "bodytype": "dog", diff --git a/data/json/npcs/TALK_TEST.json b/data/json/npcs/TALK_TEST.json index 3689139115853..93cdab41ac3b3 100644 --- a/data/json/npcs/TALK_TEST.json +++ b/data/json/npcs/TALK_TEST.json @@ -117,7 +117,7 @@ "responses": [ { "text": "This is a basic test response.", "topic": "TALK_DONE" }, { "text": "This is a cash test response.", "topic": "TALK_DONE", "condition": { "u_has_cash": 500 } }, - { "text": "This is an npc service test response.", "topic": "TALK_DONE", "condition": { "npc_service": 500 } }, + { "text": "This is an npc service test response.", "topic": "TALK_DONE", "condition": { "npc_service": true } }, { "text": "This is an npc available test response.", "topic": "TALK_DONE", "condition": "npc_available" } ] }, diff --git a/data/json/npcs/TALK_TRUE_FOODPERSON.json b/data/json/npcs/TALK_TRUE_FOODPERSON.json index 3af15cc0db5b0..c67aa640abab7 100644 --- a/data/json/npcs/TALK_TRUE_FOODPERSON.json +++ b/data/json/npcs/TALK_TRUE_FOODPERSON.json @@ -92,7 +92,7 @@ ] }, "text": "I am you but from an alternate reality.", - "trial": { "type": "LIE", "difficulty": 10, "mod": { "trust": 1, "value": 1 } }, + "trial": { "type": "LIE", "difficulty": 10, "mod": [ [ "TRUST", 1 ], [ "VALUE", 1 ] ] }, "success": { "topic": "TALK_FOODPERSON_MULTIVERSE", "opinion": { "trust": 2, "value": 2 } }, "failure": { "topic": "TALK_FOODPERSON_ONLYONE", "opinion": { "trust": -5, "value": -5 } } }, diff --git a/data/json/npcs/isherwood_farm/NPC_Barry_Isherwood.json b/data/json/npcs/isherwood_farm/NPC_Barry_Isherwood.json index 11a70b1485f3e..834ab44363852 100644 --- a/data/json/npcs/isherwood_farm/NPC_Barry_Isherwood.json +++ b/data/json/npcs/isherwood_farm/NPC_Barry_Isherwood.json @@ -77,7 +77,7 @@ "destination": "dairy_farm_isherwood_W", "start": { "effect": [ { "u_add_var": "u_have_barry_escape", "type": "general", "context": "meeting", "value": "yes" } ], - "assign_mission_target": { "om_terrain": "dairy_farm_isherwood_W", "om_special": "Isherwood Farms", "reveal_radius": 3 } + "assign_mission_target": { "om_terrain": "dairy_farm_isherwood_W", "reveal_radius": 3 } }, "end": { "opinion": { "trust": 5, "value": 5 }, diff --git a/data/json/npcs/isherwood_farm/NPC_Carlos_Isherwood.json b/data/json/npcs/isherwood_farm/NPC_Carlos_Isherwood.json index a8fd1ec2c2c2a..2057b0d5855e5 100644 --- a/data/json/npcs/isherwood_farm/NPC_Carlos_Isherwood.json +++ b/data/json/npcs/isherwood_farm/NPC_Carlos_Isherwood.json @@ -195,13 +195,7 @@ "end": { "opinion": { "trust": 1, "value": 1 }, "effect": [ { "u_buy_item": "leather_armor_horse", "count": 1 } ], - "update_mapgen": [ - { - "om_terrain": "horse_farm_isherwood_4", - "om_special": "Isherwood Farms", - "set": [ { "point": "furniture", "id": "f_anvil", "x": 6, "y": 12 } ] - } - ] + "update_mapgen": [ { "om_terrain": "horse_farm_isherwood_4", "set": [ { "point": "furniture", "id": "f_anvil", "x": 6, "y": 12 } ] } ] } }, { diff --git a/data/json/npcs/isherwood_farm/NPC_Chris_Isherwood.json b/data/json/npcs/isherwood_farm/NPC_Chris_Isherwood.json index d78f4c0fd01b7..5ac7a4e57e4aa 100644 --- a/data/json/npcs/isherwood_farm/NPC_Chris_Isherwood.json +++ b/data/json/npcs/isherwood_farm/NPC_Chris_Isherwood.json @@ -186,13 +186,7 @@ }, "end": { "opinion": { "trust": 5, "value": 5 }, - "update_mapgen": [ - { - "om_terrain": "cabin_isherwood", - "om_special": "Isherwood Farms", - "place_nested": [ { "chunks": [ "cabin_isherwood_update" ], "x": 3, "y": 1 } ] - } - ] + "update_mapgen": [ { "om_terrain": "cabin_isherwood", "place_nested": [ { "chunks": [ "cabin_isherwood_update" ], "x": 3, "y": 1 } ] } ] } } ] diff --git a/data/json/npcs/isherwood_farm/NPC_Eddie_Isherwood.json b/data/json/npcs/isherwood_farm/NPC_Eddie_Isherwood.json index d2ce435f3e92a..8970247bf6f2d 100644 --- a/data/json/npcs/isherwood_farm/NPC_Eddie_Isherwood.json +++ b/data/json/npcs/isherwood_farm/NPC_Eddie_Isherwood.json @@ -222,7 +222,6 @@ "update_mapgen": [ { "om_terrain": "rural_outbuilding", - "om_special": "Isherwood Farms", "place_nested": [ { "chunks": [ "isherwood_outbuilding_kilns" ], "x": 0, "y": 0 } ], "set": [ { "point": "furniture", "id": "f_kiln_empty", "x": 8, "y": 13 }, diff --git a/data/json/npcs/items_generic.json b/data/json/npcs/items_generic.json index ac7a201b27a6b..c68493e638455 100644 --- a/data/json/npcs/items_generic.json +++ b/data/json/npcs/items_generic.json @@ -26,12 +26,12 @@ { "type": "item_group", "id": "npc_underwear_feet_male", - "items": [ [ "socks", 80 ], [ "socks_wool", 20 ], [ "null", 5 ] ] + "items": [ [ "socks", 80 ], [ "socks_ankle", 60 ], [ "socks_wool", 20 ], [ "null", 5 ] ] }, { "type": "item_group", "id": "npc_underwear_feet_female", - "items": [ [ "socks", 50 ], [ "socks_wool", 10 ], [ "stockings", 20 ], [ "tights", 20 ], [ "null", 5 ] ] + "items": [ [ "socks", 50 ], [ "socks_ankle", 30 ], [ "socks_wool", 10 ], [ "stockings", 20 ], [ "tights", 20 ], [ "null", 5 ] ] }, { "type": "item_group", @@ -1008,6 +1008,7 @@ [ "smrifle_primer", 2 ], [ "soap", 10 ], [ "socks", 10 ], + [ "socks_ankle", 10 ], [ "socks_wool", 10 ], [ "solder_wire", 5 ], [ "soldering_iron", 5 ], diff --git a/data/json/npcs/refugee_center/surface_refugees/NPC_Dana_Nunez.json b/data/json/npcs/refugee_center/surface_refugees/NPC_Dana_Nunez.json index 4d092a1329238..3496c276a12bd 100644 --- a/data/json/npcs/refugee_center/surface_refugees/NPC_Dana_Nunez.json +++ b/data/json/npcs/refugee_center/surface_refugees/NPC_Dana_Nunez.json @@ -328,7 +328,7 @@ "item": "landough_calrisean", "start": { "assign_mission_target": { "om_terrain": "bakery", "reveal_radius": 1, "random": true, "search_range": 120 }, - "update_mapgen": { "om_terrain": "bakery", "om_special": "bakery", "place_item": [ { "item": "landough_calrisean", "x": 5, "y": 16 } ] }, + "update_mapgen": { "om_terrain": "bakery", "place_item": [ { "item": "landough_calrisean", "x": 5, "y": 16 } ] }, "effect": { "u_add_var": "Dana_Sourdough", "type": "mission", "context": "flag", "value": "in_progress" } }, "end": { 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 c9b611f314bed..963339124865e 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 @@ -415,7 +415,6 @@ "assign_mission_target": { "om_terrain": "evac_center_9", "reveal_radius": 1 }, "update_mapgen": { "om_terrain": "evac_center_9", - "om_special": "evac_center", "place_monster": [ { "group": "GROUP_REFUGEE_BOSS_ZOMBIE", "name": "Sean McLaughlin", "x": 10, "y": 10, "target": true } ] } }, @@ -426,7 +425,6 @@ ], "update_mapgen": { "om_terrain": "evac_center_9", - "om_special": "evac_center", "set": [ { "square": "terrain", "id": "t_floor", "x": 0, "y": 23, "x2": 1, "y2": 23 } ] } }, @@ -556,7 +554,6 @@ ], "update_mapgen": { "om_terrain": "evac_center_8", - "om_special": "evac_center", "set": [ { "point": "terrain", "id": "t_gates_mech_control_lab", "x": 17, "y": 1 }, { "point": "terrain", "id": "t_gates_mech_control_lab", "x": 17, "y": 3 } diff --git a/data/json/npcs/refugee_center/surface_visitors/NPC_old_guard_representative.json b/data/json/npcs/refugee_center/surface_visitors/NPC_old_guard_representative.json index 4f6c05a918819..67d19d4b8f4d5 100644 --- a/data/json/npcs/refugee_center/surface_visitors/NPC_old_guard_representative.json +++ b/data/json/npcs/refugee_center/surface_visitors/NPC_old_guard_representative.json @@ -131,14 +131,9 @@ "value": 50000, "start": { "update_mapgen": [ - { - "om_terrain": "evac_center_19", - "om_special": "evac_center", - "place_npcs": [ { "class": "evac_guard3", "x": 12, "y": 12, "target": true } ] - }, + { "om_terrain": "evac_center_19", "place_npcs": [ { "class": "evac_guard3", "x": 12, "y": 12, "target": true } ] }, { "om_terrain": "evac_center_7", - "om_special": "evac_center", "place_npcs": [ { "class": "scavenger_hunter", "x": [ 9, 15 ], "y": [ 9, 15 ] } ] } ] @@ -166,7 +161,7 @@ "difficulty": 5, "value": 100000, "start": { - "assign_mission_target": { "om_terrain": "field", "reveal_radius": 5, "random": true, "search_range": [ 10, 50 ] }, + "assign_mission_target": { "om_terrain": "field", "reveal_radius": 5, "random": true, "search_range": 30 }, "update_mapgen": { "place_monster": [ { "monster": "mon_graboid", "name": "Little Guy", "x": 12, "y": 12, "target": true }, diff --git a/data/json/npcs/robofac/NPC_ROBOFAC_INTERCOM.json b/data/json/npcs/robofac/NPC_ROBOFAC_INTERCOM.json index ea38f5434b0f1..6605d27f48e8e 100644 --- a/data/json/npcs/robofac/NPC_ROBOFAC_INTERCOM.json +++ b/data/json/npcs/robofac/NPC_ROBOFAC_INTERCOM.json @@ -122,12 +122,10 @@ "update_mapgen": [ { "om_terrain": "robofachq_surface_b0", - "om_special": "hub_01", "place_nested": [ { "chunks": [ "robofac_hq_surface_freemerchant_camp" ], "x": 4, "y": 0 } ] }, { "om_terrain": "robofachq_surface_entrance", - "om_special": "hub_01", "place_nested": [ { "chunks": [ "robofac_hq_surface_merc_1" ], "x": 3, "y": 10 } ] } ], diff --git a/data/json/npcs/tacoma_ranch/NPC_ranch_bartender.json b/data/json/npcs/tacoma_ranch/NPC_ranch_bartender.json index afa3ace311ea3..739b67bf3da91 100644 --- a/data/json/npcs/tacoma_ranch/NPC_ranch_bartender.json +++ b/data/json/npcs/tacoma_ranch/NPC_ranch_bartender.json @@ -93,7 +93,6 @@ "end": { "update_mapgen": { "om_terrain": "ranch_camp_51", - "om_special": "ranch_camp", "place_nested": [ { "chunks": [ "tacoma_commune_bar_bartender_1" ], "x": 0, "y": 0 } ] } } @@ -124,7 +123,6 @@ "effect": { "npc_add_trait": "NPC_BRANDY" }, "update_mapgen": { "om_terrain": "ranch_camp_51", - "om_special": "ranch_camp", "place_nested": [ { "chunks": [ "tacoma_commune_bar_bartender_2" ], "x": 0, "y": 0 } ] } } @@ -155,7 +153,6 @@ "effect": { "npc_add_trait": "NPC_RUM" }, "update_mapgen": { "om_terrain": "ranch_camp_51", - "om_special": "ranch_camp", "place_nested": [ { "chunks": [ "tacoma_commune_bar_bartender_3" ], "x": 0, "y": 0 } ] } } @@ -186,7 +183,6 @@ "effect": { "npc_add_trait": "NPC_WHISKEY" }, "update_mapgen": { "om_terrain": "ranch_camp_51", - "om_special": "ranch_camp", "place_nested": [ { "chunks": [ "tacoma_commune_bar_bartender_4" ], "x": 0, "y": 0 } ] } } diff --git a/data/json/npcs/tacoma_ranch/NPC_ranch_foreman.json b/data/json/npcs/tacoma_ranch/NPC_ranch_foreman.json index 8d3f66d705851..0ced7bbef4fd4 100644 --- a/data/json/npcs/tacoma_ranch/NPC_ranch_foreman.json +++ b/data/json/npcs/tacoma_ranch/NPC_ranch_foreman.json @@ -104,13 +104,11 @@ "update_mapgen": [ { "om_terrain": "ranch_camp_65", - "om_special": "ranch_camp", "translate_ter": [ { "from": "t_underbrush", "to": "t_dirt", "x": 0, "y": 0 } ], "place_nested": [ { "chunks": [ "tacoma_commune_west_wall_door" ], "x": 22, "y": 0 } ] }, { "om_terrain": "ranch_camp_66", - "om_special": "ranch_camp", "translate_ter": [ { "from": "t_underbrush", "to": "t_dirt", "x": 0, "y": 0 } ], "place_nested": [ { "chunks": [ "tacoma_commune_east_wall_door" ], "x": 0, "y": 0 }, @@ -120,13 +118,11 @@ }, { "om_terrain": "ranch_camp_74", - "om_special": "ranch_camp", "translate_ter": [ { "from": "t_underbrush", "to": "t_dirt", "x": 0, "y": 0 } ], "place_nested": [ { "chunks": [ "tacoma_commune_west_wall_door" ], "x": 22, "y": 0 } ] }, { "om_terrain": "ranch_camp_66", - "om_special": "ranch_camp", "translate_ter": [ { "from": "t_underbrush", "to": "t_dirt", "x": 0, "y": 0 } ], "place_nested": [ { "chunks": [ "tacoma_commune_east_wall_door" ], "x": 0, "y": 0 }, @@ -163,7 +159,6 @@ "update_mapgen": [ { "om_terrain": "ranch_camp_65", - "om_special": "ranch_camp", "//": "Beds in the barn", "place_nested": [ { "chunks": [ "tacoma_commune_makeshift_bed" ], "x": 19, "y": 1 }, @@ -178,7 +173,6 @@ }, { "om_terrain": "ranch_camp_66", - "om_special": "ranch_camp", "//": "Beds in the barn", "place_nested": [ { "chunks": [ "tacoma_commune_makeshift_bed" ], "x": 19, "y": 1 }, @@ -229,7 +223,6 @@ "update_mapgen": [ { "om_terrain": "ranch_camp_46", - "om_special": "ranch_camp", "//": "tilled soil in the fields", "translate_ter": [ { "from": "t_underbrush", "to": "t_dirt", "x": 0, "y": 0 } ], "set": [ @@ -240,7 +233,6 @@ }, { "om_terrain": "ranch_camp_55", - "om_special": "ranch_camp", "//": "tilled soil in the fields", "translate_ter": [ { "from": "t_underbrush", "to": "t_dirt", "x": 0, "y": 0 } ], "set": [ @@ -251,21 +243,15 @@ }, { "om_terrain": "ranch_camp_56", - "om_special": "ranch_camp", "translate_ter": [ { "from": "t_underbrush", "to": "t_dirt", "x": 0, "y": 0 } ], "place_vehicles": [ { "vehicle": "hippie_van", "x": 10, "y": 10, "rotation": 270, "chance": 100 } ] }, { "om_terrain": "ranch_camp_65", - "om_special": "ranch_camp", "place_furniture": [ { "furn": "f_bookcase", "x": 17, "y": 11 } ], "place_npcs": [ { "class": "ranch_farmer_1", "x": 19, "y": 20 } ] }, - { - "om_terrain": "ranch_camp_66", - "om_special": "ranch_camp", - "place_npcs": [ { "class": "ranch_woodcutter_1", "x": 4, "y": 11 } ] - } + { "om_terrain": "ranch_camp_66", "place_npcs": [ { "class": "ranch_woodcutter_1", "x": 4, "y": 11 } ] } ] } }, @@ -295,7 +281,6 @@ "update_mapgen": [ { "om_terrain": "ranch_camp_46", - "om_special": "ranch_camp", "//": "tilled soil in the fields", "set": [ { "square": "terrain", "id": "t_dirtmound", "x": 14, "y": 5, "x2": 15, "y2": 22 }, @@ -305,7 +290,6 @@ }, { "om_terrain": "ranch_camp_55", - "om_special": "ranch_camp", "//": "tilled soil in the fields", "set": [ { "square": "terrain", "id": "t_dirtmound", "x": 14, "y": 2, "x2": 15, "y2": 17 }, @@ -315,24 +299,20 @@ }, { "om_terrain": "ranch_camp_56", - "om_special": "ranch_camp", "place_vehicles": [ { "vehicle": "flatbed_truck", "x": 18, "y": 3, "rotation": 0, "chance": 100 } ] }, { "om_terrain": "ranch_camp_57", - "om_special": "ranch_camp", "translate_ter": [ { "from": "t_underbrush", "to": "t_dirt", "x": 0, "y": 0 } ], "place_npcs": [ { "class": "ranch_crop_overseer", "x": 12, "y": 7 } ] }, { "om_terrain": "ranch_camp_58", - "om_special": "ranch_camp", "translate_ter": [ { "from": "t_underbrush", "to": "t_dirt", "x": 0, "y": 0 } ], "place_nested": [ { "chunks": [ "tacoma_commune_lumbermill_4" ], "x": 0, "y": 2 } ] }, { "om_terrain": "ranch_camp_67", - "om_special": "ranch_camp", "translate_ter": [ { "from": "t_underbrush", "to": "t_dirt", "x": 0, "y": 0 } ], "set": [ { "square": "terrain", "id": "t_palisade", "x": 21, "y": 19, "x2": 23, "y2": 19 } ] } @@ -365,24 +345,20 @@ "update_mapgen": [ { "om_terrain": "ranch_camp_56", - "om_special": "ranch_camp", "place_vehicles": [ { "vehicle": "car_chassis", "x": 17, "y": 11, "rotation": 90, "chance": 100 } ] }, { "om_terrain": "ranch_camp_58", - "om_special": "ranch_camp", "place_nested": [ { "chunks": [ "tacoma_commune_lumbermill_5" ], "x": 0, "y": 2 } ], "set": [ { "point": "terrain", "id": "t_pit", "x": 6, "y": 18 } ] }, { "om_terrain": "ranch_camp_66", - "om_special": "ranch_camp", "set": [ { "point": "terrain", "id": "t_palisade", "x": 23, "y": 22 } ], "place_npcs": [ { "class": "ranch_farmer_2", "x": 9, "y": 22 } ] }, { "om_terrain": "ranch_camp_67", - "om_special": "ranch_camp", "set": [ { "square": "terrain", "id": "t_palisade", "x": 0, "y": 22, "x2": 5, "y2": 22 } ] } ] @@ -414,13 +390,11 @@ "update_mapgen": [ { "om_terrain": "ranch_camp_58", - "om_special": "ranch_camp", "place_nested": [ { "chunks": [ "tacoma_commune_lumbermill_6" ], "x": 0, "y": 2 } ], "set": [ { "point": "terrain", "id": "t_covered_well", "x": 6, "y": 18 } ] }, { "om_terrain": "ranch_camp_66", - "om_special": "ranch_camp", "set": [ { "point": "furniture", "id": "f_fireplace", "x": 6, "y": 12 }, { "point": "furniture", "id": "f_fireplace", "x": 8, "y": 12 } @@ -463,7 +437,6 @@ "update_mapgen": [ { "om_terrain": "ranch_camp_56", - "om_special": "ranch_camp", "//": "western palisade", "set": [ { "square": "terrain", "id": "t_palisade", "x": 16, "y": 16, "x2": 16, "y2": 23 }, @@ -473,7 +446,6 @@ }, { "om_terrain": "ranch_camp_58", - "om_special": "ranch_camp", "place_nested": [ { "chunks": [ "tacoma_commune_lumbermill_7" ], "x": 0, "y": 2 } ], "//": "finish the well", "set": [ @@ -483,7 +455,6 @@ }, { "om_terrain": "ranch_camp_65", - "om_special": "ranch_camp", "//": "untilled soil in the fields", "set": [ { "square": "terrain", "id": "t_dirt", "x": 0, "y": 4, "x2": 12, "y2": 18 } ] } @@ -516,7 +487,6 @@ "update_mapgen": [ { "om_terrain": "ranch_camp_56", - "om_special": "ranch_camp", "//": "finish western palisade", "set": [ { "square": "terrain", "id": "t_palisade", "x": 23, "y": 7, "x2": 23, "y2": 10 }, @@ -525,12 +495,10 @@ }, { "om_terrain": "ranch_camp_58", - "om_special": "ranch_camp", "place_nested": [ { "chunks": [ "tacoma_commune_lumbermill_8_done" ], "x": 0, "y": 2 } ] }, { "om_terrain": "ranch_camp_59", - "om_special": "ranch_camp", "place_nested": [ { "chunks": [ "tacoma_commune_toolshed_8" ], "x": 13, "y": 17 }, { "chunks": [ "tacoma_commune_clinic_8" ], "x": 0, "y": 2 } @@ -538,7 +506,6 @@ }, { "om_terrain": "ranch_camp_65", - "om_special": "ranch_camp", "//": "tilled soil in the fields", "set": [ { "square": "terrain", "id": "t_dirtmound", "x": 1, "y": 5, "x2": 2, "y2": 17 }, @@ -549,7 +516,6 @@ }, { "om_terrain": "ranch_camp_68", - "om_special": "ranch_camp", "place_nested": [ { "chunks": [ "tacoma_commune_outhouse_8" ], "x": 16, "y": 1 } ] } ] @@ -581,7 +547,6 @@ "update_mapgen": [ { "om_terrain": "ranch_camp_59", - "om_special": "ranch_camp", "place_nested": [ { "chunks": [ "tacoma_commune_toolshed_9_done" ], "x": 13, "y": 17 }, { "chunks": [ "tacoma_commune_clinic_9" ], "x": 0, "y": 2 } @@ -589,7 +554,6 @@ }, { "om_terrain": "ranch_camp_68", - "om_special": "ranch_camp", "place_nested": [ { "chunks": [ "tacoma_commune_outhouse_9_done" ], "x": 16, "y": 1 } ] } ] @@ -619,14 +583,9 @@ }, "end": { "update_mapgen": [ - { - "om_terrain": "ranch_camp_59", - "om_special": "ranch_camp", - "place_nested": [ { "chunks": [ "tacoma_commune_clinic_10" ], "x": 0, "y": 2 } ] - }, + { "om_terrain": "ranch_camp_59", "place_nested": [ { "chunks": [ "tacoma_commune_clinic_10" ], "x": 0, "y": 2 } ] }, { "om_terrain": "ranch_camp_60", - "om_special": "ranch_camp", "place_nested": [ { "chunks": [ "tacoma_commune_chopshop_10" ], "x": 0, "y": 4 } ] } ] @@ -656,19 +615,13 @@ }, "end": { "update_mapgen": [ - { - "om_terrain": "ranch_camp_59", - "om_special": "ranch_camp", - "place_nested": [ { "chunks": [ "tacoma_commune_clinic_11" ], "x": 0, "y": 2 } ] - }, + { "om_terrain": "ranch_camp_59", "place_nested": [ { "chunks": [ "tacoma_commune_clinic_11" ], "x": 0, "y": 2 } ] }, { "om_terrain": "ranch_camp_60", - "om_special": "ranch_camp", "place_nested": [ { "chunks": [ "tacoma_commune_chopshop_11" ], "x": 0, "y": 4 } ] }, { "om_terrain": "ranch_camp_61", - "om_special": "ranch_camp", "place_vehicles": [ { "vehicle": "car", "chance": 100, "rotation": 270, "x": 1, "y": 20 }, { "vehicle": "cube_van_cheap", "chance": 100, "rotation": 90, "x": 10, "y": 10 }, @@ -678,7 +631,6 @@ }, { "om_terrain": "ranch_camp_69", - "om_special": "ranch_camp", "translate_ter": [ { "from": "t_underbrush", "to": "t_dirt", "x": 0, "y": 0 } ], "place_vehicles": [ { "vehicle": "car_chassis", "chance": 100, "rotation": 0, "x": 3, "y": 14 }, @@ -713,19 +665,13 @@ }, "end": { "update_mapgen": [ - { - "om_terrain": "ranch_camp_49", - "om_special": "ranch_camp", - "place_nested": [ { "chunks": [ "tacoma_commune_junk_shop_12" ], "x": 0, "y": 9 } ] - }, + { "om_terrain": "ranch_camp_49", "place_nested": [ { "chunks": [ "tacoma_commune_junk_shop_12" ], "x": 0, "y": 9 } ] }, { "om_terrain": "ranch_camp_60", - "om_special": "ranch_camp", "place_nested": [ { "chunks": [ "tacoma_commune_chopshop_12_done" ], "x": 0, "y": 4 } ] }, { "om_terrain": "ranch_camp_69", - "om_special": "ranch_camp", "translate_ter": [ { "from": "t_underbrush", "to": "t_dirt", "x": 0, "y": 0 } ], "place_vehicles": [ { "vehicle": "cube_van", "chance": 100, "rotation": 180, "x": 13, "y": 15 } ] } @@ -756,19 +702,10 @@ }, "end": { "update_mapgen": [ - { - "om_terrain": "ranch_camp_49", - "om_special": "ranch_camp", - "place_nested": [ { "chunks": [ "tacoma_commune_junk_shop_13" ], "x": 0, "y": 9 } ] - }, - { - "om_terrain": "ranch_camp_66", - "om_special": "ranch_camp", - "place_npcs": [ { "class": "ranch_barber", "x": 5, "y": 3 } ] - }, + { "om_terrain": "ranch_camp_49", "place_nested": [ { "chunks": [ "tacoma_commune_junk_shop_13" ], "x": 0, "y": 9 } ] }, + { "om_terrain": "ranch_camp_66", "place_npcs": [ { "class": "ranch_barber", "x": 5, "y": 3 } ] }, { "om_terrain": "ranch_camp_70", - "om_special": "ranch_camp", "translate_ter": [ { "from": "t_underbrush", "to": "t_dirt", "x": 0, "y": 0 } ], "place_vehicles": [ { "vehicle": "car_mini", "chance": 100, "rotation": 45, "x": 8, "y": 3 } ] } @@ -801,17 +738,14 @@ "update_mapgen": [ { "om_terrain": "ranch_camp_49", - "om_special": "ranch_camp", "place_nested": [ { "chunks": [ "tacoma_commune_junk_shop_14_done" ], "x": 0, "y": 9 } ] }, { "om_terrain": "ranch_camp_51", - "om_special": "ranch_camp", "place_nested": [ { "chunks": [ "tacoma_commune_bar_14" ], "x": 0, "y": 0 } ] }, { "om_terrain": "ranch_camp_61", - "om_special": "ranch_camp", "translate_ter": [ { "from": "t_underbrush", "to": "t_dirt", "x": 0, "y": 0 } ], "place_vehicles": [ { "vehicle": "ambulance", "chance": 100, "rotation": 90, "x": 14, "y": 4 } ] } @@ -841,11 +775,7 @@ "failure": "It was a lost cause anyways..." }, "end": { - "update_mapgen": { - "om_terrain": "ranch_camp_51", - "om_special": "ranch_camp", - "place_nested": [ { "chunks": [ "tacoma_commune_bar_15" ], "x": 0, "y": 0 } ] - } + "update_mapgen": { "om_terrain": "ranch_camp_51", "place_nested": [ { "chunks": [ "tacoma_commune_bar_15" ], "x": 0, "y": 0 } ] } } }, { @@ -872,14 +802,9 @@ }, "end": { "update_mapgen": [ - { - "om_terrain": "ranch_camp_51", - "om_special": "ranch_camp", - "place_nested": [ { "chunks": [ "tacoma_commune_bar_16_done" ], "x": 0, "y": 0 } ] - }, + { "om_terrain": "ranch_camp_51", "place_nested": [ { "chunks": [ "tacoma_commune_bar_16_done" ], "x": 0, "y": 0 } ] }, { "om_terrain": "ranch_camp_52", - "om_special": "ranch_camp", "place_nested": [ { "chunks": [ "tacoma_commune_greenhouse_16" ], "x": 2, "y": 10 } ] } ] @@ -911,7 +836,6 @@ "update_mapgen": [ { "om_terrain": "ranch_camp_52", - "om_special": "ranch_camp", "place_nested": [ { "chunks": [ "tacoma_commune_greenhouse_17_done" ], "x": 2, "y": 10 } ] } ] diff --git a/data/json/npcs/tacoma_ranch/NPC_ranch_nurse.json b/data/json/npcs/tacoma_ranch/NPC_ranch_nurse.json index aae3288d31962..95486c4edb773 100644 --- a/data/json/npcs/tacoma_ranch/NPC_ranch_nurse.json +++ b/data/json/npcs/tacoma_ranch/NPC_ranch_nurse.json @@ -77,13 +77,13 @@ "text": "[$200, 30m] I need you to patch me up.", "topic": "TALK_RANCH_NURSE_AID_DONE", "effect": [ "give_aid", { "u_spend_cash": 20000 } ], - "condition": { "npc_service": 20000 } + "condition": { "npc_service": true } }, { "text": "[$500, 1h] I need you to patch me up.", "topic": "TALK_RANCH_NURSE_AID_DONE", "effect": [ "give_all_aid", { "u_spend_cash": 50000 } ], - "condition": { "npc_service": 50000 } + "condition": { "npc_service": true } }, { "text": "I should be fine.", "topic": "TALK_RANCH_NURSE" } ] diff --git a/data/json/npcs/tacoma_ranch/NPC_ranch_woodcutter1.json b/data/json/npcs/tacoma_ranch/NPC_ranch_woodcutter1.json index c13d1d1e28ad4..32b1003f822ea 100644 --- a/data/json/npcs/tacoma_ranch/NPC_ranch_woodcutter1.json +++ b/data/json/npcs/tacoma_ranch/NPC_ranch_woodcutter1.json @@ -39,13 +39,13 @@ "text": "[$2000, 1d] 10 logs", "topic": "TALK_DONE", "effect": [ "buy_10_logs", { "u_spend_cash": 200000 } ], - "condition": { "npc_service": 200000 } + "condition": { "npc_service": true } }, { "text": "[$12000, 7d] 100 logs", "topic": "TALK_DONE", "effect": [ "buy_100_logs", { "u_spend_cash": 1200000 } ], - "condition": { "npc_service": 1200000 } + "condition": { "npc_service": true } }, { "text": "Maybe later.", "topic": "TALK_RANCH_WOODCUTTER", "condition": "npc_available" }, { "text": "I'll be back later.", "topic": "TALK_RANCH_WOODCUTTER" } diff --git a/data/json/professions.json b/data/json/professions.json index 40a430748fcdd..63b33c143352a 100644 --- a/data/json/professions.json +++ b/data/json/professions.json @@ -586,7 +586,7 @@ "skills": [ { "level": 2, "name": "dodge" }, { "level": 3, "name": "throw" } ], "items": { "both": { - "items": [ "tank_top", "jersey", "b_shorts", "socks", "sneakers", "basketball", "sports_drink" ], + "items": [ "tank_top", "jersey", "b_shorts", "socks_ankle", "sneakers", "basketball", "sports_drink" ], "entries": [ { "group": "charged_cell_phone" } ] }, "male": [ "boxer_shorts" ], @@ -638,7 +638,7 @@ "folding_bicycle", "under_armor_shorts", "under_armor", - "socks", + "socks_ankle", "sneakers", "sports_drink", "wristwatch", @@ -1687,7 +1687,7 @@ "CBMs": [ "bio_str_enhancer", "bio_adrenaline", "bio_hydraulics", "bio_metabolics", "bio_power_storage_mkII" ], "items": { "both": [ - "socks", + "socks_ankle", "under_armor_shorts", "under_armor", "tshirt", @@ -1711,7 +1711,7 @@ "CBMs": [ "bio_adrenaline", "bio_torsionratchet", "bio_power_storage_mkII", "bio_jointservo" ], "items": { "both": [ - "socks", + "socks_ankle", "under_armor_shorts", "under_armor", "tshirt", @@ -2677,7 +2677,7 @@ "description": "You were on your way to the dojo for your first lesson when the world ended. And you really wanted to learn how to swim, too.", "points": -1, "items": { - "both": [ "karate_gi", "judo_belt_white", "mouthpiece", "socks", "sneakers" ], + "both": [ "karate_gi", "judo_belt_white", "mouthpiece", "socks_ankle", "sneakers" ], "male": [ "boxer_shorts" ], "female": [ "sports_bra", "boy_shorts" ] } @@ -2691,7 +2691,7 @@ "traits": [ "PROF_MA_ORANGE" ], "skills": [ { "level": 2, "name": "melee" }, { "level": 2, "name": "unarmed" }, { "level": 2, "name": "dodge" } ], "items": { - "both": [ "karate_gi", "judo_belt_orange", "mouthpiece", "socks", "sneakers" ], + "both": [ "karate_gi", "judo_belt_orange", "mouthpiece", "socks_ankle", "sneakers" ], "male": [ "boxer_shorts" ], "female": [ "sports_bra", "boy_shorts" ] } @@ -3329,7 +3329,7 @@ "skills": [ { "level": 1, "name": "dodge" }, { "level": 1, "name": "throw" } ], "items": { "both": { - "items": [ "tshirt", "jacket_light", "jeans", "socks", "lowtops", "slingpack", "juice" ], + "items": [ "tshirt", "jacket_light", "jeans", "socks_ankle", "lowtops", "slingpack", "juice" ], "entries": [ { "group": "charged_cell_phone" } ] }, "male": [ "briefs" ], @@ -3432,7 +3432,7 @@ "skills": [ { "level": 2, "name": "dodge" }, { "level": 2, "name": "speech" } ], "items": { "both": { - "items": [ "baseball", "bat", "whistle", "tank_top", "shorts", "socks", "sneakers", "runner_bag", "wristwatch" ], + "items": [ "baseball", "bat", "whistle", "tank_top", "shorts", "socks_ankle", "sneakers", "runner_bag", "wristwatch" ], "entries": [ { "group": "charged_cell_phone" } ] }, "male": [ "briefs" ], @@ -3524,7 +3524,7 @@ "skills": [ { "level": 4, "name": "dodge" } ], "items": { "both": { - "items": [ "tshirt", "hoodie", "pants_cargo", "socks", "sneakers", "runner_bag", "wristwatch" ], + "items": [ "tshirt", "hoodie", "pants_cargo", "socks_ankle", "sneakers", "runner_bag", "wristwatch" ], "entries": [ { "group": "charged_cell_phone" } ] }, "male": [ "briefs" ], diff --git a/data/json/recipes/armor/feet.json b/data/json/recipes/armor/feet.json index 1b131cdf0187c..d260dfb4e3cc5 100644 --- a/data/json/recipes/armor/feet.json +++ b/data/json/recipes/armor/feet.json @@ -290,6 +290,18 @@ "qualities": [ { "id": "SAW_W", "level": 1 }, { "id": "CUT", "level": 1 } ], "components": [ [ [ "2x4", 1 ] ], [ [ "cordage_short", 1, "LIST" ] ] ] }, + { + "result": "tabi_dress", + "type": "recipe", + "category": "CC_ARMOR", + "subcategory": "CSC_ARMOR_FEET", + "skill_used": "tailor", + "difficulty": 1, + "time": "20 m", + "book_learn": [ [ "tailor_japanese", 2 ] ], + "using": [ [ "sewing_standard", 6 ] ], + "components": [ [ [ "rag", 3 ] ] ] + }, { "result": "footrags", "type": "recipe", @@ -422,6 +434,17 @@ "qualities": [ { "id": "KNIT", "level": 1 } ], "components": [ [ [ "yarn", 75 ] ] ] }, + { + "result": "socks_ankle", + "type": "recipe", + "category": "CC_ARMOR", + "subcategory": "CSC_ARMOR_FEET", + "skill_used": "tailor", + "time": "10 m", + "autolearn": true, + "using": [ [ "sewing_standard", 4 ] ], + "components": [ [ [ "rag", 2 ] ] ] + }, { "result": "stockings", "type": "recipe", diff --git a/data/json/recipes/recipe_deconstruction.json b/data/json/recipes/recipe_deconstruction.json index 5164e25d36cb3..63aadd8578afd 100644 --- a/data/json/recipes/recipe_deconstruction.json +++ b/data/json/recipes/recipe_deconstruction.json @@ -174,6 +174,104 @@ "qualities": [ { "id": "HAMMER", "level": 1 } ], "components": [ [ [ "silver_small", 3 ] ] ] }, + { + "result": "garnet_silver_ring", + "type": "uncraft", + "time": "60 s", + "qualities": [ { "id": "HAMMER", "level": 1 } ], + "components": [ [ [ "silver_small", 2 ] ], [ [ "garnet", 1 ] ] ] + }, + { + "result": "amethyst_silver_ring", + "type": "uncraft", + "time": "60 s", + "qualities": [ { "id": "HAMMER", "level": 1 } ], + "components": [ [ [ "silver_small", 2 ] ], [ [ "amethyst", 1 ] ] ] + }, + { + "result": "aquamarine_silver_ring", + "type": "uncraft", + "time": "60 s", + "qualities": [ { "id": "HAMMER", "level": 1 } ], + "components": [ [ [ "silver_small", 2 ] ], [ [ "aquamarine", 1 ] ] ] + }, + { + "result": "emerald_silver_ring", + "type": "uncraft", + "time": "60 s", + "qualities": [ { "id": "HAMMER", "level": 1 } ], + "components": [ [ [ "silver_small", 2 ] ], [ [ "emerald", 1 ] ] ] + }, + { + "result": "alexandrite_silver_ring", + "type": "uncraft", + "time": "60 s", + "qualities": [ { "id": "HAMMER", "level": 1 } ], + "components": [ [ [ "silver_small", 2 ] ], [ [ "alexandrite", 1 ] ] ] + }, + { + "result": "ruby_silver_ring", + "type": "uncraft", + "time": "60 s", + "qualities": [ { "id": "HAMMER", "level": 1 } ], + "components": [ [ [ "silver_small", 2 ] ], [ [ "ruby", 1 ] ] ] + }, + { + "result": "peridot_silver_ring", + "type": "uncraft", + "time": "60 s", + "qualities": [ { "id": "HAMMER", "level": 1 } ], + "components": [ [ [ "silver_small", 2 ] ], [ [ "peridot", 1 ] ] ] + }, + { + "result": "sapphire_silver_ring", + "type": "uncraft", + "time": "60 s", + "qualities": [ { "id": "HAMMER", "level": 1 } ], + "components": [ [ [ "silver_small", 2 ] ], [ [ "sapphire", 1 ] ] ] + }, + { + "result": "tourmaline_silver_ring", + "type": "uncraft", + "time": "60 s", + "qualities": [ { "id": "HAMMER", "level": 1 } ], + "components": [ [ [ "silver_small", 2 ] ], [ [ "tourmaline", 1 ] ] ] + }, + { + "result": "citrine_silver_ring", + "type": "uncraft", + "time": "60 s", + "qualities": [ { "id": "HAMMER", "level": 1 } ], + "components": [ [ [ "silver_small", 2 ] ], [ [ "citrine", 1 ] ] ] + }, + { + "result": "blue_topaz_silver_ring", + "type": "uncraft", + "time": "60 s", + "qualities": [ { "id": "HAMMER", "level": 1 } ], + "components": [ [ [ "silver_small", 2 ] ], [ [ "blue_topaz", 1 ] ] ] + }, + { + "result": "opal_silver_ring", + "type": "uncraft", + "time": "60 s", + "qualities": [ { "id": "HAMMER", "level": 1 } ], + "components": [ [ [ "silver_small", 2 ] ], [ [ "opal", 1 ] ] ] + }, + { + "result": "pearl_silver_ring", + "type": "uncraft", + "time": "60 s", + "qualities": [ { "id": "HAMMER", "level": 1 } ], + "components": [ [ [ "silver_small", 2 ] ], [ [ "pearl", 1 ] ] ] + }, + { + "result": "diamond_silver_ring", + "type": "uncraft", + "time": "60 s", + "qualities": [ { "id": "HAMMER", "level": 1 } ], + "components": [ [ [ "silver_small", 2 ] ], [ [ "diamond", 1 ] ] ] + }, { "result": "leather_collar", "type": "uncraft", @@ -1553,6 +1651,83 @@ "qualities": [ { "id": "HAMMER", "level": 1 } ], "components": [ [ [ "gold_small", 2 ] ], [ [ "diamond", 1 ] ] ] }, + { + "result": "garnet_dental_grill", + "type": "uncraft", + "time": "60 s", + "qualities": [ { "id": "HAMMER", "level": 1 } ], + "components": [ [ [ "gold_small", 4 ] ], [ [ "garnet", 1 ] ] ] + }, + { + "result": "amethyst_dental_grill", + "type": "uncraft", + "time": "60 s", + "qualities": [ { "id": "HAMMER", "level": 1 } ], + "components": [ [ [ "gold_small", 4 ] ], [ [ "amethyst", 1 ] ] ] + }, + { + "result": "aquamarine_dental_grill", + "type": "uncraft", + "time": "60 s", + "qualities": [ { "id": "HAMMER", "level": 1 } ], + "components": [ [ [ "gold_small", 4 ] ], [ [ "aquamarine", 1 ] ] ] + }, + { + "result": "emerald_dental_grill", + "type": "uncraft", + "time": "60 s", + "qualities": [ { "id": "HAMMER", "level": 1 } ], + "components": [ [ [ "gold_small", 4 ] ], [ [ "emerald", 1 ] ] ] + }, + { + "result": "alexandrite_dental_grill", + "type": "uncraft", + "time": "60 s", + "qualities": [ { "id": "HAMMER", "level": 1 } ], + "components": [ [ [ "gold_small", 4 ] ], [ [ "alexandrite", 1 ] ] ] + }, + { + "result": "ruby_dental_grill", + "type": "uncraft", + "time": "60 s", + "qualities": [ { "id": "HAMMER", "level": 1 } ], + "components": [ [ [ "gold_small", 4 ] ], [ [ "ruby", 1 ] ] ] + }, + { + "result": "peridot_dental_grill", + "type": "uncraft", + "time": "60 s", + "qualities": [ { "id": "HAMMER", "level": 1 } ], + "components": [ [ [ "gold_small", 4 ] ], [ [ "peridot", 1 ] ] ] + }, + { + "result": "sapphire_dental_grill", + "type": "uncraft", + "time": "60 s", + "qualities": [ { "id": "HAMMER", "level": 1 } ], + "components": [ [ [ "gold_small", 4 ] ], [ [ "sapphire", 1 ] ] ] + }, + { + "result": "tourmaline_dental_grill", + "type": "uncraft", + "time": "60 s", + "qualities": [ { "id": "HAMMER", "level": 1 } ], + "components": [ [ [ "gold_small", 4 ] ], [ [ "tourmaline", 1 ] ] ] + }, + { + "result": "citrine_dental_grill", + "type": "uncraft", + "time": "60 s", + "qualities": [ { "id": "HAMMER", "level": 1 } ], + "components": [ [ [ "gold_small", 4 ] ], [ [ "citrine", 1 ] ] ] + }, + { + "result": "blue_topaz_dental_grill", + "type": "uncraft", + "time": "60 s", + "qualities": [ { "id": "HAMMER", "level": 1 } ], + "components": [ [ [ "gold_small", 4 ] ], [ [ "blue_topaz", 1 ] ] ] + }, { "result": "diamond_ring", "type": "uncraft", @@ -1698,6 +1873,104 @@ "qualities": [ { "id": "HAMMER", "level": 1 } ], "components": [ [ [ "gold_small", 8 ] ] ] }, + { + "result": "garnet_gold_bracelet", + "type": "uncraft", + "time": "60 s", + "qualities": [ { "id": "HAMMER", "level": 1 } ], + "components": [ [ [ "gold_small", 8 ] ], [ [ "garnet", 4 ] ] ] + }, + { + "result": "amethyst_gold_bracelet", + "type": "uncraft", + "time": "60 s", + "qualities": [ { "id": "HAMMER", "level": 1 } ], + "components": [ [ [ "gold_small", 8 ] ], [ [ "amethyst", 4 ] ] ] + }, + { + "result": "aquamarine_gold_bracelet", + "type": "uncraft", + "time": "60 s", + "qualities": [ { "id": "HAMMER", "level": 1 } ], + "components": [ [ [ "gold_small", 8 ] ], [ [ "aquamarine", 4 ] ] ] + }, + { + "result": "emerald_gold_bracelet", + "type": "uncraft", + "time": "60 s", + "qualities": [ { "id": "HAMMER", "level": 1 } ], + "components": [ [ [ "gold_small", 8 ] ], [ [ "emerald", 4 ] ] ] + }, + { + "result": "alexandrite_gold_bracelet", + "type": "uncraft", + "time": "60 s", + "qualities": [ { "id": "HAMMER", "level": 1 } ], + "components": [ [ [ "gold_small", 8 ] ], [ [ "alexandrite", 4 ] ] ] + }, + { + "result": "ruby_gold_bracelet", + "type": "uncraft", + "time": "60 s", + "qualities": [ { "id": "HAMMER", "level": 1 } ], + "components": [ [ [ "gold_small", 8 ] ], [ [ "ruby", 4 ] ] ] + }, + { + "result": "peridot_gold_bracelet", + "type": "uncraft", + "time": "60 s", + "qualities": [ { "id": "HAMMER", "level": 1 } ], + "components": [ [ [ "gold_small", 8 ] ], [ [ "peridot", 4 ] ] ] + }, + { + "result": "sapphire_gold_bracelet", + "type": "uncraft", + "time": "60 s", + "qualities": [ { "id": "HAMMER", "level": 1 } ], + "components": [ [ [ "gold_small", 8 ] ], [ [ "sapphire", 4 ] ] ] + }, + { + "result": "tourmaline_gold_bracelet", + "type": "uncraft", + "time": "60 s", + "qualities": [ { "id": "HAMMER", "level": 1 } ], + "components": [ [ [ "gold_small", 8 ] ], [ [ "tourmaline", 4 ] ] ] + }, + { + "result": "citrine_gold_bracelet", + "type": "uncraft", + "time": "60 s", + "qualities": [ { "id": "HAMMER", "level": 1 } ], + "components": [ [ [ "gold_small", 8 ] ], [ [ "citrine", 4 ] ] ] + }, + { + "result": "blue_topaz_gold_bracelet", + "type": "uncraft", + "time": "60 s", + "qualities": [ { "id": "HAMMER", "level": 1 } ], + "components": [ [ [ "gold_small", 8 ] ], [ [ "blue_topaz", 4 ] ] ] + }, + { + "result": "opal_gold_bracelet", + "type": "uncraft", + "time": "60 s", + "qualities": [ { "id": "HAMMER", "level": 1 } ], + "components": [ [ [ "gold_small", 8 ] ], [ [ "opal", 4 ] ] ] + }, + { + "result": "pearl_gold_bracelet", + "type": "uncraft", + "time": "60 s", + "qualities": [ { "id": "HAMMER", "level": 1 } ], + "components": [ [ [ "gold_small", 8 ] ], [ [ "pearl", 4 ] ] ] + }, + { + "result": "diamond_gold_bracelet", + "type": "uncraft", + "time": "60 s", + "qualities": [ { "id": "HAMMER", "level": 1 } ], + "components": [ [ [ "gold_small", 8 ] ], [ [ "diamond", 4 ] ] ] + }, { "result": "gold_dental_grill", "type": "uncraft", @@ -1712,6 +1985,104 @@ "qualities": [ { "id": "HAMMER", "level": 1 } ], "components": [ [ [ "gold_small", 2 ] ] ] }, + { + "result": "garnet_gold_earring", + "type": "uncraft", + "time": "60 s", + "qualities": [ { "id": "HAMMER", "level": 1 } ], + "components": [ [ [ "gold_small", 4 ] ], [ [ "garnet", 2 ] ] ] + }, + { + "result": "amethyst_gold_earring", + "type": "uncraft", + "time": "60 s", + "qualities": [ { "id": "HAMMER", "level": 1 } ], + "components": [ [ [ "gold_small", 4 ] ], [ [ "amethyst", 2 ] ] ] + }, + { + "result": "aquamarine_gold_earring", + "type": "uncraft", + "time": "60 s", + "qualities": [ { "id": "HAMMER", "level": 1 } ], + "components": [ [ [ "gold_small", 4 ] ], [ [ "aquamarine", 2 ] ] ] + }, + { + "result": "emerald_gold_earring", + "type": "uncraft", + "time": "60 s", + "qualities": [ { "id": "HAMMER", "level": 1 } ], + "components": [ [ [ "gold_small", 4 ] ], [ [ "emerald", 2 ] ] ] + }, + { + "result": "alexandrite_gold_earring", + "type": "uncraft", + "time": "60 s", + "qualities": [ { "id": "HAMMER", "level": 1 } ], + "components": [ [ [ "gold_small", 4 ] ], [ [ "alexandrite", 2 ] ] ] + }, + { + "result": "ruby_gold_earring", + "type": "uncraft", + "time": "60 s", + "qualities": [ { "id": "HAMMER", "level": 1 } ], + "components": [ [ [ "gold_small", 4 ] ], [ [ "ruby", 2 ] ] ] + }, + { + "result": "peridot_gold_earring", + "type": "uncraft", + "time": "60 s", + "qualities": [ { "id": "HAMMER", "level": 1 } ], + "components": [ [ [ "gold_small", 4 ] ], [ [ "peridot", 2 ] ] ] + }, + { + "result": "sapphire_gold_earring", + "type": "uncraft", + "time": "60 s", + "qualities": [ { "id": "HAMMER", "level": 1 } ], + "components": [ [ [ "gold_small", 4 ] ], [ [ "sapphire", 2 ] ] ] + }, + { + "result": "tourmaline_gold_earring", + "type": "uncraft", + "time": "60 s", + "qualities": [ { "id": "HAMMER", "level": 1 } ], + "components": [ [ [ "gold_small", 4 ] ], [ [ "tourmaline", 2 ] ] ] + }, + { + "result": "citrine_gold_earring", + "type": "uncraft", + "time": "60 s", + "qualities": [ { "id": "HAMMER", "level": 1 } ], + "components": [ [ [ "gold_small", 4 ] ], [ [ "citrine", 2 ] ] ] + }, + { + "result": "blue_topaz_gold_earring", + "type": "uncraft", + "time": "60 s", + "qualities": [ { "id": "HAMMER", "level": 1 } ], + "components": [ [ [ "gold_small", 4 ] ], [ [ "blue_topaz", 2 ] ] ] + }, + { + "result": "opal_gold_earring", + "type": "uncraft", + "time": "60 s", + "qualities": [ { "id": "HAMMER", "level": 1 } ], + "components": [ [ [ "gold_small", 4 ] ], [ [ "opal", 2 ] ] ] + }, + { + "result": "pearl_gold_earring", + "type": "uncraft", + "time": "60 s", + "qualities": [ { "id": "HAMMER", "level": 1 } ], + "components": [ [ [ "gold_small", 4 ] ], [ [ "pearl", 2 ] ] ] + }, + { + "result": "diamond_gold_earring", + "type": "uncraft", + "time": "60 s", + "qualities": [ { "id": "HAMMER", "level": 1 } ], + "components": [ [ [ "gold_small", 4 ] ], [ [ "diamond", 2 ] ] ] + }, { "result": "gold_watch", "type": "uncraft", @@ -2216,71 +2587,365 @@ "components": [ [ [ "gold_small", 2 ] ] ] }, { - "result": "roadmap", + "result": "gold_ring", "type": "uncraft", "time": "30 s", - "components": [ [ [ "paper", 10 ] ] ], - "flags": [ "BLIND_EASY" ] + "qualities": [ { "id": "HAMMER", "level": 1 } ], + "components": [ [ [ "gold_small", 2 ] ] ] }, { - "result": "vehicle_controls", + "result": "garnet_gold_ring", "type": "uncraft", - "skill_used": "mechanics", - "difficulty": 3, - "time": "10 m", - "decomp_learn": 3, - "qualities": [ { "id": "HAMMER", "level": 2 }, { "id": "SAW_M", "level": 1 }, { "id": "WRENCH", "level": 1 } ], - "components": [ [ [ "pipe", 4 ] ], [ [ "scrap", 12 ] ], [ [ "wire", 2 ] ], [ [ "cable", 8 ] ] ] + "time": "60 s", + "qualities": [ { "id": "HAMMER", "level": 1 } ], + "components": [ [ [ "gold_small", 2 ] ], [ [ "garnet", 1 ] ] ] }, { - "result": "robot_controls", + "result": "amethyst_gold_ring", "type": "uncraft", - "skill_used": "electronics", - "difficulty": 8, - "time": "1 h", - "using": [ [ "soldering_standard", 20 ] ], - "qualities": [ { "id": "SCREW", "level": 1 }, { "id": "WRENCH", "level": 1 }, { "id": "SAW_M", "level": 1 } ], - "components": [ [ [ "motor_tiny", 3 ] ], [ [ "processor", 3 ] ], [ [ "RAM", 2 ] ], [ [ "plastic_chunk", 2 ] ] ] + "time": "60 s", + "qualities": [ { "id": "HAMMER", "level": 1 } ], + "components": [ [ [ "gold_small", 2 ] ], [ [ "amethyst", 1 ] ] ] }, { - "result": "scythe", + "result": "aquamarine_gold_ring", "type": "uncraft", - "time": "10 m", + "time": "60 s", "qualities": [ { "id": "HAMMER", "level": 1 } ], - "components": [ [ [ "blade_scythe", 1 ] ], [ [ "stick_long", 1 ] ] ] + "components": [ [ [ "gold_small", 2 ] ], [ [ "aquamarine", 1 ] ] ] }, { - "result": "sf_watch", + "result": "emerald_gold_ring", "type": "uncraft", - "time": "36 s", - "qualities": [ { "id": "HAMMER", "level": 1 }, { "id": "SCREW", "level": 1 } ], - "components": [ [ [ "gold_small", 5 ] ], [ [ "silver_small", 12 ] ], [ [ "clockworks", 1 ] ] ] + "time": "60 s", + "qualities": [ { "id": "HAMMER", "level": 1 } ], + "components": [ [ [ "gold_small", 2 ] ], [ [ "emerald", 1 ] ] ] }, { - "result": "silver_bracelet", + "result": "alexandrite_gold_ring", "type": "uncraft", - "time": "36 s", + "time": "60 s", "qualities": [ { "id": "HAMMER", "level": 1 } ], - "components": [ [ [ "silver_small", 10 ] ] ] + "components": [ [ [ "gold_small", 2 ] ], [ [ "alexandrite", 1 ] ] ] }, { - "result": "silver_ear", + "result": "ruby_gold_ring", "type": "uncraft", - "time": "30 s", + "time": "60 s", "qualities": [ { "id": "HAMMER", "level": 1 } ], - "components": [ [ [ "silver_small", 3 ] ] ] + "components": [ [ [ "gold_small", 2 ] ], [ [ "ruby", 1 ] ] ] }, { - "result": "sm_extinguisher", + "result": "peridot_gold_ring", "type": "uncraft", - "skill_used": "fabrication", - "difficulty": 1, - "time": "30 s", - "qualities": [ { "id": "WRENCH", "level": 1 } ], - "components": [ [ [ "scrap", 1 ] ], [ [ "plastic_chunk", 1 ] ], [ [ "metal_tank_little", 1 ] ] ] + "time": "60 s", + "qualities": [ { "id": "HAMMER", "level": 1 } ], + "components": [ [ [ "gold_small", 2 ] ], [ [ "peridot", 1 ] ] ] }, { - "result": "small_relic", + "result": "sapphire_gold_ring", + "type": "uncraft", + "time": "60 s", + "qualities": [ { "id": "HAMMER", "level": 1 } ], + "components": [ [ [ "gold_small", 2 ] ], [ [ "sapphire", 1 ] ] ] + }, + { + "result": "tourmaline_gold_ring", + "type": "uncraft", + "time": "60 s", + "qualities": [ { "id": "HAMMER", "level": 1 } ], + "components": [ [ [ "gold_small", 2 ] ], [ [ "tourmaline", 1 ] ] ] + }, + { + "result": "citrine_gold_ring", + "type": "uncraft", + "time": "60 s", + "qualities": [ { "id": "HAMMER", "level": 1 } ], + "components": [ [ [ "gold_small", 2 ] ], [ [ "citrine", 1 ] ] ] + }, + { + "result": "blue_topaz_gold_ring", + "type": "uncraft", + "time": "60 s", + "qualities": [ { "id": "HAMMER", "level": 1 } ], + "components": [ [ [ "gold_small", 2 ] ], [ [ "blue_topaz", 1 ] ] ] + }, + { + "result": "opal_gold_ring", + "type": "uncraft", + "time": "60 s", + "qualities": [ { "id": "HAMMER", "level": 1 } ], + "components": [ [ [ "gold_small", 2 ] ], [ [ "opal", 1 ] ] ] + }, + { + "result": "pearl_gold_ring", + "type": "uncraft", + "time": "60 s", + "qualities": [ { "id": "HAMMER", "level": 1 } ], + "components": [ [ [ "gold_small", 2 ] ], [ [ "pearl", 1 ] ] ] + }, + { + "result": "roadmap", + "type": "uncraft", + "time": "30 s", + "components": [ [ [ "paper", 10 ] ] ], + "flags": [ "BLIND_EASY" ] + }, + { + "result": "vehicle_controls", + "type": "uncraft", + "skill_used": "mechanics", + "difficulty": 3, + "time": "10 m", + "decomp_learn": 3, + "qualities": [ { "id": "HAMMER", "level": 2 }, { "id": "SAW_M", "level": 1 }, { "id": "WRENCH", "level": 1 } ], + "components": [ [ [ "pipe", 4 ] ], [ [ "scrap", 12 ] ], [ [ "wire", 2 ] ], [ [ "cable", 8 ] ] ] + }, + { + "result": "robot_controls", + "type": "uncraft", + "skill_used": "electronics", + "difficulty": 8, + "time": "1 h", + "using": [ [ "soldering_standard", 20 ] ], + "qualities": [ { "id": "SCREW", "level": 1 }, { "id": "WRENCH", "level": 1 }, { "id": "SAW_M", "level": 1 } ], + "components": [ [ [ "motor_tiny", 3 ] ], [ [ "processor", 3 ] ], [ [ "RAM", 2 ] ], [ [ "plastic_chunk", 2 ] ] ] + }, + { + "result": "scythe", + "type": "uncraft", + "time": "10 m", + "qualities": [ { "id": "HAMMER", "level": 1 } ], + "components": [ [ [ "blade_scythe", 1 ] ], [ [ "stick_long", 1 ] ] ] + }, + { + "result": "sf_watch", + "type": "uncraft", + "time": "36 s", + "qualities": [ { "id": "HAMMER", "level": 1 }, { "id": "SCREW", "level": 1 } ], + "components": [ [ [ "gold_small", 5 ] ], [ [ "silver_small", 12 ] ], [ [ "clockworks", 1 ] ] ] + }, + { + "result": "silver_bracelet", + "type": "uncraft", + "time": "36 s", + "qualities": [ { "id": "HAMMER", "level": 1 } ], + "components": [ [ [ "silver_small", 10 ] ] ] + }, + { + "result": "garnet_silver_bracelet", + "type": "uncraft", + "time": "60 s", + "qualities": [ { "id": "HAMMER", "level": 1 } ], + "components": [ [ [ "silver_small", 8 ] ], [ [ "garnet", 4 ] ] ] + }, + { + "result": "amethyst_silver_bracelet", + "type": "uncraft", + "time": "60 s", + "qualities": [ { "id": "HAMMER", "level": 1 } ], + "components": [ [ [ "silver_small", 8 ] ], [ [ "amethyst", 4 ] ] ] + }, + { + "result": "aquamarine_silver_bracelet", + "type": "uncraft", + "time": "60 s", + "qualities": [ { "id": "HAMMER", "level": 1 } ], + "components": [ [ [ "silver_small", 8 ] ], [ [ "aquamarine", 4 ] ] ] + }, + { + "result": "emerald_silver_bracelet", + "type": "uncraft", + "time": "60 s", + "qualities": [ { "id": "HAMMER", "level": 1 } ], + "components": [ [ [ "silver_small", 8 ] ], [ [ "emerald", 4 ] ] ] + }, + { + "result": "alexandrite_silver_bracelet", + "type": "uncraft", + "time": "60 s", + "qualities": [ { "id": "HAMMER", "level": 1 } ], + "components": [ [ [ "silver_small", 8 ] ], [ [ "alexandrite", 4 ] ] ] + }, + { + "result": "ruby_silver_bracelet", + "type": "uncraft", + "time": "60 s", + "qualities": [ { "id": "HAMMER", "level": 1 } ], + "components": [ [ [ "silver_small", 8 ] ], [ [ "ruby", 4 ] ] ] + }, + { + "result": "peridot_silver_bracelet", + "type": "uncraft", + "time": "60 s", + "qualities": [ { "id": "HAMMER", "level": 1 } ], + "components": [ [ [ "silver_small", 8 ] ], [ [ "peridot", 4 ] ] ] + }, + { + "result": "sapphire_silver_bracelet", + "type": "uncraft", + "time": "60 s", + "qualities": [ { "id": "HAMMER", "level": 1 } ], + "components": [ [ [ "silver_small", 8 ] ], [ [ "sapphire", 4 ] ] ] + }, + { + "result": "tourmaline_silver_bracelet", + "type": "uncraft", + "time": "60 s", + "qualities": [ { "id": "HAMMER", "level": 1 } ], + "components": [ [ [ "silver_small", 8 ] ], [ [ "tourmaline", 4 ] ] ] + }, + { + "result": "citrine_silver_bracelet", + "type": "uncraft", + "time": "60 s", + "qualities": [ { "id": "HAMMER", "level": 1 } ], + "components": [ [ [ "silver_small", 8 ] ], [ [ "citrine", 4 ] ] ] + }, + { + "result": "blue_topaz_silver_bracelet", + "type": "uncraft", + "time": "60 s", + "qualities": [ { "id": "HAMMER", "level": 1 } ], + "components": [ [ [ "silver_small", 8 ] ], [ [ "blue_topaz", 4 ] ] ] + }, + { + "result": "opal_silver_bracelet", + "type": "uncraft", + "time": "60 s", + "qualities": [ { "id": "HAMMER", "level": 1 } ], + "components": [ [ [ "silver_small", 8 ] ], [ [ "opal", 4 ] ] ] + }, + { + "result": "pearl_silver_bracelet", + "type": "uncraft", + "time": "60 s", + "qualities": [ { "id": "HAMMER", "level": 1 } ], + "components": [ [ [ "silver_small", 8 ] ], [ [ "pearl", 4 ] ] ] + }, + { + "result": "diamond_silver_bracelet", + "type": "uncraft", + "time": "60 s", + "qualities": [ { "id": "HAMMER", "level": 1 } ], + "components": [ [ [ "silver_small", 8 ] ], [ [ "diamond", 4 ] ] ] + }, + { + "result": "silver_ear", + "type": "uncraft", + "time": "30 s", + "qualities": [ { "id": "HAMMER", "level": 1 } ], + "components": [ [ [ "silver_small", 3 ] ] ] + }, + { + "result": "garnet_silver_earring", + "type": "uncraft", + "time": "60 s", + "qualities": [ { "id": "HAMMER", "level": 1 } ], + "components": [ [ [ "silver_small", 4 ] ], [ [ "garnet", 2 ] ] ] + }, + { + "result": "amethyst_silver_earring", + "type": "uncraft", + "time": "60 s", + "qualities": [ { "id": "HAMMER", "level": 1 } ], + "components": [ [ [ "silver_small", 4 ] ], [ [ "amethyst", 2 ] ] ] + }, + { + "result": "aquamarine_silver_earring", + "type": "uncraft", + "time": "60 s", + "qualities": [ { "id": "HAMMER", "level": 1 } ], + "components": [ [ [ "silver_small", 4 ] ], [ [ "aquamarine", 2 ] ] ] + }, + { + "result": "emerald_silver_earring", + "type": "uncraft", + "time": "60 s", + "qualities": [ { "id": "HAMMER", "level": 1 } ], + "components": [ [ [ "silver_small", 4 ] ], [ [ "emerald", 2 ] ] ] + }, + { + "result": "alexandrite_silver_earring", + "type": "uncraft", + "time": "60 s", + "qualities": [ { "id": "HAMMER", "level": 1 } ], + "components": [ [ [ "silver_small", 4 ] ], [ [ "alexandrite", 2 ] ] ] + }, + { + "result": "ruby_silver_earring", + "type": "uncraft", + "time": "60 s", + "qualities": [ { "id": "HAMMER", "level": 1 } ], + "components": [ [ [ "silver_small", 4 ] ], [ [ "ruby", 2 ] ] ] + }, + { + "result": "peridot_silver_earring", + "type": "uncraft", + "time": "60 s", + "qualities": [ { "id": "HAMMER", "level": 1 } ], + "components": [ [ [ "silver_small", 4 ] ], [ [ "peridot", 2 ] ] ] + }, + { + "result": "sapphire_silver_earring", + "type": "uncraft", + "time": "60 s", + "qualities": [ { "id": "HAMMER", "level": 1 } ], + "components": [ [ [ "silver_small", 4 ] ], [ [ "sapphire", 2 ] ] ] + }, + { + "result": "tourmaline_silver_earring", + "type": "uncraft", + "time": "60 s", + "qualities": [ { "id": "HAMMER", "level": 1 } ], + "components": [ [ [ "silver_small", 4 ] ], [ [ "tourmaline", 2 ] ] ] + }, + { + "result": "citrine_silver_earring", + "type": "uncraft", + "time": "60 s", + "qualities": [ { "id": "HAMMER", "level": 1 } ], + "components": [ [ [ "silver_small", 4 ] ], [ [ "citrine", 2 ] ] ] + }, + { + "result": "blue_topaz_silver_earring", + "type": "uncraft", + "time": "60 s", + "qualities": [ { "id": "HAMMER", "level": 1 } ], + "components": [ [ [ "silver_small", 4 ] ], [ [ "blue_topaz", 2 ] ] ] + }, + { + "result": "opal_silver_earring", + "type": "uncraft", + "time": "60 s", + "qualities": [ { "id": "HAMMER", "level": 1 } ], + "components": [ [ [ "silver_small", 4 ] ], [ [ "opal", 2 ] ] ] + }, + { + "result": "pearl_silver_earring", + "type": "uncraft", + "time": "60 s", + "qualities": [ { "id": "HAMMER", "level": 1 } ], + "components": [ [ [ "silver_small", 4 ] ], [ [ "pearl", 2 ] ] ] + }, + { + "result": "diamond_silver_earring", + "type": "uncraft", + "time": "60 s", + "qualities": [ { "id": "HAMMER", "level": 1 } ], + "components": [ [ [ "silver_small", 4 ] ], [ [ "diamond", 2 ] ] ] + }, + { + "result": "sm_extinguisher", + "type": "uncraft", + "skill_used": "fabrication", + "difficulty": 1, + "time": "30 s", + "qualities": [ { "id": "WRENCH", "level": 1 } ], + "components": [ [ [ "scrap", 1 ] ], [ [ "plastic_chunk", 1 ] ], [ [ "metal_tank_little", 1 ] ] ] + }, + { + "result": "small_relic", "type": "uncraft", "time": "30 s", "qualities": [ { "id": "HAMMER", "level": 1 } ], @@ -3095,6 +3760,104 @@ "qualities": [ { "id": "HAMMER", "level": 1 } ], "components": [ [ [ "platinum_small", 8 ] ] ] }, + { + "result": "garnet_platinum_bracelet", + "type": "uncraft", + "time": "60 s", + "qualities": [ { "id": "HAMMER", "level": 1 } ], + "components": [ [ [ "platinum_small", 8 ] ], [ [ "garnet", 4 ] ] ] + }, + { + "result": "amethyst_platinum_bracelet", + "type": "uncraft", + "time": "60 s", + "qualities": [ { "id": "HAMMER", "level": 1 } ], + "components": [ [ [ "platinum_small", 8 ] ], [ [ "amethyst", 4 ] ] ] + }, + { + "result": "aquamarine_platinum_bracelet", + "type": "uncraft", + "time": "60 s", + "qualities": [ { "id": "HAMMER", "level": 1 } ], + "components": [ [ [ "platinum_small", 8 ] ], [ [ "aquamarine", 4 ] ] ] + }, + { + "result": "emerald_platinum_bracelet", + "type": "uncraft", + "time": "60 s", + "qualities": [ { "id": "HAMMER", "level": 1 } ], + "components": [ [ [ "platinum_small", 8 ] ], [ [ "emerald", 4 ] ] ] + }, + { + "result": "alexandrite_platinum_bracelet", + "type": "uncraft", + "time": "60 s", + "qualities": [ { "id": "HAMMER", "level": 1 } ], + "components": [ [ [ "platinum_small", 8 ] ], [ [ "alexandrite", 4 ] ] ] + }, + { + "result": "ruby_platinum_bracelet", + "type": "uncraft", + "time": "60 s", + "qualities": [ { "id": "HAMMER", "level": 1 } ], + "components": [ [ [ "platinum_small", 8 ] ], [ [ "ruby", 4 ] ] ] + }, + { + "result": "peridot_platinum_bracelet", + "type": "uncraft", + "time": "60 s", + "qualities": [ { "id": "HAMMER", "level": 1 } ], + "components": [ [ [ "platinum_small", 8 ] ], [ [ "peridot", 4 ] ] ] + }, + { + "result": "sapphire_platinum_bracelet", + "type": "uncraft", + "time": "60 s", + "qualities": [ { "id": "HAMMER", "level": 1 } ], + "components": [ [ [ "platinum_small", 8 ] ], [ [ "sapphire", 4 ] ] ] + }, + { + "result": "tourmaline_platinum_bracelet", + "type": "uncraft", + "time": "60 s", + "qualities": [ { "id": "HAMMER", "level": 1 } ], + "components": [ [ [ "platinum_small", 8 ] ], [ [ "tourmaline", 4 ] ] ] + }, + { + "result": "citrine_platinum_bracelet", + "type": "uncraft", + "time": "60 s", + "qualities": [ { "id": "HAMMER", "level": 1 } ], + "components": [ [ [ "platinum_small", 8 ] ], [ [ "citrine", 4 ] ] ] + }, + { + "result": "blue_topaz_platinum_bracelet", + "type": "uncraft", + "time": "60 s", + "qualities": [ { "id": "HAMMER", "level": 1 } ], + "components": [ [ [ "platinum_small", 8 ] ], [ [ "blue_topaz", 4 ] ] ] + }, + { + "result": "opal_platinum_bracelet", + "type": "uncraft", + "time": "60 s", + "qualities": [ { "id": "HAMMER", "level": 1 } ], + "components": [ [ [ "platinum_small", 8 ] ], [ [ "opal", 4 ] ] ] + }, + { + "result": "pearl_platinum_bracelet", + "type": "uncraft", + "time": "60 s", + "qualities": [ { "id": "HAMMER", "level": 1 } ], + "components": [ [ [ "platinum_small", 8 ] ], [ [ "pearl", 4 ] ] ] + }, + { + "result": "diamond_platinum_bracelet", + "type": "uncraft", + "time": "60 s", + "qualities": [ { "id": "HAMMER", "level": 1 } ], + "components": [ [ [ "platinum_small", 8 ] ], [ [ "diamond", 4 ] ] ] + }, { "result": "platinum_dental_grill", "type": "uncraft", @@ -3109,6 +3872,104 @@ "qualities": [ { "id": "HAMMER", "level": 1 } ], "components": [ [ [ "platinum_small", 2 ] ] ] }, + { + "result": "garnet_platinum_earring", + "type": "uncraft", + "time": "60 s", + "qualities": [ { "id": "HAMMER", "level": 1 } ], + "components": [ [ [ "platinum_small", 4 ] ], [ [ "garnet", 2 ] ] ] + }, + { + "result": "amethyst_platinum_earring", + "type": "uncraft", + "time": "60 s", + "qualities": [ { "id": "HAMMER", "level": 1 } ], + "components": [ [ [ "platinum_small", 4 ] ], [ [ "amethyst", 2 ] ] ] + }, + { + "result": "aquamarine_platinum_earring", + "type": "uncraft", + "time": "60 s", + "qualities": [ { "id": "HAMMER", "level": 1 } ], + "components": [ [ [ "platinum_small", 4 ] ], [ [ "aquamarine", 2 ] ] ] + }, + { + "result": "emerald_platinum_earring", + "type": "uncraft", + "time": "60 s", + "qualities": [ { "id": "HAMMER", "level": 1 } ], + "components": [ [ [ "platinum_small", 4 ] ], [ [ "emerald", 2 ] ] ] + }, + { + "result": "alexandrite_platinum_earring", + "type": "uncraft", + "time": "60 s", + "qualities": [ { "id": "HAMMER", "level": 1 } ], + "components": [ [ [ "platinum_small", 4 ] ], [ [ "alexandrite", 2 ] ] ] + }, + { + "result": "ruby_platinum_earring", + "type": "uncraft", + "time": "60 s", + "qualities": [ { "id": "HAMMER", "level": 1 } ], + "components": [ [ [ "platinum_small", 4 ] ], [ [ "ruby", 2 ] ] ] + }, + { + "result": "peridot_platinum_earring", + "type": "uncraft", + "time": "60 s", + "qualities": [ { "id": "HAMMER", "level": 1 } ], + "components": [ [ [ "platinum_small", 4 ] ], [ [ "peridot", 2 ] ] ] + }, + { + "result": "sapphire_platinum_earring", + "type": "uncraft", + "time": "60 s", + "qualities": [ { "id": "HAMMER", "level": 1 } ], + "components": [ [ [ "platinum_small", 4 ] ], [ [ "sapphire", 2 ] ] ] + }, + { + "result": "tourmaline_platinum_earring", + "type": "uncraft", + "time": "60 s", + "qualities": [ { "id": "HAMMER", "level": 1 } ], + "components": [ [ [ "platinum_small", 4 ] ], [ [ "tourmaline", 2 ] ] ] + }, + { + "result": "citrine_platinum_earring", + "type": "uncraft", + "time": "60 s", + "qualities": [ { "id": "HAMMER", "level": 1 } ], + "components": [ [ [ "platinum_small", 4 ] ], [ [ "citrine", 2 ] ] ] + }, + { + "result": "blue_topaz_platinum_earring", + "type": "uncraft", + "time": "60 s", + "qualities": [ { "id": "HAMMER", "level": 1 } ], + "components": [ [ [ "platinum_small", 4 ] ], [ [ "blue_topaz", 2 ] ] ] + }, + { + "result": "opal_platinum_earring", + "type": "uncraft", + "time": "60 s", + "qualities": [ { "id": "HAMMER", "level": 1 } ], + "components": [ [ [ "platinum_small", 4 ] ], [ [ "opal", 2 ] ] ] + }, + { + "result": "pearl_platinum_earring", + "type": "uncraft", + "time": "60 s", + "qualities": [ { "id": "HAMMER", "level": 1 } ], + "components": [ [ [ "platinum_small", 4 ] ], [ [ "pearl", 2 ] ] ] + }, + { + "result": "diamond_platinum_earring", + "type": "uncraft", + "time": "60 s", + "qualities": [ { "id": "HAMMER", "level": 1 } ], + "components": [ [ [ "platinum_small", 4 ] ], [ [ "diamond", 2 ] ] ] + }, { "result": "platinum_watch", "type": "uncraft", @@ -3123,6 +3984,104 @@ "qualities": [ { "id": "HAMMER", "level": 1 } ], "components": [ [ [ "platinum_small", 2 ] ] ] }, + { + "result": "garnet_platinum_ring", + "type": "uncraft", + "time": "60 s", + "qualities": [ { "id": "HAMMER", "level": 1 } ], + "components": [ [ [ "platinum_small", 2 ] ], [ [ "garnet", 1 ] ] ] + }, + { + "result": "amethyst_platinum_ring", + "type": "uncraft", + "time": "60 s", + "qualities": [ { "id": "HAMMER", "level": 1 } ], + "components": [ [ [ "platinum_small", 2 ] ], [ [ "amethyst", 1 ] ] ] + }, + { + "result": "aquamarine_platinum_ring", + "type": "uncraft", + "time": "60 s", + "qualities": [ { "id": "HAMMER", "level": 1 } ], + "components": [ [ [ "platinum_small", 2 ] ], [ [ "aquamarine", 1 ] ] ] + }, + { + "result": "emerald_platinum_ring", + "type": "uncraft", + "time": "60 s", + "qualities": [ { "id": "HAMMER", "level": 1 } ], + "components": [ [ [ "platinum_small", 2 ] ], [ [ "emerald", 1 ] ] ] + }, + { + "result": "alexandrite_platinum_ring", + "type": "uncraft", + "time": "60 s", + "qualities": [ { "id": "HAMMER", "level": 1 } ], + "components": [ [ [ "platinum_small", 2 ] ], [ [ "alexandrite", 1 ] ] ] + }, + { + "result": "ruby_platinum_ring", + "type": "uncraft", + "time": "60 s", + "qualities": [ { "id": "HAMMER", "level": 1 } ], + "components": [ [ [ "platinum_small", 2 ] ], [ [ "ruby", 1 ] ] ] + }, + { + "result": "peridot_platinum_ring", + "type": "uncraft", + "time": "60 s", + "qualities": [ { "id": "HAMMER", "level": 1 } ], + "components": [ [ [ "platinum_small", 2 ] ], [ [ "peridot", 1 ] ] ] + }, + { + "result": "sapphire_platinum_ring", + "type": "uncraft", + "time": "60 s", + "qualities": [ { "id": "HAMMER", "level": 1 } ], + "components": [ [ [ "platinum_small", 2 ] ], [ [ "sapphire", 1 ] ] ] + }, + { + "result": "tourmaline_platinum_ring", + "type": "uncraft", + "time": "60 s", + "qualities": [ { "id": "HAMMER", "level": 1 } ], + "components": [ [ [ "platinum_small", 2 ] ], [ [ "tourmaline", 1 ] ] ] + }, + { + "result": "citrine_platinum_ring", + "type": "uncraft", + "time": "60 s", + "qualities": [ { "id": "HAMMER", "level": 1 } ], + "components": [ [ [ "platinum_small", 2 ] ], [ [ "citrine", 1 ] ] ] + }, + { + "result": "blue_topaz_platinum_ring", + "type": "uncraft", + "time": "60 s", + "qualities": [ { "id": "HAMMER", "level": 1 } ], + "components": [ [ [ "platinum_small", 2 ] ], [ [ "blue_topaz", 1 ] ] ] + }, + { + "result": "opal_platinum_ring", + "type": "uncraft", + "time": "60 s", + "qualities": [ { "id": "HAMMER", "level": 1 } ], + "components": [ [ [ "platinum_small", 2 ] ], [ [ "opal", 1 ] ] ] + }, + { + "result": "pearl_platinum_ring", + "type": "uncraft", + "time": "60 s", + "qualities": [ { "id": "HAMMER", "level": 1 } ], + "components": [ [ [ "platinum_small", 2 ] ], [ [ "pearl", 1 ] ] ] + }, + { + "result": "diamond_platinum_ring", + "type": "uncraft", + "time": "60 s", + "qualities": [ { "id": "HAMMER", "level": 1 } ], + "components": [ [ [ "platinum_small", 2 ] ], [ [ "diamond", 1 ] ] ] + }, { "result": "razor_shaving", "type": "uncraft", diff --git a/data/json/vehicles/trucks.json b/data/json/vehicles/trucks.json index cb0d0e76d604f..b316984ef4c5d 100644 --- a/data/json/vehicles/trucks.json +++ b/data/json/vehicles/trucks.json @@ -891,10 +891,10 @@ { "x": -2, "y": 1, "chance": 20, "items": [ "blanket" ] }, { "x": -3, "y": 0, "chance": 20, "items": [ "blanket" ] }, { "x": -3, "y": 1, "chance": 20, "items": [ "blanket" ] }, - { "x": -4, "y": 0, "chance": 10, "items": { "item": "dog_food", "container-item": "can_medium" } }, - { "x": -4, "y": 0, "chance": 10, "items": { "item": "dog_food", "container-item": "can_medium" } }, - { "x": -4, "y": 1, "chance": 10, "items": { "item": "cat_food", "container-item": "can_food" } }, - { "x": -4, "y": 1, "chance": 10, "items": { "item": "cat_food", "container-item": "can_food" } }, + { "x": -4, "y": 0, "chance": 10, "//": { "item": "dog_food", "container-item": "can_medium" } }, + { "x": -4, "y": 0, "chance": 10, "//": { "item": "dog_food", "container-item": "can_medium" } }, + { "x": -4, "y": 1, "chance": 10, "//": { "item": "cat_food", "container-item": "can_food" } }, + { "x": -4, "y": 1, "chance": 10, "//": { "item": "cat_food", "container-item": "can_food" } }, { "x": -4, "y": 0, "chance": 3, "items": [ "beartrap" ] } ] } diff --git a/data/mods/Aftershock/items/afs__items.json b/data/mods/Aftershock/items/afs__items.json index 57e4f2510b691..fc64d6ada74e8 100644 --- a/data/mods/Aftershock/items/afs__items.json +++ b/data/mods/Aftershock/items/afs__items.json @@ -3,14 +3,14 @@ "id": "afs_solderers_item", "copy-from": "fake_item", "type": "TOOL", - "name": "precision solderers", + "name": { "str": "precision solderers", "str_pl": "precision solderers" }, "flags": "TRADER_AVOID", "qualities": [ [ "SAW_M_FINE", 1 ], [ "SCREW_FINE", 1 ], [ "CUT_FINE", 2 ] ] }, { "type": "GENERIC", "id": "crypto_coin", - "name": "Crypto coins", + "name": { "str": "Crypto coin", "str_pl": "Crypto coins" }, "description": "PrepNet had been heavily involved in avoiding taxes by using untraceable internet currencies. If this movement had grown it could have crippled the US tax base but the Cataclysm happened first. These are physical coins with random numbers sequences embossed on them.", "price": 12000, "price_postapoc": 15000, @@ -166,7 +166,7 @@ "volume": "11356 ml", "price": 5000, "price_postapoc": 45000, - "looks_like": [ "still" ], + "looks_like": "still", "symbol": "u", "color": "light_green", "use_action": { "type": "deploy_furn", "furn_type": "f_atomic_butter_churn" }, diff --git a/data/mods/Aftershock/items/afs_armor.json b/data/mods/Aftershock/items/afs_armor.json index 642fb7e3bf4d2..00de3dbd548a1 100644 --- a/data/mods/Aftershock/items/afs_armor.json +++ b/data/mods/Aftershock/items/afs_armor.json @@ -2,7 +2,7 @@ { "id": "afs_bag_of_holding", "type": "ARMOR", - "name": "bag of holding", + "name": { "str": "bag of holding", "str_pl": "bags of holding" }, "description": "A sleek, unfathomably-complicated machine covered in dozens of blinking lights, worn on the back by sturdy faux-leather straps. An electrode dangles from the back, attaching to your forehead. How it operates without annihilating spacetime isn't quite clear, but a localized portal allows things to be stored in an extradimensional space.", "weight": "3401 g", "volume": "3 L", @@ -125,7 +125,7 @@ "id": "afs_hev_helmet_on", "type": "TOOL_ARMOR", "copy-from": "afs_hev_helmet", - "name": "hazardous environment helmet (on)", + "name": { "str": "hazardous environment helmet (on)", "str_pl": "hazardous environment helmets (on)" }, "description": "Meant to pair with a compatible HEV suit, this helmet's physical protection is basic at best, but makes up for it with an air recycler that provides excellent protection from airborne contaminants. Its light is on, illuminating the area at a cost of batteries.", "revert_to": "afs_hev_helmet", "turns_per_charge": 20, @@ -167,7 +167,7 @@ "id": "afs_survivor_belt", "copy-from": "survivor_belt", "type": "ARMOR", - "name": "survivor utility belt (holster)", + "name": { "str": "survivor utility belt (holster)", "str_pl": "survivor utility belts (holster)" }, "description": "A custom-built leather utility belt covered with straps and pouches containing many useful hand tools and a clip for holding various equipment. Durable and carefully crafted to be comfortable to wear. Activate to clip something to it.", "use_action": { "type": "holster", @@ -183,7 +183,7 @@ "id": "survivor_belt", "copy-from": "survivor_belt", "type": "ARMOR", - "name": "survivor utility belt (sheath)" + "name": { "str": "survivor utility belt (sheath)", "str_pl": "survivor utility belts (sheath)" } }, { "id": "afs_brigandine", diff --git a/data/mods/Aftershock/items/afs_bioparts.json b/data/mods/Aftershock/items/afs_bioparts.json index 96a2259546a8e..4a98739889e9d 100644 --- a/data/mods/Aftershock/items/afs_bioparts.json +++ b/data/mods/Aftershock/items/afs_bioparts.json @@ -106,8 +106,6 @@ "dispersion": 90, "durability": 7, "loudness": 8, - "max_charges": 80, - "initial_charges": 80, "ammo_effects": [ "LASER", "INCENDIARY" ], "flags": [ "NO_UNLOAD", "NON-FOULING" ] } diff --git a/data/mods/Aftershock/items/afs_books.json b/data/mods/Aftershock/items/afs_books.json index be5f18f9a451c..1f6c083fd4f3e 100644 --- a/data/mods/Aftershock/items/afs_books.json +++ b/data/mods/Aftershock/items/afs_books.json @@ -2,8 +2,7 @@ { "id": "afs_librarian_book", "type": "BOOK", - "name": "original copy of Housefly", - "name_plural": "original copies of Housefly", + "name": { "str": "original copy of Housefly", "str_pl": "original copies of Housefly" }, "description": "The only copy of Housefly in existence - a long book about three individuals drawn together by fate in the early 1800s to save their English town of Victoria from a mysterious threat. You never got to publish it, but reading it lets you forget the horrors of the Cataclysm, if only for a moment.", "weight": "700 g", "volume": "750 ml", @@ -39,8 +38,7 @@ { "id": "afs_textbook_handguns", "type": "BOOK", - "name": "Black Powder to Berettas", - "name_plural": "copies of Black Powder to Berettas", + "name": { "str": "Black Powder to Berettas", "str_pl": "copies of Black Powder to Berettas" }, "description": "This hardcover book, aimed at the gun nut, provides an illustrated, concise history of the handgun throughout history, including technical specifications and use techniques. It's difficult to follow without a passing knowledge in pistols, but an experienced handgun user could glean much from it.", "weight": "732 g", "volume": "750 ml", @@ -58,8 +56,7 @@ { "id": "afs_textbook_rifles", "type": "BOOK", - "name": "America's Rifle", - "name_plural": "copies of America's Rifle", + "name": { "str": "America's Rifle", "str_pl": "copies of America's Rifle" }, "description": "A history book penned by an anonymous author. Starting from its design by John Garand and ending with the Vietnam War, it provides a detailed run-down of the M1 Garand rifle's use throughout history as well as its design and quirks with the weapon.", "weight": "600 g", "volume": "500 ml", @@ -77,8 +74,7 @@ { "id": "afs_textbook_launchers", "type": "BOOK", - "name": "Jane's Flamethrowers and Firestarters", - "name_plural": "copies of Jane's Flamethrowers and Firestarters", + "name": { "str": "Jane's Flamethrowers and Firestarters", "str_pl": "copies of Jane's Flamethrowers and Firestarters" }, "description": "A detailed, full-colored guide to flamethrowers, incendiary weapons, and napalm. It builds off of information provided in its sister book, Jane's Mortars and Rocket Launchers, and so it's mostly incomprehensible to anyone without prior knowledge.", "weight": "734 g", "volume": "250 ml", @@ -96,8 +92,7 @@ { "id": "textbook_atomic", "type": "BOOK", - "name": "Nuclear Physics Made Easy", - "name_plural": "Nuclear Physics Made Easy", + "name": { "str": "Nuclear Physics Made Easy", "str_pl": "copies of Nuclear Physics Made Easy" }, "description": "A book detailing the workings of state of the art atomic technology, and the physics behind it.", "weight": "2063 g", "volume": "2 L", diff --git a/data/mods/Aftershock/items/afs_tools.json b/data/mods/Aftershock/items/afs_tools.json index e2b22fec17cf3..7229cbc3f8846 100644 --- a/data/mods/Aftershock/items/afs_tools.json +++ b/data/mods/Aftershock/items/afs_tools.json @@ -19,7 +19,7 @@ "active": true, "type": "transform" }, - { "revert_to": "afs_atomic_smartphone", "type": "CAMERA" } + { "type": "CAMERA" } ], "flags": [ "WATCH", "ALARMCLOCK" ] }, diff --git a/data/mods/Aftershock/items/afs_weapons.json b/data/mods/Aftershock/items/afs_weapons.json index 456095e720a88..4e53e67b0262c 100644 --- a/data/mods/Aftershock/items/afs_weapons.json +++ b/data/mods/Aftershock/items/afs_weapons.json @@ -43,7 +43,7 @@ { "id": "afs_energy_saber_on", "type": "TOOL", - "name": "energy saber (active)", + "name": { "str": "energy saber (active)", "str_pl": "energy sabers (active)" }, "description": "This glittering blue saber of cyan light hums gently, extending from its superalloy handle. Its edge is lethally sharp, and being made of light, it's weightless, and immune to being damaged. It's not white-hot like in pop culture, so it can't cut through anything, but there's not much in the way of flesh that it won't slice through easily.", "weight": "240 g", "volume": "1 L", diff --git a/data/mods/Aftershock/maps/afs_furniture.json b/data/mods/Aftershock/maps/afs_furniture.json index 32f0d048acf60..c26822de67bc0 100644 --- a/data/mods/Aftershock/maps/afs_furniture.json +++ b/data/mods/Aftershock/maps/afs_furniture.json @@ -8,7 +8,6 @@ "color": "white", "move_cost_mod": -1, "required_str": 10, - "insulation": 3, "flags": [ "CONTAINER", "PLACE_ITEM", "BLOCKSDOOR", "MINEABLE", "EASY_DECONSTRUCT" ], "deconstruct": { "items": [ { "item": "afs_fridge", "count": 1 } ] }, "max_volume": "1000 L", @@ -42,7 +41,6 @@ "color": "light_blue", "move_cost_mod": -1, "required_str": 10, - "insulation": 3, "flags": [ "CONTAINER", "PLACE_ITEM", "BLOCKSDOOR", "MINEABLE", "EASY_DECONSTRUCT" ], "deconstruct": { "items": [ { "item": "afs_freezer", "count": 1 } ] }, "max_volume": "1000 L", diff --git a/data/mods/CRT_EXPANSION/items/crt_armor.json b/data/mods/CRT_EXPANSION/items/crt_armor.json index 29f1b80488402..f9bc5a91d1291 100644 --- a/data/mods/CRT_EXPANSION/items/crt_armor.json +++ b/data/mods/CRT_EXPANSION/items/crt_armor.json @@ -25,7 +25,7 @@ "id": "crt_boots", "copy-from": "crt_la_boots", "type": "ARMOR", - "name": "pair of CRIT boots", + "name": { "str": "pair of CRIT boots", "str_pl": "pairs of CRIT boots" }, "description": "C.R.I.T standard-issue boots. Next-gen gels keep feet comfortable and hygenic during long-term missions while absorbing shock and heat from outside-sources. Superalloy mesh and rubber offer quite a bit of chemical protection as well. Decently heavy though", "color": "dark_gray", "weight": "1500 g", @@ -271,7 +271,7 @@ "id": "crt_earmor", "type": "ARMOR", "category": "armor", - "name": "CRIT Enforcer armor assembly", + "name": { "str": "CRIT Enforcer armor assembly", "str_pl": "CRIT Enforcer armor assemblies" }, "description": "A series of plates, guards and buckles which assemble into a suit of sturdy body-armor which usually goes over other armor. Overlapping steel plates on top of kevlar plates cover vast expanses as the armor juts off in places so it can deflect attacks. Built with the idea that comfort is less important than safety, this heavy suit is difficult to move about in but highly protective. Various adjustable conectors such as straps and clips hold it together.", "weight": "21460 g", "volume": "11250 ml", diff --git a/data/mods/CRT_EXPANSION/items/crt_gunmods.json b/data/mods/CRT_EXPANSION/items/crt_gunmods.json index 482f08e7cdbf0..7a8d901e64ae8 100644 --- a/data/mods/CRT_EXPANSION/items/crt_gunmods.json +++ b/data/mods/CRT_EXPANSION/items/crt_gunmods.json @@ -57,7 +57,7 @@ "id": "beam_difractor", "copy-from": "beam_scatterer", "type": "GUNMOD", - "name": "diffracting lens", + "name": { "str": "diffracting lens", "str_pl": "diffracting lenses" }, "description": "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", "range_modifier": -7, "damage_modifier": 2, @@ -96,7 +96,7 @@ { "id": "flash_acc_on", "type": "GUNMOD", - "name": "tactical flashlight (on)", + "name": { "str": "tactical flashlight (on)", "str_pl": "tactical flashlights (on)" }, "description": "A compact flashlight which is attatched to the side of your weapon, not powerful, but good enough for tight hallways.", "weight": "250 g", "volume": "125 ml", diff --git a/data/mods/CRT_EXPANSION/items/crt_toolarmor.json b/data/mods/CRT_EXPANSION/items/crt_toolarmor.json index 1ef8980277d86..20c9ed0e40ca9 100644 --- a/data/mods/CRT_EXPANSION/items/crt_toolarmor.json +++ b/data/mods/CRT_EXPANSION/items/crt_toolarmor.json @@ -3,7 +3,7 @@ "id": "crt_gasmask", "type": "TOOL_ARMOR", "category": "armor", - "name": "CRIT gasmask (off)", + "name": { "str": "CRIT gasmask (off)", "str_pl": "CRIT gasmasks (off)" }, "description": "This is the C.R.I.T Spec Ops modified gasmask, fitted with top-of-the-line electronics and lined with kevlar for extra protection in order to keep one's head where it should be. Various filters and other high tech wizardry allow for enhanced oxygen intake and safety even under bombardment. It has an integrated HUD and the option to turn it on for more features.", "weight": "5 kg", "volume": "1 L", @@ -35,7 +35,7 @@ "id": "crt_gasmask_on", "type": "TOOL_ARMOR", "category": "armor", - "name": "CRIT gasmask (on)", + "name": { "str": "CRIT gasmask (on)", "str_pl": "CRIT gasmasks (on)" }, "description": "This is the C.R.I.T Spec Ops modified gasmask. It is currently on and draining power for the HUD, low-level nightvision and other protective elements.", "weight": "5 kg", "volume": "1 L", @@ -77,7 +77,7 @@ "id": "crt_em_vest", "type": "TOOL_ARMOR", "category": "armor", - "name": "CRIT EM vest (off)", + "name": { "str": "CRIT EM vest (off)", "str_pl": "CRIT EM vests (off)" }, "description": "The C.R.I.T Spec Ops Enhanced Movement vest is embedded with high-tech filaments and reactive servos which protects its wearer and assists in movement at the cost high power usage. It is commonly worn by C.R.I.T Spec Ops for its ease of use and manuverability. Turn it on for suit mode, extra protection and movement.", "weight": "10 kg", "volume": "6250 ml", @@ -112,7 +112,7 @@ "id": "crt_em_vest_on", "type": "TOOL_ARMOR", "category": "armor", - "name": "CRIT EM vest (on)", + "name": { "str": "CRIT EM vest (on)", "str_pl": "CRIT EM vests (on)" }, "description": "The C.R.I.T Spec Ops Enhanced Movement vest is embedded with high-tech filaments, reactive servos and a generator which pumps a crystallized liquid that protects its wearer from most heavy combat situations at the cost of extreme power usage. It is commonly worn by C.R.I.T Spec Ops. This vest is currently in suit form and draining your UPS power at high rates.", "weight": "10 kg", "volume": "6250 ml", @@ -157,7 +157,7 @@ "id": "crt_helmet", "copy-from": "helmet_army", "type": "TOOL_ARMOR", - "name": "CRIT helmet (off)", + "name": { "str": "CRIT helmet (off)", "str_pl": "CRIT helmets (off)" }, "description": "C.R.T standard-issue helmet. Protects the noggin and has a stretch of insulated steel mesh for neck warmth and protection.", "color": "light_gray", "material": [ "kevlar", "hardsteel" ], @@ -180,7 +180,7 @@ "id": "crt_helmet_on", "copy-from": "helmet_army", "type": "TOOL_ARMOR", - "name": "CRIT helmet (on)", + "name": { "str": "CRIT helmet (on)", "str_pl": "CRIT helmets (on)" }, "description": "C.R.I.T standard-issue helmet. Protects the noggin and has a stretch of insulated steel mesh for neck warmth and protection. A tactically dim flashlight is attatched to the side. This light is currently on and drawing power.", "color": "light_gray", "material": [ "kevlar", "hardsteel" ], diff --git a/data/mods/CRT_EXPANSION/items/crt_tools.json b/data/mods/CRT_EXPANSION/items/crt_tools.json index 4bfb1cd8219d5..cb2823dbb3e76 100644 --- a/data/mods/CRT_EXPANSION/items/crt_tools.json +++ b/data/mods/CRT_EXPANSION/items/crt_tools.json @@ -26,7 +26,7 @@ "copy-from": "diveknife", "type": "TOOL", "category": "weapons", - "name": "CRIT service knife", + "name": { "str": "CRIT service knife", "str_pl": "CRIT service knives" }, "description": "C.R.I.T standard-issue knife. Has a knuckleduster guard and a small, hooked pry bar at the bottom for opening simple things and bashing in heads. Matte black finish helps it avoid flash in dim-light situations and tanto tip allows for light-armor penetration. Blade length allows for decent reach.", "color": "dark_gray", "material": [ "hardsteel" ], @@ -48,7 +48,7 @@ "id": "crt_knuckledusters", "type": "TOOL", "category": "weapons", - "name": "CRIT Knuckledusters", + "name": { "str": "pair of CRIT Knuckledusters", "str_pl": "pairs of CRIT Knuckledusters" }, "description": "C.R.I.T CQB knuckledusters. Not too different from any normal pair other than weight.", "color": "dark_gray", "material": [ "hardsteel" ], diff --git a/data/mods/CRT_EXPANSION/monsters/monster.json b/data/mods/CRT_EXPANSION/monsters/monster.json index 4e1ef063455ae..61e07bd845c9a 100644 --- a/data/mods/CRT_EXPANSION/monsters/monster.json +++ b/data/mods/CRT_EXPANSION/monsters/monster.json @@ -13,7 +13,6 @@ "speed": 15, "material": [ "flesh" ], "symbol": "@", - "size": "medium", "color": "pink", "aggression": 100, "morale": 100, @@ -43,7 +42,6 @@ "speed": 15, "material": [ "flesh" ], "symbol": "D", - "size": "medium", "color": "light_red", "aggression": 100, "morale": 100, diff --git a/data/mods/CrazyCataclysm/crazy_aperturepotato.json b/data/mods/CrazyCataclysm/crazy_aperturepotato.json index e44c2b8f9506e..bcb3747248b93 100644 --- a/data/mods/CrazyCataclysm/crazy_aperturepotato.json +++ b/data/mods/CrazyCataclysm/crazy_aperturepotato.json @@ -20,7 +20,7 @@ { "id": "aperture_potato", "type": "TOOL", - "name": "companion potato", + "name": { "str": "companion potato", "str_pl": "companion potatoes" }, "description": "Seems like some kind of Genetic Lifeform and Disk Operating System, attached to a potato.", "weight": "900 g", "volume": "500 ml", diff --git a/data/mods/CrazyCataclysm/crazy_comestibles.json b/data/mods/CrazyCataclysm/crazy_comestibles.json index f9113a0491b77..b68acd1742247 100644 --- a/data/mods/CrazyCataclysm/crazy_comestibles.json +++ b/data/mods/CrazyCataclysm/crazy_comestibles.json @@ -9,7 +9,7 @@ "symbol": "%", "quench": 25, "calories": 217, - "description": "The hit cookie from Mycus Industries! Now comes in addicting flavors such as Marloss, Chanterelle, and The Encroaching, Unavoidable Death of Human Civilization.", + "description": "The hit cookie from Mycus Industries! Now comes in addicting flavors such as Marloss, Chanterelle, and The Encroaching, Unavoidable Death of Human Civilization.", "price": 0, "material": [ "wheat", "fruit" ], "charges": 4, diff --git a/data/mods/CrazyCataclysm/crazy_monsters.json b/data/mods/CrazyCataclysm/crazy_monsters.json index a37833c89160d..f3d87a6d0a7d1 100644 --- a/data/mods/CrazyCataclysm/crazy_monsters.json +++ b/data/mods/CrazyCataclysm/crazy_monsters.json @@ -80,7 +80,8 @@ "description": "A smoking husk is all that remains of this once proud bear. Its black eyes gaze at you with malice… and hunger.", "default_faction": "bear", "species": [ "ZOMBIE" ], - "size": "LARGE", + "volume": "92500 ml", + "weight": "120 kg", "hp": 100, "speed": 90, "material": [ "flesh" ], diff --git a/data/mods/CrazyCataclysm/crazy_speech.json b/data/mods/CrazyCataclysm/crazy_speech.json index 3796fefc2e2c5..0e836e861be28 100644 --- a/data/mods/CrazyCataclysm/crazy_speech.json +++ b/data/mods/CrazyCataclysm/crazy_speech.json @@ -38,7 +38,7 @@ { "type": "speech", "speaker": "aperture_potato", - "sound": "Fantastic! You remained resolute and resourceful in an atmosphere of extreme pessimism.", + "sound": "Fantastic! You remained resolute and resourceful in an atmosphere of extreme pessimism.", "volume": 10 }, { @@ -182,19 +182,19 @@ { "type": "speech", "speaker": "aperture_potato", - "sound": "What was that? Did you say something? ", + "sound": "What was that? Did you say something?", "volume": 20 }, { "type": "speech", "speaker": "aperture_potato", - "sound": "I'd just like to point out that you were given every opportunity to succeed. ", + "sound": "I'd just like to point out that you were given every opportunity to succeed.", "volume": 10 }, { "type": "speech", "speaker": "aperture_potato", - "sound": "What's your point, anyway? Survival?", + "sound": "What's your point, anyway? Survival?", "volume": 20 }, { @@ -254,7 +254,7 @@ { "type": "snippet", "category": "clickbait", - "text": "KEVIN SACRIFICING GAMEPLAY FOR REALISM? THE SHOCKING TRUTH REVEALED" + "text": "KEVIN SACRIFICING GAMEPLAY FOR REALISM? THE SHOCKING TRUTH REVEALED" }, { "type": "snippet", @@ -269,7 +269,7 @@ { "type": "snippet", "category": "clickbait", - "text": "TRIVIALIZE THE EARLY GAME WITH THIS ONE SIMPLE SPEAR WEAPON! CONTRIBUTORS HATE HIM" + "text": "TRIVIALIZE THE EARLY GAME WITH THIS ONE SIMPLE SPEAR WEAPON! CONTRIBUTORS HATE HIM" }, { "type": "snippet", @@ -378,7 +378,7 @@ { "type": "speech", "speaker": "mon_mi_go", - "sound": "\"It's alive! It's alive!\"", + "sound": "\"It's alive! It's alive!\"", "volume": 40 }, { diff --git a/data/mods/EW_Pack/ew_books.json b/data/mods/EW_Pack/ew_books.json index 9a98dd6058e8a..d84c44e281312 100644 --- a/data/mods/EW_Pack/ew_books.json +++ b/data/mods/EW_Pack/ew_books.json @@ -2,8 +2,7 @@ { "type": "BOOK", "id": "recipe_igm", - "name": "Case #5846, Illegal Gun Modification", - "name_plural": "Case #5846, Illegal Gun Modification", + "name": { "str": "Case #5846, Illegal Gun Modification", "str_pl": "copies of Case #5846, Illegal Gun Modification" }, "max_level": 3, "description": "This file details illegal gun modifications. Maybe you could learn something. At least you don't have to worry about the cops anymore.", "weight": "400 g", diff --git a/data/mods/FictonalWeapons/fic_mods.json b/data/mods/FictonalWeapons/fic_mods.json index 0010bc74ef993..5c3312217625d 100644 --- a/data/mods/FictonalWeapons/fic_mods.json +++ b/data/mods/FictonalWeapons/fic_mods.json @@ -32,14 +32,8 @@ "color": "light_gray", "location": "underbarrel", "mod_targets": [ "pistol", "smg" ], - "gun_data": { - "ammo": "flammable", - "skill": "launcher", - "dispersion": 320, - "durability": 10, - "clip_size": 300, - "flags": [ "FIRE_50" ] - }, + "gun_data": { "ammo": "flammable", "skill": "launcher", "dispersion": 320, "durability": 10, "clip_size": 300 }, + "flags": [ "FIRE_50" ], "dispersion_modifier": 25, "min_skills": [ [ "weapon", 2 ], [ "launcher", 2 ] ] }, @@ -60,7 +54,6 @@ "bashing": 5, "handling_modifier": -5, "price": 20000, - "min_skills": [ [ "gun", 5 ] ], - "ups_charges": 5 + "min_skills": [ [ "gun", 5 ] ] } ] diff --git a/data/mods/FictonalWeapons/fic_weapons.json b/data/mods/FictonalWeapons/fic_weapons.json index 0096787d6edc6..b118ba98559c0 100644 --- a/data/mods/FictonalWeapons/fic_weapons.json +++ b/data/mods/FictonalWeapons/fic_weapons.json @@ -227,7 +227,6 @@ "material": [ "steel", "plastic" ], "flags": [ "NEVER_JAMS", "NO_UNLOAD", "NON-FOULING" ], "ammo_effects": [ "LIGHTNING", "BEANBAG" ], - "mode_modifier": [ [ "DEFAULT", "auto", 5 ] ], "ups_charges": 6, "skill": "smg", "weight": "2100 g", diff --git a/data/mods/Fuji_Mil_Prof/prof/spc.json b/data/mods/Fuji_Mil_Prof/prof/spc.json index b83f614d63cc7..c536770a9c264 100644 --- a/data/mods/Fuji_Mil_Prof/prof/spc.json +++ b/data/mods/Fuji_Mil_Prof/prof/spc.json @@ -171,7 +171,7 @@ "type": "profession", "ident": "mil_cbrn", "name": "Operator CBRN", - "description": "Chemical weapons? Check. Biological outbreak? Check. Nuclear war? Check. Sounds like the perfect job for you!", + "description": "Chemical weapons? Check. Biological outbreak? Check. Nuclear war? Check. Sounds like the perfect job for you!", "points": 5, "skills": [ { "level": 1, "name": "survival" }, diff --git a/data/mods/Fuji_Structures/items/items_games.json b/data/mods/Fuji_Structures/items/items_games.json index 32c29eaff814b..14548c81e882c 100644 --- a/data/mods/Fuji_Structures/items/items_games.json +++ b/data/mods/Fuji_Structures/items/items_games.json @@ -34,8 +34,7 @@ { "id": "cards", "type": "BOOK", - "name": "deck of cards", - "name_plural": "decks of cards", + "name": { "str": "deck of cards", "str_pl": "decks of cards" }, "description": "A collection of 52 cards made to play poker.", "weight": "96 g", "volume": "125 ml", @@ -51,8 +50,7 @@ { "id": "cards_magic", "type": "BOOK", - "name": "deck of Sorcery cards", - "name_plural": "decks of Sorcery cards", + "name": { "str": "deck of Sorcery cards", "str_pl": "decks of Sorcery cards" }, "description": "A set of cards meant to play the game \"Sorcery.\" Each card has a fun picture of a different monster.", "weight": "210 g", "volume": "250 ml", @@ -68,7 +66,7 @@ { "id": "pictionary", "type": "BOOK", - "name": "Picturesque", + "name": { "str": "Picturesque", "str_pl": "sets of Picturesque" }, "description": "A game where one draws an image, and the others attempt to guess what it is.", "weight": "350 g", "volume": "500 ml", @@ -84,7 +82,7 @@ { "id": "monopoly", "type": "BOOK", - "name": "Capitalism", + "name": { "str": "Capitalism", "str_pl": "sets of Capitalism" }, "description": "A game where players traverse around the board buying property and swindling their friends.", "weight": "300 g", "volume": "500 ml", @@ -100,7 +98,7 @@ { "id": "dnd", "type": "BOOK", - "name": "Blobs and Bandits", + "name": { "str": "Blobs and Bandits", "str_pl": "sets of Blobs and Bandits" }, "description": "A roleplaying game set in the post-apocalypse, so you can pretend to survive the apocalypse while surviving the apocalypse.", "weight": "680 g", "volume": "1250 ml", @@ -116,7 +114,7 @@ { "id": "g_warhammer", "type": "BOOK", - "name": "Battlehammer", + "name": { "str": "Battlehammer", "str_pl": "sets of Battlehammer" }, "description": "A strategy game featuring a set of tiny figurines of fantasy creatures.", "weight": "680 g", "volume": "1250 ml", @@ -132,7 +130,7 @@ { "id": "g_warhammer40k", "type": "BOOK", - "name": "Battlehammer 20k", + "name": { "str": "Battlehammer 20k", "str_pl": "sets of Battlehammer 20k" }, "description": "A strategy game featuring a set of tiny figurines of space aliens and grotesque space marines.", "weight": "680 g", "volume": "1250 ml", @@ -148,7 +146,7 @@ { "id": "catan", "type": "BOOK", - "name": "Settlers of the Ranch", + "name": { "str": "Settlers of the Ranch", "str_pl": "sets of Settlers of the Ranch" }, "description": "A strategy game where players build settlements and trade for supplies.", "weight": "804 g", "volume": "1250 ml", @@ -164,7 +162,7 @@ { "id": "battleship", "type": "BOOK", - "name": "Warships", + "name": { "str": "Warships", "str_pl": "sets of Warships" }, "description": "A game where players try to guess where the opponent placed their ships on the board.", "weight": "450 g", "volume": "500 ml", @@ -180,7 +178,7 @@ { "id": "clue", "type": "BOOK", - "name": "Murder Mystery", + "name": { "str": "Murder Mystery", "str_pl": "sets of Murder Mystery" }, "description": "A game where players try to figure out who murdered the butler.", "weight": "370 g", "volume": "500 ml", diff --git a/data/mods/Growable_pots/items.json b/data/mods/Growable_pots/items.json index 67e93d056381f..109ac18afd748 100644 --- a/data/mods/Growable_pots/items.json +++ b/data/mods/Growable_pots/items.json @@ -19,7 +19,7 @@ { "type": "GENERIC", "abstract": "gp_pot_growing", - "name": "garden pot (growing)", + "name": { "str": "garden pot (growing)", "str_pl": "garden pots (growing)" }, "description": "A garden pot growing some tasty, unnameable plants. You shouldn't see this item.", "weight": "480 g", "symbol": ")", @@ -33,7 +33,7 @@ { "type": "GENERIC", "abstract": "gp_pot_grown", - "name": "garden pot (grown)", + "name": { "str": "garden pot (grown)", "str_pl": "garden pots (grown)" }, "description": "A garden pot with some ripe, unnameable plants. You shouldn't see this item.", "copy-from": "gp_pot_growing", "use_action": "DISASSEMBLE" diff --git a/data/mods/Magiclysm/Spells/monsterspells.json b/data/mods/Magiclysm/Spells/monsterspells.json index b4e69018f0a93..84b68d133b3bd 100644 --- a/data/mods/Magiclysm/Spells/monsterspells.json +++ b/data/mods/Magiclysm/Spells/monsterspells.json @@ -16,5 +16,38 @@ "range_increment": 0.2, "effect": "projectile_attack", "extra_effects": [ { "id": "light_healing", "hit_self": true } ] + }, + { + "type": "SPELL", + "id": "mon_demon_fireball", + "name": "Demon Fireball", + "description": "This is a monster only spell.", + "valid_targets": [ "hostile", "ground", "ally", "self" ], + "min_damage": 15, + "max_damage": 15, + "min_range": 12, + "max_range": 12, + "min_aoe": 2, + "max_aoe": 2, + "base_casting_time": 120, + "effect": "projectile_attack", + "damage_type": "fire" + }, + { + "type": "SPELL", + "id": "mon_summon_demon_spiderlings", + "name": "Summon Demon Spiderlings", + "description": "Summons 4 permanent demon spiderlings.", + "flags": [ "HOSTILE_SUMMON", "PERMANENT" ], + "valid_targets": [ "ground" ], + "min_damage": 4, + "max_damage": 4, + "min_range": 5, + "max_range": 5, + "min_aoe": 3, + "max_aoe": 3, + "base_casting_time": 160, + "effect": "summon", + "effect_str": "mon_demon_spiderling" } ] diff --git a/data/mods/Magiclysm/enchanted/enchanted_belts.json b/data/mods/Magiclysm/enchanted/enchanted_belts.json index 07bc968f28179..790cfd406cc22 100644 --- a/data/mods/Magiclysm/enchanted/enchanted_belts.json +++ b/data/mods/Magiclysm/enchanted/enchanted_belts.json @@ -29,7 +29,7 @@ "type": "TOOL_ARMOR", "copy-from": "mbelt_leather", "id": "mbelt_haste", - "name": "Belt of Haste", + "name": { "str": "Belt of Haste", "str_pl": "Belts of Haste" }, "relic_data": { "passive_effects": [ { "has": "WORN", "condition": "ALWAYS", "values": [ { "value": "SPEED", "multiply": 0.15, "add": 5 } ] } ] } @@ -38,7 +38,7 @@ "type": "TOOL_ARMOR", "copy-from": "mbelt_leather", "id": "mbelt_thor", - "name": "Megingjörð", + "name": { "str": "Megingjörð", "str_pl": "Megingjörð" }, "description": "The mythical belt of Thor, god of thunder. Or at least so it appears. It doubles the wearer's base strength.", "material": [ "superalloy" ], "material_thickness": 10, @@ -52,7 +52,7 @@ "type": "TOOL_ARMOR", "copy-from": "mbelt_leather", "id": "mbelt_pockets_lesser", - "name": "Lesser Girdle of Pockets", + "name": { "str": "Lesser Girdle of Pockets", "str_pl": "Lesser Girdles of Pockets" }, "description": "A wide girdle that fits around your waist, coverd in numerous small pouches that hold a lot more than they should, and the weight of their contents is greatly reduced.", "coverage": 10, "encumbrance": 4, @@ -63,7 +63,7 @@ "type": "TOOL_ARMOR", "copy-from": "mbelt_leather", "id": "mbelt_pockets_greater", - "name": "Greater Girdle of Pockets", + "name": { "str": "Greater Girdle of Pockets", "str_pl": "Greater Girdles of Pockets" }, "description": "A wide girdle that fits around your waist, coverd in numerous small pouches that hold a lot more than they should, and the weight of their contents is greatly reduced.", "coverage": 10, "encumbrance": 6, @@ -74,7 +74,7 @@ "type": "TOOL_ARMOR", "copy-from": "mbelt_leather", "id": "mbelt_weaponry", - "name": "Belt of Weaponry", + "name": { "str": "Belt of Weaponry", "str_pl": "Belts of Weaponry" }, "description": "A wide girdle that fits around your waist, you can sheath or holster any weapon into it in the blink of an eye, and it seemingly stores them somewhere else.", "coverage": 10, "encumbrance": 3, @@ -176,7 +176,7 @@ "category": "weapons", "symbol": "/", "color": "light_gray", - "name": "The Iron Whip", + "name": { "str": "The Iron Whip", "str_pl": "Iron Whips" }, "description": "A long braided flexible steel bullwhip that narrows into a sharp blade at the end. Easily capable of slicing and dicing anything that comes at you. It transforms back into a belt.", "weight": "2154 g", "volume": "2 L", diff --git a/data/mods/Magiclysm/harvest.json b/data/mods/Magiclysm/harvest.json index 004e6f9cec877..216067cc29417 100644 --- a/data/mods/Magiclysm/harvest.json +++ b/data/mods/Magiclysm/harvest.json @@ -64,6 +64,17 @@ { "drop": "adrenal_gland_large", "type": "bionic", "max": 2 } ] }, + { + "id": "demon_spider", + "type": "harvest", + "entries": [ + { "drop": "meat_tainted", "type": "flesh", "mass_ratio": 0.1 }, + { "drop": "meat", "type": "flesh", "mass_ratio": 0.05 }, + { "drop": "demon_chitin_piece", "type": "bone", "mass_ratio": 0.04 }, + { "drop": "demon_chitin_plate", "type": "skin", "mass_ratio": 0.01 }, + { "drop": "demon_spider_fang", "base_num": [ 0, 0 ], "scale_num": [ 0.1, 0.6 ], "max": 2, "type": "flesh" } + ] + }, { "id": "mammal_small_fur", "//": "override of vanilla harvest, includes hairballs", diff --git a/data/mods/Magiclysm/items/alchemy_items.json b/data/mods/Magiclysm/items/alchemy_items.json index 0012a2c417698..11ec8a442b888 100644 --- a/data/mods/Magiclysm/items/alchemy_items.json +++ b/data/mods/Magiclysm/items/alchemy_items.json @@ -207,5 +207,52 @@ "material": [ "flesh" ], "cutting": 7, "flags": [ "SPEAR", "SHEATH_KNIFE" ] + }, + { + "type": "GENERIC", + "id": "demon_chitin_piece", + "category": "spare_parts", + "symbol": ",", + "color": "red", + "name": "chunk of demon chitin", + "name_plural": "chunks of demon chitin", + "description": "A piece of demon spider exoskeleton. It is light and very durable, and probably has some magical properties.", + "price": 0, + "material": "demon_chitin", + "weight": "89 g", + "volume": "250 ml", + "bashing": 1, + "flags": [ "TRADER_AVOID" ], + "to_hit": -2 + }, + { + "type": "GENERIC", + "id": "demon_chitin_plate", + "category": "spare_parts", + "symbol": "/", + "color": "red", + "name": "demon chitin plate", + "price": 15225, + "material": "demon_chitin", + "weight": "10 kg", + "volume": "4 L", + "bashing": 12, + "to_hit": -4, + "description": "A large piece of demon spider exoskeleton, painstakingly cut from the corpse of an adult demon spider. A plate of this size can be used to create armor plating." + }, + { + "type": "GENERIC", + "id": "demon_spider_fang", + "name": "demon spider fang", + "description": "A fang from a demon spider. It seems to still drip with poison; you might be able to use this in some alchemical recipe?", + "weight": "270 g", + "to_hit": -2, + "color": "green", + "symbol": ",", + "material": [ "flesh" ], + "volume": "250 ml", + "cutting": 8, + "flags": [ "SPEAR", "SHEATH_KNIFE" ], + "price": 1500 } ] diff --git a/data/mods/Magiclysm/items/ethereal_items.json b/data/mods/Magiclysm/items/ethereal_items.json index a326b5ce2ba1f..4918e34dc04b2 100644 --- a/data/mods/Magiclysm/items/ethereal_items.json +++ b/data/mods/Magiclysm/items/ethereal_items.json @@ -96,7 +96,7 @@ { "id": "shield_ice", "type": "ARMOR", - "name": "large shield of magical ice", + "name": { "str": "large shield of magical ice", "str_pl": "large shields of magical ice" }, "category": "armor", "description": "A lightweight but tough shield crafted entirely of magical ice.", "weight": "1 kg", @@ -316,7 +316,7 @@ { "type": "TOOL", "id": "druid_seed", - "name": "seed of purification", + "name": { "str": "seed of purification", "str_pl": "seeds of purification" }, "weight": "1 g", "color": "white", "use_action": { diff --git a/data/mods/Magiclysm/items/spell_scrolls.json b/data/mods/Magiclysm/items/spell_scrolls.json index 172206a91cfc2..38435e02f4f75 100644 --- a/data/mods/Magiclysm/items/spell_scrolls.json +++ b/data/mods/Magiclysm/items/spell_scrolls.json @@ -14,7 +14,7 @@ "type": "GENERIC", "copy-from": "spell_scroll", "id": "spell_scroll_dark_sight", - "name": "Scroll of Dark Sight", + "name": { "str": "Scroll of Dark Sight", "str_pl": "Scrolls of Dark Sight" }, "description": "The darkness holds no secrets for the arcane. Adjust your sight to see in perfect darkness!", "use_action": { "type": "learn_spell", "spells": [ "dark_sight" ] } }, @@ -22,7 +22,7 @@ "type": "GENERIC", "copy-from": "spell_scroll", "id": "spell_scroll_invisibility", - "name": "Scroll of Invisibility", + "name": { "str": "Scroll of Invisibility", "str_pl": "Scrolls of Invisibility" }, "description": "The light can not interact with you unless you want it to. Become invisible!", "use_action": { "type": "learn_spell", "spells": [ "invisibility" ] } }, @@ -30,7 +30,7 @@ "type": "GENERIC", "copy-from": "spell_scroll", "id": "spell_scroll_obfuscated_body", - "name": "Scroll of Obfuscated Body", + "name": { "str": "Scroll of Obfuscated Body", "str_pl": "Scrolls of Obfuscated Body" }, "description": "A magical aura distorts light around your body, making it easier to dodge enemy attacks.", "use_action": { "type": "learn_spell", "spells": [ "obfuscated_body" ] } }, @@ -38,7 +38,7 @@ "type": "GENERIC", "copy-from": "spell_scroll", "id": "spell_scroll_smite", - "name": "Scroll of Smite", + "name": { "str": "Scroll of Smite", "str_pl": "Scrolls of Smite" }, "description": "Evil has become pervasive throughout the world. Let your power be the light that shines in the darkness!", "use_action": { "type": "learn_spell", "spells": [ "smite" ] } }, @@ -46,7 +46,7 @@ "type": "GENERIC", "copy-from": "spell_scroll", "id": "spell_scroll_recover_mana", - "name": "Scroll of Life Conversion", + "name": { "str": "Scroll of Life Conversion", "str_pl": "Scrolls of Life Conversion" }, "description": "You channel your life force itself into your spiritual energy. You spend hp to regain mana.", "use_action": { "type": "learn_spell", "spells": [ "recover_mana" ] } }, @@ -54,7 +54,7 @@ "type": "GENERIC", "copy-from": "spell_scroll", "id": "spell_scroll_recover_pain", - "name": "Scroll of Mind Over Pain", + "name": { "str": "Scroll of Mind Over Pain", "str_pl": "Scrolls of Mind Over Pain" }, "description": "With an intense ritual that resembles crossfit, you manage to put some of your pain at bay.", "use_action": { "type": "learn_spell", "spells": [ "recover_pain" ] } }, @@ -62,7 +62,7 @@ "type": "GENERIC", "copy-from": "spell_scroll", "id": "spell_scroll_summon_zombie", - "name": "Scroll of Summon Zombie", + "name": { "str": "Scroll of Summon Zombie", "str_pl": "Scrolls of 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.", "use_action": { "type": "learn_spell", "spells": [ "summon_zombie" ] } }, @@ -70,7 +70,7 @@ "type": "GENERIC", "copy-from": "spell_scroll", "id": "spell_scroll_summon_skeleton", - "name": "Scroll of Summon Skeleton", + "name": { "str": "Scroll of Summon Skeleton", "str_pl": "Scrolls of 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.", "use_action": { "type": "learn_spell", "spells": [ "summon_skeleton" ] } }, @@ -78,7 +78,7 @@ "type": "GENERIC", "copy-from": "spell_scroll", "id": "spell_scroll_summon_decayed_pouncer", - "name": "Scroll of Summon Decayed Pouncer", + "name": { "str": "Scroll of Summon Decayed Pouncer", "str_pl": "Scrolls of 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.", "use_action": { "type": "learn_spell", "spells": [ "summon_decayed_pouncer" ] } }, @@ -86,7 +86,7 @@ "type": "GENERIC", "copy-from": "spell_scroll", "id": "spell_scroll_light_healing", - "name": "Scroll of Cure Light Wounds", + "name": { "str": "Scroll of Cure Light Wounds", "str_pl": "Scrolls of Cure Light Wounds" }, "description": "Heals a little bit of damage on the target.", "use_action": { "type": "learn_spell", "spells": [ "light_healing" ] } }, @@ -94,7 +94,7 @@ "type": "GENERIC", "copy-from": "spell_scroll", "id": "spell_scroll_pain_split", - "name": "Scroll of Pain Split", + "name": { "str": "Scroll of Pain Split", "str_pl": "Scrolls of Pain Split" }, "description": "Evens out damage among your limbs.", "use_action": { "type": "learn_spell", "spells": [ "pain_split" ] } }, @@ -102,7 +102,7 @@ "type": "GENERIC", "copy-from": "spell_scroll", "id": "spell_scroll_vicious_tentacle", - "name": "Scroll of Vicious Tentacle", + "name": { "str": "Scroll of Vicious Tentacle", "str_pl": "Scrolls of Vicious Tentacle" }, "description": "This spell extrudes a long nasty whiplike tentacle of sharp bones and oozing acid from your body, it has a long reach attack and vicious damage.", "use_action": { "type": "learn_spell", "spells": [ "vicious_tentacle" ] } }, @@ -110,7 +110,7 @@ "type": "GENERIC", "copy-from": "spell_scroll", "id": "spell_scroll_bio_grotesque", - "name": "Scroll of Grotesque Enhancement", + "name": { "str": "Scroll of Grotesque Enhancement", "str_pl": "Scrolls of Grotesque Enhancement" }, "description": "A spell that warps your body in alien ways to increase your physical abilities and strength.", "use_action": { "type": "learn_spell", "spells": [ "bio_grotesque" ] } }, @@ -118,7 +118,7 @@ "type": "GENERIC", "copy-from": "spell_scroll", "id": "spell_scroll_bio_acidicspray", - "name": "Scroll of Acidic Spray", + "name": { "str": "Scroll of Acidic Spray", "str_pl": "Scrolls of Acidic Spray" }, "description": "When cast, the mage opens his mouth and sprays acid in a wide cone to dissolve his foes into goo. Just imagine what he'll do with the goo.", "use_action": { "type": "learn_spell", "spells": [ "bio_acidicspray" ] } }, @@ -126,7 +126,7 @@ "type": "GENERIC", "copy-from": "spell_scroll", "id": "spell_scroll_bio_fleshpouch", - "name": "Scroll of Flesh Pouch", + "name": { "str": "Scroll of Flesh Pouch", "str_pl": "Scrolls of Flesh Pouch" }, "description": "This spell grows a large pouch out of your skin on your back, allowing you to store your gear in it.", "use_action": { "type": "learn_spell", "spells": [ "bio_fleshpouch" ] } }, @@ -134,7 +134,7 @@ "type": "GENERIC", "copy-from": "spell_scroll", "id": "spell_scroll_bio_bonespear", - "name": "Scroll of Conjure Bonespear", + "name": { "str": "Scroll of Conjure Bonespear", "str_pl": "Scrolls of Conjure Bonespear" }, "description": "This spell creates a long shaft of bone with a wicked point and blades along its length.", "use_action": { "type": "learn_spell", "spells": [ "bio_bonespear" ] } }, @@ -142,7 +142,7 @@ "type": "GENERIC", "copy-from": "spell_scroll", "id": "spell_scroll_megablast", - "name": "Scroll of Megablast", + "name": { "str": "Scroll of Megablast", "str_pl": "Scrolls of Megablast" }, "description": "You always wanted to fire energy beams like in the animes you watched as a kid. Now you can!", "use_action": { "type": "learn_spell", "spells": [ "megablast" ] } }, @@ -150,7 +150,7 @@ "type": "GENERIC", "copy-from": "spell_scroll", "id": "spell_scroll_create_atomic_light", - "name": "Scroll of Magical Light", + "name": { "str": "Scroll of Magical Light", "str_pl": "Scrolls of Magical Light" }, "description": "Creates a magical light.", "use_action": { "type": "learn_spell", "spells": [ "create_atomic_light" ] } }, @@ -158,7 +158,7 @@ "type": "GENERIC", "copy-from": "spell_scroll", "id": "spell_scroll_blinding_flash", - "name": "Scroll of Blinding Flash", + "name": { "str": "Scroll of Blinding Flash", "str_pl": "Scrolls of Blinding Flash" }, "description": "Blind enemies for a short time with a sudden, dazzling light. Higher levels deal slightly higher damage.", "use_action": { "type": "learn_spell", "spells": [ "blinding_flash" ] } }, @@ -166,7 +166,7 @@ "type": "GENERIC", "copy-from": "spell_scroll", "id": "spell_scroll_ethereal_grasp", - "name": "Scroll of Ethereal Grasp", + "name": { "str": "Scroll of Ethereal Grasp", "str_pl": "Scrolls of Ethereal Grasp" }, "description": "A mass of spectral hands emerge from the ground, slowing everything in range. Higher levels allow a bigger AoE, and longer effect.", "use_action": { "type": "learn_spell", "spells": [ "ethereal_grasp" ] } }, @@ -174,7 +174,7 @@ "type": "GENERIC", "copy-from": "spell_scroll", "id": "spell_scroll_protection_aura", - "name": "Scroll of Aura of Protection", + "name": { "str": "Scroll of Aura of Protection", "str_pl": "Scrolls of Aura of Protection" }, "description": "Encases your whole body in a magical aura that protects you from the environment.", "use_action": { "type": "learn_spell", "spells": [ "protection_aura" ] } }, @@ -182,7 +182,7 @@ "type": "GENERIC", "copy-from": "spell_scroll", "id": "spell_scroll_druid_veggrasp", - "name": "Scroll of Vegetative Grasp", + "name": { "str": "Scroll of Vegetative Grasp", "str_pl": "Scrolls of 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.", "use_action": { "type": "learn_spell", "spells": [ "druid_veggrasp" ] } }, @@ -190,7 +190,7 @@ "type": "GENERIC", "copy-from": "spell_scroll", "id": "spell_scroll_druid_rootstrike", - "name": "Scroll of Root Strike", + "name": { "str": "Scroll of Root Strike", "str_pl": "Scrolls of Root Strike" }, "description": "This spell causes roots to spear out the ground and stab into your foes in an arc, impaling them.", "use_action": { "type": "learn_spell", "spells": [ "druid_rootstrike" ] } }, @@ -198,7 +198,7 @@ "type": "GENERIC", "copy-from": "spell_scroll", "id": "spell_scroll_druid_woodshaft", - "name": "Scroll of Wooden Shaft", + "name": { "str": "Scroll of Wooden Shaft", "str_pl": "Scrolls of 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.", "use_action": { "type": "learn_spell", "spells": [ "druid_woodshaft" ] } }, @@ -206,7 +206,7 @@ "type": "GENERIC", "copy-from": "spell_scroll", "id": "spell_scroll_druid_naturebow1", - "name": "Scroll of Nature's Bow", + "name": { "str": "Scroll of Nature's Bow", "str_pl": "Scrolls of Nature's Bow" }, "description": "This spell conjures a magical wooden recurve bow that fires endless arrows for as long as it lasts.", "use_action": { "type": "learn_spell", "spells": [ "druid_naturebow1" ] } }, @@ -214,7 +214,7 @@ "type": "GENERIC", "copy-from": "spell_scroll", "id": "spell_scroll_recover_fatigue", - "name": "Scroll of Nature's Trance", + "name": { "str": "Scroll of Nature's Trance", "str_pl": "Scrolls of 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.", "use_action": { "type": "learn_spell", "spells": [ "recover_fatigue" ] } }, @@ -222,7 +222,7 @@ "type": "GENERIC", "copy-from": "spell_scroll", "id": "spell_scroll_summon_cats", - "name": "Scroll of Bag of Cats", + "name": { "str": "Scroll of Bag of Cats", "str_pl": "Scrolls of Bag of Cats" }, "description": "Are you the crazy cat lady?", "use_action": { "type": "learn_spell", "spells": [ "summon_cats" ] } }, @@ -230,7 +230,7 @@ "type": "GENERIC", "copy-from": "spell_scroll", "id": "spell_scroll_stonefist", - "name": "Scroll of Stonefist", + "name": { "str": "Scroll of Stonefist", "str_pl": "Scrolls of Stonefist" }, "description": "Encases your arms and hands in a sheath of magical stone, you can punch and defend yourself with it in melee combat.", "use_action": { "type": "learn_spell", "spells": [ "stonefist" ] } }, @@ -238,7 +238,7 @@ "type": "GENERIC", "copy-from": "spell_scroll", "id": "spell_scroll_seismic_stomp", - "name": "Scroll of Seismic Stomp", + "name": { "str": "Scroll of Seismic Stomp", "str_pl": "Scrolls of Seismic Stomp" }, "description": "Focusing mana into your leg, you stomp your foot and send out a shockwave, knocking enemies around you onto the ground.", "use_action": { "type": "learn_spell", "spells": [ "seismic_stomp" ] } }, @@ -246,7 +246,7 @@ "type": "GENERIC", "copy-from": "spell_scroll", "id": "spell_scroll_recover_stamina", - "name": "Scroll of Stone's Endurance", + "name": { "str": "Scroll of Stone's Endurance", "str_pl": "Scrolls of Stone's Endurance" }, "description": "You focus on the stones beneath you and draw from their agelessness. Your mana is converted to stamina.", "use_action": { "type": "learn_spell", "spells": [ "recover_stamina" ] } }, @@ -254,7 +254,7 @@ "type": "GENERIC", "copy-from": "spell_scroll", "id": "spell_scroll_eshaper_shardspray", - "name": "Scroll of Shardspray", + "name": { "str": "Scroll of Shardspray", "str_pl": "Scrolls of Shardspray" }, "description": "This spell projects a wide spray of sharp metal shards, cutting into your foes and friends alike.", "use_action": { "type": "learn_spell", "spells": [ "eshaper_shardspray" ] } }, @@ -262,7 +262,7 @@ "type": "GENERIC", "copy-from": "spell_scroll", "id": "spell_scroll_eshaper_piercing_bolt", - "name": "Scroll of Piercing Bolt", + "name": { "str": "Scroll of Piercing Bolt", "str_pl": "Scrolls of Piercing Bolt" }, "description": "This spell projects a piercing rod of conjured iron at those that dare oppose you.", "use_action": { "type": "learn_spell", "spells": [ "eshaper_piercing_bolt" ] } }, @@ -270,7 +270,7 @@ "type": "GENERIC", "copy-from": "spell_scroll", "id": "spell_scroll_eshaper_shardstorm", - "name": "Scroll of Shardstorm", + "name": { "str": "Scroll of Shardstorm", "str_pl": "Scrolls of Shardstorm" }, "description": "Creates an omnidirectional spray of razor sharp metal shards all around you.", "use_action": { "type": "learn_spell", "spells": [ "eshaper_shardstorm" ] } }, @@ -278,7 +278,7 @@ "type": "GENERIC", "copy-from": "spell_scroll", "id": "spell_scroll_eshaper_rockbolt", - "name": "Scroll of Rockbolt", + "name": { "str": "Scroll of Rockbolt", "str_pl": "Scrolls of Rockbolt" }, "description": "Fires a conjured stone projectile at high velocity.", "use_action": { "type": "learn_spell", "spells": [ "eshaper_rockbolt" ] } }, @@ -286,7 +286,7 @@ "type": "GENERIC", "copy-from": "spell_scroll", "id": "spell_scroll_point_flare", - "name": "Scroll of Point Flare", + "name": { "str": "Scroll of Point Flare", "str_pl": "Scrolls of Point Flare" }, "description": "Causes an intense heat at the location, damaging the target.", "use_action": { "type": "learn_spell", "spells": [ "point_flare" ] } }, @@ -294,7 +294,7 @@ "type": "GENERIC", "copy-from": "spell_scroll", "id": "spell_scroll_create_lighter", - "name": "Scroll of Finger Firelighter", + "name": { "str": "Scroll of Finger Firelighter", "str_pl": "Scrolls of 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.", "use_action": { "type": "learn_spell", "spells": [ "create_lighter" ] } }, @@ -302,7 +302,7 @@ "type": "GENERIC", "copy-from": "spell_scroll", "id": "spell_scroll_ice_spike", - "name": "Scroll of Ice Spike", + "name": { "str": "Scroll of Ice Spike", "str_pl": "Scrolls of Ice Spike" }, "description": "Causes jagged icicles to form in the air above the target, falling and damaging it.", "use_action": { "type": "learn_spell", "spells": [ "ice_spike" ] } }, @@ -310,7 +310,7 @@ "type": "GENERIC", "copy-from": "spell_scroll", "id": "spell_scroll_fireball", - "name": "Scroll of Fireball", + "name": { "str": "Scroll of Fireball", "str_pl": "Scrolls of Fireball" }, "description": "You hurl a pea-sized glowing orb that when reaches its target or an obstacle produces a pressure-less blast of searing heat.", "use_action": { "type": "learn_spell", "spells": [ "fireball" ] } }, @@ -318,7 +318,7 @@ "type": "GENERIC", "copy-from": "spell_scroll", "id": "spell_scroll_cone_cold", - "name": "Scroll of Cone of Cold", + "name": { "str": "Scroll of Cone of Cold", "str_pl": "Scrolls of Cone of Cold" }, "description": "You blast a cone of frigid air toward the target.", "use_action": { "type": "learn_spell", "spells": [ "cone_cold" ] } }, @@ -326,7 +326,7 @@ "type": "GENERIC", "copy-from": "spell_scroll", "id": "spell_scroll_burning_hands", - "name": "Scroll of Burning Hands", + "name": { "str": "Scroll of Burning Hands", "str_pl": "Scrolls of Burning Hands" }, "description": "You're pretty sure you saw this in a game somewhere. You fire a short-range cone of fire.", "use_action": { "type": "learn_spell", "spells": [ "burning_hands" ] } }, @@ -334,7 +334,7 @@ "type": "GENERIC", "copy-from": "spell_scroll", "id": "spell_scroll_frost_spray", - "name": "Scroll of Frost Spray", + "name": { "str": "Scroll of Frost Spray", "str_pl": "Scrolls of Frost Spray" }, "description": "You're pretty sure you saw this in a game somewhere. You fire a short-range cone of ice and cold.", "use_action": { "type": "learn_spell", "spells": [ "frost_spray" ] } }, @@ -342,7 +342,7 @@ "type": "GENERIC", "copy-from": "spell_scroll", "id": "spell_scroll_chilling_touch", - "name": "Scroll of Chilling Touch", + "name": { "str": "Scroll of Chilling Touch", "str_pl": "Scrolls of Chilling Touch" }, "description": "Freezes the touched target with intense cold.", "use_action": { "type": "learn_spell", "spells": [ "chilling_touch" ] } }, @@ -350,7 +350,7 @@ "type": "GENERIC", "copy-from": "spell_scroll", "id": "spell_scroll_glide_ice", - "name": "Scroll of Glide on Ice", + "name": { "str": "Scroll of Glide on Ice", "str_pl": "Scrolls of Glide on Ice" }, "description": "Encases your feet in a magical coating of ice, allowing you to glide along smooth surfaces faster.", "use_action": { "type": "learn_spell", "spells": [ "glide_ice" ] } }, @@ -358,7 +358,7 @@ "type": "GENERIC", "copy-from": "spell_scroll", "id": "spell_scroll_hoary_blast", - "name": "Scroll of Hoary Blast", + "name": { "str": "Scroll of Hoary Blast", "str_pl": "Scrolls of Hoary Blast" }, "description": "You project a glowing white crystal of ice and it explodes on impact into a blossom of shattering cold.", "use_action": { "type": "learn_spell", "spells": [ "hoary_blast" ] } }, @@ -366,7 +366,7 @@ "type": "GENERIC", "copy-from": "spell_scroll", "id": "spell_scroll_ice_shield", - "name": "Scroll of Ice Shield", + "name": { "str": "Scroll of Ice Shield", "str_pl": "Scrolls of 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.", "use_action": { "type": "learn_spell", "spells": [ "ice_shield" ] } }, @@ -374,7 +374,7 @@ "type": "GENERIC", "copy-from": "spell_scroll", "id": "spell_scroll_frost_armor", - "name": "Scroll of Frost Armor", + "name": { "str": "Scroll of Frost Armor", "str_pl": "Scrolls of Frost Armor" }, "description": "Covers you in a thin layer of magical ice to protect you from harm.", "use_action": { "type": "learn_spell", "spells": [ "frost_armor" ] } }, @@ -382,7 +382,7 @@ "type": "GENERIC", "copy-from": "spell_scroll", "id": "spell_scroll_magic_missile", - "name": "Scroll of Magic Missile", + "name": { "str": "Scroll of Magic Missile", "str_pl": "Scrolls of Magic Missile" }, "description": "I cast Magic Missile at the darkness!", "use_action": { "type": "learn_spell", "spells": [ "magic_missile" ] } }, @@ -390,7 +390,7 @@ "type": "GENERIC", "copy-from": "spell_scroll", "id": "spell_scroll_phase_door", - "name": "Scroll of Phase Door", + "name": { "str": "Scroll of Phase Door", "str_pl": "Scrolls of Phase Door" }, "description": "Teleports you in a random direction a short distance.", "use_action": { "type": "learn_spell", "spells": [ "phase_door" ] } }, @@ -398,7 +398,7 @@ "type": "GENERIC", "copy-from": "spell_scroll", "id": "spell_scroll_gravity_well", - "name": "Scroll of Gravity Well", + "name": { "str": "Scroll of Gravity Well", "str_pl": "Scrolls of Gravity Well" }, "description": "Summons a well of gravity with the epicenter at the location. Deals bashing damage to all creatures in the affected area.", "use_action": { "type": "learn_spell", "spells": [ "gravity_well" ] } }, @@ -406,7 +406,7 @@ "type": "GENERIC", "copy-from": "spell_scroll", "id": "spell_scroll_magus_mana_blast", - "name": "Scroll of Mana Blast", + "name": { "str": "Scroll of Mana Blast", "str_pl": "Scrolls of Mana Blast" }, "description": "A blast of concentrated magical power that obliterates a large area.", "use_action": { "type": "learn_spell", "spells": [ "magus_mana_blast" ] } }, @@ -414,7 +414,7 @@ "type": "GENERIC", "copy-from": "spell_scroll", "id": "spell_scroll_magus_mana_bolt", - "name": "Scroll of Mana Bolt", + "name": { "str": "Scroll of Mana Bolt", "str_pl": "Scrolls of Mana Bolt" }, "description": "A bolt of magical power that only damages your foes.", "use_action": { "type": "learn_spell", "spells": [ "magus_mana_bolt" ] } }, @@ -422,7 +422,7 @@ "type": "GENERIC", "copy-from": "spell_scroll", "id": "spell_scroll_magus_haste", - "name": "Scroll of Haste", + "name": { "str": "Scroll of Haste", "str_pl": "Scrolls of Haste" }, "description": "This spell gives you an enormous boost of speed lasting a short period of time.", "use_action": { "type": "learn_spell", "spells": [ "magus_haste" ] } }, @@ -430,7 +430,7 @@ "type": "GENERIC", "copy-from": "spell_scroll", "id": "spell_scroll_magus_mana_beam", - "name": "Scroll of Mana Beam", + "name": { "str": "Scroll of Mana Beam", "str_pl": "Scrolls of Mana Beam" }, "description": "A beam of focused magical power that damages any foes in its path.", "use_action": { "type": "learn_spell", "spells": [ "magus_mana_beam" ] } }, @@ -438,7 +438,7 @@ "type": "GENERIC", "copy-from": "spell_scroll", "id": "spell_scroll_magus_escape", - "name": "Scroll of Escape", + "name": { "str": "Scroll of Escape", "str_pl": "Scrolls of Escape" }, "description": "Teleports you in a random direction a medium distance, to help escape your foes in dangerous situations.", "use_action": { "type": "learn_spell", "spells": [ "magus_escape" ] } }, @@ -446,7 +446,7 @@ "type": "GENERIC", "copy-from": "spell_scroll", "id": "spell_scroll_cats_grace", - "name": "Scroll of Cat's Grace", + "name": { "str": "Scroll of Cat's Grace", "str_pl": "Scrolls of Cat's Grace" }, "description": "You become more graceful, agile, and coordinated.", "use_action": { "type": "learn_spell", "spells": [ "cats_grace" ] } }, @@ -454,7 +454,7 @@ "type": "GENERIC", "copy-from": "spell_scroll", "id": "spell_scroll_eagles_sight", - "name": "Scroll of Eagle's Sight", + "name": { "str": "Scroll of Eagle's Sight", "str_pl": "Scrolls of Eagle's Sight" }, "description": "You gain the perception of an eagle.", "use_action": { "type": "learn_spell", "spells": [ "eagles_sight" ] } }, @@ -462,7 +462,7 @@ "type": "GENERIC", "copy-from": "spell_scroll", "id": "spell_scroll_ogres_strength", - "name": "Scroll of Ogre's Strength", + "name": { "str": "Scroll of Ogre's Strength", "str_pl": "Scrolls of Ogre's Strength" }, "description": "You gain the strength of an ogre.", "use_action": { "type": "learn_spell", "spells": [ "ogres_strength" ] } }, @@ -470,7 +470,7 @@ "type": "GENERIC", "copy-from": "spell_scroll", "id": "spell_scroll_foxs_cunning", - "name": "Scroll of Fox's Cunning", + "name": { "str": "Scroll of Fox's Cunning", "str_pl": "Scrolls of Fox's Cunning" }, "description": "You become wily like a fox.", "use_action": { "type": "learn_spell", "spells": [ "foxs_cunning" ] } }, @@ -478,7 +478,7 @@ "type": "GENERIC", "copy-from": "spell_scroll", "id": "spell_scroll_jolt", - "name": "Scroll of Jolt", + "name": { "str": "Scroll of Jolt", "str_pl": "Scrolls of Jolt" }, "description": "A short-ranged fan of electricity shoots from your fingers.", "use_action": { "type": "learn_spell", "spells": [ "jolt" ] } }, @@ -486,7 +486,7 @@ "type": "GENERIC", "copy-from": "spell_scroll", "id": "spell_scroll_lightning_bolt", - "name": "Scroll of Lightning Bolt", + "name": { "str": "Scroll of Lightning Bolt", "str_pl": "Scrolls of Lightning Bolt" }, "description": "The goto spell for many Stormshapers, this iconic spell does just what you expect: you shoot lightning from your fingertips. However, this lightning is more directed than most lightning, and travels in a line through most non-solid targets.", "use_action": { "type": "learn_spell", "spells": [ "lightning_bolt" ] } }, @@ -494,7 +494,7 @@ "type": "GENERIC", "copy-from": "spell_scroll", "id": "spell_scroll_windstrike", - "name": "Scroll of Windstrike", + "name": { "str": "Scroll of Windstrike", "str_pl": "Scrolls of Windstrike" }, "description": "A powerful blast of wind slams into anything in front of your outstretched hand.", "use_action": { "type": "learn_spell", "spells": [ "windstrike" ] } }, @@ -502,7 +502,7 @@ "type": "GENERIC", "copy-from": "spell_scroll", "id": "spell_scroll_windrun", - "name": "Scroll of Windrunning", + "name": { "str": "Scroll of Windrunning", "str_pl": "Scrolls of Windrunning" }, "description": "A magical wind pushes you forward as you move, easing your movements and increasing speed.", "use_action": { "type": "learn_spell", "spells": [ "windrun" ] } }, @@ -510,7 +510,7 @@ "type": "GENERIC", "copy-from": "spell_scroll", "id": "spell_scroll_storm_hammer", - "name": "Scroll of Call Stormhammer", + "name": { "str": "Scroll of Call Stormhammer", "str_pl": "Scrolls of Call Stormhammer" }, "description": "Creates a crackling magical warhammer full of lightning to smite your foes with, and of course, smash things to bits!", "use_action": { "type": "learn_spell", "spells": [ "storm_hammer" ] } }, @@ -518,7 +518,7 @@ "type": "GENERIC", "copy-from": "spell_scroll", "id": "spell_scroll_bless", - "name": "Scroll of Bless", + "name": { "str": "Scroll of Bless", "str_pl": "Scrolls of Bless" }, "description": "A spell of blessing that gives you energy and boosts your abilities.", "use_action": { "type": "learn_spell", "spells": [ "bless" ] } }, @@ -526,7 +526,7 @@ "type": "GENERIC", "copy-from": "spell_scroll", "id": "spell_scroll_holy_blade", - "name": "Scroll of Holy Blade", + "name": { "str": "Scroll of Holy Blade", "str_pl": "Scrolls of Holy Blade" }, "description": "This blade of light will cut through any evil it makes contact with!", "use_action": { "type": "learn_spell", "spells": [ "holy_blade" ] } }, @@ -534,7 +534,7 @@ "type": "GENERIC", "copy-from": "spell_scroll", "id": "spell_scroll_spirit_armor", - "name": "Scroll of Spiritual Armor", + "name": { "str": "Scroll of Spiritual Armor", "str_pl": "Scrolls of Spiritual Armor" }, "description": "Evil will not make it through your defenses if your faith is strong enough!", "use_action": { "type": "learn_spell", "spells": [ "spirit_armor" ] } }, @@ -542,7 +542,7 @@ "type": "GENERIC", "copy-from": "spell_scroll", "id": "spell_scroll_create_atomic_lamp", - "name": "Scroll of Lamp", + "name": { "str": "Scroll of Lamp", "str_pl": "Scrolls of Lamp" }, "description": "Creates a magical lamp.", "use_action": { "type": "learn_spell", "spells": [ "create_atomic_lamp" ] } }, @@ -550,7 +550,7 @@ "type": "GENERIC", "copy-from": "spell_scroll", "id": "spell_scroll_recover_bionic_power", - "name": "Scroll of Manatricity", + "name": { "str": "Scroll of Manatricity", "str_pl": "Scrolls of Manatricity" }, "description": "You have found a way to convert your spiritual energy into power you can use for your bionics.", "use_action": { "type": "learn_spell", "spells": [ "recover_bionic_power" ] } }, @@ -558,7 +558,7 @@ "type": "GENERIC", "copy-from": "spell_scroll", "id": "spell_scroll_taze", - "name": "Scroll of Taze", + "name": { "str": "Scroll of Taze", "str_pl": "Scrolls of Taze" }, "description": "This spell creates a very short range bolt of electricity to shock your foes.", "use_action": { "type": "learn_spell", "spells": [ "taze" ] } }, @@ -566,7 +566,7 @@ "type": "GENERIC", "copy-from": "spell_scroll", "id": "spell_scroll_quantum_tunnel_lesser", - "name": "Scroll of Lesser Quantum Tunnel", + "name": { "str": "Scroll of Lesser Quantum Tunnel", "str_pl": "Scrolls of Lesser Quantum Tunnel" }, "description": "This spell manipulates some quantum something or other to tunnel you through a short distance of space, and even matter, unfortunately there's that whole uncertainty thing as to where you come out. It leaves you a little dazed on the other side as you reorient yourself.", "use_action": { "type": "learn_spell", "spells": [ "quantum_tunnel_lesser" ] } }, @@ -574,7 +574,7 @@ "type": "GENERIC", "copy-from": "spell_scroll", "id": "spell_scroll_synaptic_stimulation", - "name": "Scroll of Synaptic Stimulation", + "name": { "str": "Scroll of Synaptic Stimulation", "str_pl": "Scrolls of Synaptic Stimulation" }, "description": "This spell stimulates the synapses in your brain beyond normal processing speeds, giving you a large boost in mental processing capability, including enhancing your reflexes, speed, and raw intellectual power. Use responsibly!", "use_action": { "type": "learn_spell", "spells": [ "synaptic_stimulation" ] } }, @@ -582,7 +582,7 @@ "type": "GENERIC", "copy-from": "spell_scroll", "id": "spell_scroll_laze", - "name": "Scroll of Laze", + "name": { "str": "Scroll of Laze", "str_pl": "Scrolls of Laze" }, "description": "You concentrate and release a focused beam of photons at a target, also known as a laser.", "use_action": { "type": "learn_spell", "spells": [ "laze" ] } }, @@ -590,7 +590,7 @@ "type": "GENERIC", "copy-from": "spell_scroll", "id": "spell_scroll_animated_blade", - "name": "Scroll of Animated Blade", + "name": { "str": "Scroll of Animated Blade", "str_pl": "Scrolls of Animated Blade" }, "description": "This spell conjures flying animated blades that will cut your enemies down to size. Into small pieces that is.", "use_action": { "type": "learn_spell", "spells": [ "animated_blade" ] } }, @@ -598,7 +598,7 @@ "type": "GENERIC", "copy-from": "spell_scroll", "id": "spell_scroll_mirror_image", - "name": "Scroll of Mirror Image", + "name": { "str": "Scroll of Mirror Image", "str_pl": "Scrolls of Mirror Image" }, "description": "This spell manipulates light into barely tangible duplicates of a living being, a magical hologram in short.", "use_action": { "type": "learn_spell", "spells": [ "mirror_image" ] } }, @@ -606,7 +606,7 @@ "type": "GENERIC", "copy-from": "spell_scroll", "id": "spell_scroll_lightning_blast", - "name": "Scroll of Lightning Blast", + "name": { "str": "Scroll of Lightning Blast", "str_pl": "Scrolls of Lightning Blast" }, "description": "You fire a small concentrated ball of lightning at the target. The electricity diffuses quickly, so it doesn't do much damage, but you're able to fire off several quick ones in a row.", "use_action": { "type": "learn_spell", "spells": [ "lightning_blast" ] } }, @@ -614,7 +614,7 @@ "type": "GENERIC", "copy-from": "spell_scroll", "id": "spell_scroll_necrotic_gaze", - "name": "Scroll of Necrotic Gaze", + "name": { "str": "Scroll of Necrotic Gaze", "str_pl": "Scrolls of Necrotic Gaze" }, "description": "You use the power of your own blood to imbue necrotic energy into your gaze, damaging the target you look at.", "use_action": { "type": "learn_spell", "spells": [ "necrotic_gaze" ] } }, @@ -622,7 +622,7 @@ "type": "GENERIC", "copy-from": "spell_scroll", "id": "spell_scroll_purification_seed", - "name": "Scroll of Purification Seed", + "name": { "str": "Scroll of Purification Seed", "str_pl": "Scrolls of Purification Seed" }, "description": "You summon a gift of the earth which will purify water. Greater levels yield greater numbers of seeds.", "use_action": { "type": "learn_spell", "spells": [ "purify_seed" ] } }, @@ -630,7 +630,7 @@ "type": "GENERIC", "copy-from": "spell_scroll", "id": "spell_scroll_x-ray", - "name": "Scroll of X-ray Vision", + "name": { "str": "Scroll of X-ray Vision", "str_pl": "Scrolls of X-ray Vision" }, "description": "You fire a cone of X-rays that magically allow you to see that area for a short time.", "use_action": { "type": "learn_spell", "spells": [ "x-ray" ] } }, @@ -638,7 +638,7 @@ "type": "GENERIC", "copy-from": "spell_scroll", "id": "spell_scroll_clairvoyance", - "name": "Scroll of Clairvoyance", + "name": { "str": "Scroll of Clairvoyance", "str_pl": "Scrolls of Clairvoyance" }, "description": "You close your eyes and the earth surrenders its secrets to you.", "use_action": { "type": "learn_spell", "spells": [ "clairvoyance" ] } }, @@ -646,7 +646,7 @@ "type": "GENERIC", "copy-from": "spell_scroll", "id": "spell_scroll_lava_bomb", - "name": "Scroll of Lava Bomb", + "name": { "str": "Scroll of Lava Bomb", "str_pl": "Scrolls of Lava Bomb" }, "description": "You tear up the ground beneath you to fire a lava bomb: a globe of lava surrounded by hot, solid rock. It shatters upon impact, spraying shards of rock and lava everywhere.", "use_action": { "type": "learn_spell", "spells": [ "lava_bomb_main" ] } }, @@ -654,8 +654,20 @@ "type": "GENERIC", "copy-from": "spell_scroll", "id": "spell_scroll_acid_resistance", - "name": "Scroll of Acid Resistance", + "name": { "str": "Scroll of Acid Resistance", "str_pl": "Scrolls of Acid Resistance" }, "description": "This spell creates an invisible aura to protect you from acid.", "use_action": { "type": "learn_spell", "spells": [ "acid_resistance" ] } + }, + { + "id": "lightning_storm_scroll", + "type": "GENERIC", + "name": { "str": "Scroll of Lightning Storm", "str_pl": "Scrolls of Lightning Storm" }, + "description": "This scroll details how a spell called 'Lightning Blast' which is commonly used among Stormshapers can be altered to become much more powerful, at a much higher mana cost.", + "weight": "129 g", + "volume": "500 ml", + "price": 25000, + "symbol": "?", + "color": "light_blue", + "use_action": { "type": "learn_spell", "spells": [ "lightning_storm" ] } } ] diff --git a/data/mods/Magiclysm/items/spellbooks.json b/data/mods/Magiclysm/items/spellbooks.json index 9e5f02d147d4f..dfd7d15439f14 100644 --- a/data/mods/Magiclysm/items/spellbooks.json +++ b/data/mods/Magiclysm/items/spellbooks.json @@ -2,7 +2,7 @@ { "id": "DEBUG_spellbook", "type": "GENERIC", - "name": "A Technomancer's Guide to Debugging C:DDA", + "name": { "str": "A Technomancer's Guide to Debugging C:DDA", "str_pl": "copies of A Technomancer's Guide to Debugging C:DDA" }, "description": "static std::string description( spell sp ) const;", "weight": "1 g", "volume": "1 ml", @@ -29,7 +29,7 @@ { "id": "wizard_beginner", "type": "GENERIC", - "name": "A Beginner's Guide to Magic", + "name": { "str": "A Beginner's Guide to Magic", "str_pl": "copies of A Beginner's Guide to Magic" }, "description": "You would describe this as more like a pamphlet than a spellbook, but it seems to have at least one interesting spell you can use.", "weight": "585 g", "volume": "250 ml", @@ -41,7 +41,7 @@ { "id": "wizard_utility", "type": "GENERIC", - "name": "Wizarding Guide to Backpacking", + "name": { "str": "Wizarding Guide to Backpacking", "str_pl": "copies of Wizarding Guide to Backpacking" }, "description": "This appears to be the spell version of a guide for what things to take with you when backpacking. It's a little bulky, but will certainly prove useful.", "weight": "1 kg", "volume": "1250 ml", @@ -53,7 +53,7 @@ { "id": "pyro", "type": "GENERIC", - "name": "Pyromancy for Heretics", + "name": { "str": "Pyromancy for Heretics", "str_pl": "copies of Pyromancy for Heretics" }, "description": "This charred husk of a book still contains many ways to light things aflame.", "weight": "450 g", "volume": "1 L", @@ -65,7 +65,7 @@ { "id": "wizard_advanced", "type": "GENERIC", - "name": "A Treatise on Magical Elements", + "name": { "str": "A Treatise on Magical Elements", "str_pl": "copies of A Treatise on Magical Elements" }, "description": "This details complex diagrams, rituals, and choreography that describes various spells.", "weight": "920 g", "volume": "750 ml", @@ -77,7 +77,7 @@ { "id": "priest_beginner", "type": "GENERIC", - "name": "Introduction to the Divine", + "name": { "str": "Introduction to the Divine", "str_pl": "copies of Introduction to the Divine" }, "description": "This appears to mostly be a religious text, but it does have some notes on healing.", "weight": "585 g", "volume": "500 ml", @@ -89,7 +89,10 @@ { "id": "priest_advanced", "type": "GENERIC", - "name": "The Paladin's Guide to Modern Spellcasting", + "name": { + "str": "The Paladin's Guide to Modern Spellcasting", + "str_pl": "copies of The Paladin's Guide to Modern Spellcasting" + }, "description": "Despite the title, this seems to be written in Middle English. A little obtuse, but you can make out most of the words well enough.", "weight": "830 g", "volume": "750 ml", @@ -101,7 +104,7 @@ { "id": "winter_grasp", "type": "GENERIC", - "name": "Winter's Eternal Grasp", + "name": { "str": "Winter's Eternal Grasp", "str_pl": "copies of Winter's Eternal Grasp" }, "description": "This slim book almost seems to be made from ice, it's cold to the touch.", "weight": "450 g", "volume": "1 L", @@ -113,7 +116,7 @@ { "id": "tome_of_storms", "type": "GENERIC", - "name": "The Tome of The Oncoming Storm", + "name": { "str": "The Tome of The Oncoming Storm", "str_pl": "copies of The Tome of The Oncoming Storm" }, "description": "A large book embossed with crossed lightning bolts and storm clouds, it tingles to the touch.", "weight": "430 g", "volume": "750 ml", @@ -125,22 +128,10 @@ "spells": [ "jolt", "windstrike", "windrun", "storm_hammer", "lightning_bolt", "lightning_blast" ] } }, - { - "id": "lightning_storm_scroll", - "type": "GENERIC", - "name": "Scroll of Lightning Storm", - "description": "This scroll details how a spell called 'Lightning Blast' which is commonly used among Stormshapers can be altered to become much more powerful, at a much higher mana cost.", - "weight": "129 g", - "volume": "500 ml", - "price": 25000, - "symbol": "?", - "color": "light_blue", - "use_action": { "type": "learn_spell", "spells": [ "lightning_storm" ] } - }, { "id": "generic_spellbook", "type": "GENERIC", - "name": "Nondescript Spellbook", + "name": { "str": "Nondescript Spellbook", "str_pl": "copies of Nondescript Spellbook" }, "description": "A small book, containing spells created by a novice magician.", "weight": "355 g", "volume": "500 ml", @@ -151,7 +142,7 @@ { "id": "light_manipulation_spellbook", "type": "GENERIC", - "name": "Of Light and Falsehoods", + "name": { "str": "Of Light and Falsehoods", "str_pl": "copies of Of Light and Falsehoods" }, "description": "A small white book, it subtly amplifies the ambient light around it.", "weight": "430 g", "volume": "750 ml", @@ -166,7 +157,7 @@ { "id": "biomancer_spellbook", "type": "GENERIC", - "name": "The Tome of Flesh", + "name": { "str": "The Tome of Flesh", "str_pl": "copies of The Tome of Flesh" }, "description": "A small tome, seemingly covered in tanned human skin.", "weight": "355 g", "volume": "500 ml", @@ -180,7 +171,7 @@ { "id": "druid_spellbook", "type": "GENERIC", - "name": "The Book of Trees", + "name": { "str": "The Book of Trees", "str_pl": "copies of The Book of Trees" }, "description": "A bark covered book.", "weight": "355 g", "volume": "500 ml", @@ -191,7 +182,7 @@ { "id": "recovery_spellbook", "type": "GENERIC", - "name": "The Utility of Mana as an Energy Source", + "name": { "str": "The Utility of Mana as an Energy Source", "str_pl": "copies of The Utility of Mana as an Energy Source" }, "description": "This book details spells that use your mana to recover various physiological effects.", "weight": "728 g", "volume": "3 L", @@ -205,7 +196,7 @@ { "id": "magus_spellbook", "type": "GENERIC", - "name": "The Tome of The Battle Mage", + "name": { "str": "The Tome of The Battle Mage", "str_pl": "copies of The Tome of The Battle Mage" }, "description": "Your standard wizardy looking spellbook, filled with Magus combat spells. You sure lucked out!", "weight": "434 g", "volume": "750 ml", @@ -216,7 +207,7 @@ { "id": "eshaper_spellbook", "type": "GENERIC", - "name": "The Tome of the Hollow Earth", + "name": { "str": "The Tome of the Hollow Earth", "str_pl": "copies of The Tome of the Hollow Earth" }, "description": "This large dusty spellbook seems perpetually, well, dusty. It contains the power of the earth.", "weight": "483 g", "volume": "825 ml", @@ -230,7 +221,7 @@ { "id": "magus_spellbook_move", "type": "GENERIC", - "name": "The Tome of Magical Movement", + "name": { "str": "The Tome of Magical Movement", "str_pl": "copies of 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 g", "volume": "500 ml", @@ -252,7 +243,7 @@ { "id": "summon_undead_spellbook", "type": "GENERIC", - "name": "Necromantic Minions for Dummies", + "name": { "str": "Necromantic Minions for Dummies", "str_pl": "copies of 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 g", "volume": "2250 ml", @@ -263,7 +254,7 @@ { "id": "techno_fundamentals", "type": "GENERIC", - "name": "Fundamentals of Technomancy", + "name": { "str": "Fundamentals of Technomancy", "str_pl": "copies of Fundamentals of Technomancy" }, "description": "This thick manual instructs the spellcaster on manipulating and empowering various forms of matter and energy.", "weight": "258 g", "volume": "750 ml", @@ -274,7 +265,7 @@ { "id": "techno_idiots", "type": "GENERIC", - "name": "Complete Idiot's Guide to Technomancy", + "name": { "str": "Complete Idiot's Guide to Technomancy", "str_pl": "copies of Complete Idiot's Guide to Technomancy" }, "description": "This colorful guide, full of diagrams and cartoons, teaches a couple of very basic Technomancy spells for the not-so-bright pupils.", "weight": "211 g", "volume": "500 ml", @@ -285,7 +276,10 @@ { "id": "techno_em", "type": "GENERIC", - "name": "Technomancy and the Electromagnetic Spectrum", + "name": { + "str": "Technomancy and the Electromagnetic Spectrum", + "str_pl": "copies of Technomancy and the Electromagnetic Spectrum" + }, "description": "This lab reference material book is thick and overflowing with information on combining magic with EM radiation.", "weight": "284 g", "volume": "1 L", @@ -296,7 +290,7 @@ { "id": "translocate_spellbook", "type": "GENERIC", - "name": "Geospatial Systems: The Lie Of Linearity", + "name": { "str": "Geospatial Systems: The Lie Of Linearity", "str_pl": "copies of Geospatial Systems: The Lie Of Linearity" }, "description": "This book outlines in great detail how time and space are wibbly-wobbly and non-Euclidean. It also appears to have a dozen different coordinate systems that it uses nearly interchangeably, which makes it hard to follow. There's lots of jargon, but with intense study you can probably learn a thing or two about portals.", "weight": "1200 g", "volume": "2500 ml", @@ -307,7 +301,7 @@ { "id": "stat_up_spellbook", "type": "GENERIC", - "name": "Transcendence of the Human Condition", + "name": { "str": "Transcendence of the Human Condition", "str_pl": "copies of Transcendence of the Human Condition" }, "description": "The Human is the only creature that seeks to improve himself. This study examines different spells that can heighten various senses temporarily, in hopes to discover a more permanent solution.", "weight": "1300 g", "volume": "2500 ml", diff --git a/data/mods/Magiclysm/materials.json b/data/mods/Magiclysm/materials.json index b66e3b81aa344..6fd108288441b 100644 --- a/data/mods/Magiclysm/materials.json +++ b/data/mods/Magiclysm/materials.json @@ -39,6 +39,29 @@ "bash_dmg_verb": "cracked", "cut_dmg_verb": "chipped" }, + { + "type": "material", + "ident": "demon_chitin", + "name": "Demon Chitin", + "density": 15, + "specific_heat_liquid": 4.186, + "specific_heat_solid": 2.108, + "latent_heat": 333, + "bash_resist": 1, + "cut_resist": 10, + "acid_resist": 3, + "fire_resist": 18, + "elec_resist": 2, + "chip_resist": 10, + "dmg_adj": [ "scratched", "cut", "cracked", "shattered" ], + "bash_dmg_verb": "cracked", + "cut_dmg_verb": "chipped", + "burn_data": [ + { "fuel": 0, "smoke": 1, "burn": 1, "volume_per_turn": "1250 ml" }, + { "fuel": 1, "smoke": 3, "burn": 1 }, + { "fuel": 1, "smoke": 5, "burn": 5 } + ] + }, { "type": "material", "ident": "orichalcum_metal", diff --git a/data/mods/Magiclysm/monsters/demon_spider.json b/data/mods/Magiclysm/monsters/demon_spider.json index ebcae1cd23a11..b3039f5219060 100644 --- a/data/mods/Magiclysm/monsters/demon_spider.json +++ b/data/mods/Magiclysm/monsters/demon_spider.json @@ -4,17 +4,6 @@ "id": "DEMON_SPIDER", "anger_triggers": [ "FRIEND_DIED", "HURT", "PLAYER_CLOSE", "PLAYER_WEAK" ] }, - { - "id": "demon_spider", - "type": "harvest", - "entries": [ - { "drop": "meat_tainted", "type": "flesh", "mass_ratio": 0.1 }, - { "drop": "meat", "type": "flesh", "mass_ratio": 0.05 }, - { "drop": "demon_chitin_piece", "type": "bone", "mass_ratio": 0.04 }, - { "drop": "demon_chitin_plate", "type": "skin", "mass_ratio": 0.01 }, - { "drop": "demon_spider_fang", "base_num": [ 0, 0 ], "scale_num": [ 0.1, 0.6 ], "max": 2, "type": "flesh" } - ] - }, { "id": "demon_spider_queen", "type": "harvest", @@ -32,76 +21,6 @@ "name": "demon_spider", "base_faction": "spider" }, - { - "type": "material", - "ident": "demon_chitin", - "name": "Demon Chitin", - "density": 15, - "specific_heat_liquid": 4.186, - "specific_heat_solid": 2.108, - "latent_heat": 333, - "bash_resist": 1, - "cut_resist": 10, - "acid_resist": 3, - "fire_resist": 18, - "elec_resist": 2, - "chip_resist": 10, - "dmg_adj": [ "scratched", "cut", "cracked", "shattered" ], - "bash_dmg_verb": "cracked", - "cut_dmg_verb": "chipped", - "burn_data": [ - { "fuel": 0, "smoke": 1, "burn": 1, "volume_per_turn": "1250 ml" }, - { "fuel": 1, "smoke": 3, "burn": 1 }, - { "fuel": 1, "smoke": 5, "burn": 5 } - ] - }, - { - "type": "GENERIC", - "id": "demon_chitin_piece", - "category": "spare_parts", - "symbol": ",", - "color": "red", - "name": "chunk of demon chitin", - "name_plural": "chunks of demon chitin", - "description": "A piece of demon spider exoskeleton. It is light and very durable, and probably has some magical properties.", - "price": 0, - "material": "demon_chitin", - "weight": "89 g", - "volume": "250 ml", - "bashing": 1, - "flags": [ "TRADER_AVOID" ], - "to_hit": -2 - }, - { - "type": "GENERIC", - "id": "demon_chitin_plate", - "category": "spare_parts", - "symbol": "/", - "color": "red", - "name": "demon chitin plate", - "price": 15225, - "material": "demon_chitin", - "weight": "10 kg", - "volume": "4 L", - "bashing": 12, - "to_hit": -4, - "description": "A large piece of demon spider exoskeleton, painstakingly cut from the corpse of an adult demon spider. A plate of this size can be used to create armor plating." - }, - { - "type": "GENERIC", - "id": "demon_spider_fang", - "name": "demon spider fang", - "description": "A fang from a demon spider. It seems to still drip with poison; you might be able to use this in some alchemical recipe?", - "weight": "270 g", - "to_hit": -2, - "color": "green", - "symbol": ",", - "material": [ "flesh" ], - "volume": "250 ml", - "cutting": 8, - "flags": [ "SPEAR", "SHEATH_KNIFE" ], - "price": 1500 - }, { "id": "mon_demon_spiderling", "type": "MONSTER", @@ -174,39 +93,6 @@ "death_function": [ "NORMAL" ], "flags": [ "SEES", "SMELLS", "HEARS", "VENOM", "WEBWALK", "CLIMBS", "HARDTOSHOOT", "PUSH_MON" ] }, - { - "type": "SPELL", - "id": "mon_demon_fireball", - "name": "Demon Fireball", - "description": "This is a monster only spell.", - "valid_targets": [ "hostile", "ground", "ally", "self" ], - "min_damage": 15, - "max_damage": 15, - "min_range": 12, - "max_range": 12, - "min_aoe": 2, - "max_aoe": 2, - "base_casting_time": 120, - "effect": "projectile_attack", - "damage_type": "fire" - }, - { - "type": "SPELL", - "id": "mon_summon_demon_spiderlings", - "name": "Summon Demon Spiderlings", - "description": "Summons 4 permanent demon spiderlings.", - "flags": [ "HOSTILE_SUMMON", "PERMANENT" ], - "valid_targets": [ "ground" ], - "min_damage": 4, - "max_damage": 4, - "min_range": 5, - "max_range": 5, - "min_aoe": 3, - "max_aoe": 3, - "base_casting_time": 160, - "effect": "summon", - "effect_str": "mon_demon_spiderling" - }, { "id": "mon_demon_spider_queen", "type": "MONSTER", diff --git a/data/mods/Modular_Turrets/items.json b/data/mods/Modular_Turrets/items.json index e2acab25e34ce..9dce49a7fd94b 100644 --- a/data/mods/Modular_Turrets/items.json +++ b/data/mods/Modular_Turrets/items.json @@ -194,7 +194,6 @@ "use_action": { "type": "place_monster", "monster_id": "mon_turret_disarmed", - "use_message": "Error. No weapon systems found.", "difficulty": 4, "moves": 100, "skill1": "electronics", @@ -213,7 +212,6 @@ "use_action": { "type": "place_monster", "monster_id": "mon_milturret_disarmed", - "use_message": "Error. No weapon systems found.", "difficulty": 5, "moves": 100, "skill1": "electronics", @@ -232,7 +230,6 @@ "use_action": { "type": "place_monster", "monster_id": "mon_advturret_disarmed", - "use_message": "Error. No weapon systems found.", "difficulty": 6, "moves": 100, "skill1": "electronics", diff --git a/data/mods/Modular_Turrets/monster.json b/data/mods/Modular_Turrets/monster.json index e927121adc646..4e27c2f7c4b28 100644 --- a/data/mods/Modular_Turrets/monster.json +++ b/data/mods/Modular_Turrets/monster.json @@ -5,7 +5,8 @@ "name": "automated turret", "default_faction": "defense_bot", "species": [ "ROBOT" ], - "size": "SMALL", + "volume": "30000 ml", + "weight": "40750 g", "hp": 30, "speed": 100, "material": [ "steel" ], diff --git a/data/mods/Modular_Turrets/monster_override.json b/data/mods/Modular_Turrets/monster_override.json index db549d4e9b2a2..229fe875507a2 100644 --- a/data/mods/Modular_Turrets/monster_override.json +++ b/data/mods/Modular_Turrets/monster_override.json @@ -30,7 +30,8 @@ "description": "One of the many models of utility robot formerly in use by government agencies, private corporations, and civilians alike.", "default_faction": "utility_bot", "species": [ "ROBOT" ], - "size": "MEDIUM", + "volume": "62500 ml", + "weight": "81500 g", "hp": 120, "speed": 70, "material": [ "steel" ], @@ -57,7 +58,8 @@ "default_faction": "cop_bot", "species": [ "ROBOT" ], "diff": 2, - "size": "SMALL", + "volume": "30000 ml", + "weight": "40750 g", "hp": 20, "speed": 120, "material": [ "steel" ], @@ -85,7 +87,8 @@ "default_faction": "defense_bot", "species": [ "ROBOT" ], "diff": 2, - "size": "SMALL", + "volume": "30000 ml", + "weight": "40750 g", "hp": 40, "speed": 130, "material": [ "steel" ], @@ -114,7 +117,8 @@ "default_faction": "cop_bot", "species": [ "ROBOT" ], "diff": 10, - "size": "MEDIUM", + "volume": "62500 ml", + "weight": "81500 g", "hp": 80, "speed": 100, "material": [ "steel" ], diff --git a/data/mods/More_Locations/captive_faction/TALK_CAPTIVE.json b/data/mods/More_Locations/captive_faction/TALK_CAPTIVE.json index fdc393077e62d..707eba10e73ae 100644 --- a/data/mods/More_Locations/captive_faction/TALK_CAPTIVE.json +++ b/data/mods/More_Locations/captive_faction/TALK_CAPTIVE.json @@ -6,7 +6,7 @@ "dynamic_line": "Are you part of the rescue team?", "responses": [ { "text": "Sorry, , the rescue has been delayed.", "topic": "TALK_DONE" }, - { "text": "Part? I AM the rescue team.", "topic": "TALK_CAPTIVE_FREE" } + { "text": "Part? I AM the rescue team.", "topic": "TALK_CAPTIVE_FREE" } ] }, { diff --git a/data/mods/More_Locations/factions.json b/data/mods/More_Locations/factions.json index eae14fa003326..e8105bb5168ec 100644 --- a/data/mods/More_Locations/factions.json +++ b/data/mods/More_Locations/factions.json @@ -10,7 +10,7 @@ "power": 1, "food_supply": 0, "wealth": 0, - "description": "These are hapless survivors who have been captured by raiders, slavers, mutants, or worse. Without your help, the remainder of their lives will be short and gruesome." + "description": "These are hapless survivors who have been captured by raiders, slavers, mutants, or worse. Without your help, the remainder of their lives will be short and gruesome." }, { "type": "faction", @@ -23,6 +23,6 @@ "power": 10, "food_supply": 1000, "wealth": 1000, - "description": "The scattered remnants of civilization, these lucky few managed to barricade themselves inside during the earliest stages of the Cataclysm. Although temporarily secure, they are short on supplies and lack the skills to obtain more. It's only a matter of time before they too become the prey of otherwordly creatures, or of all-too-human monsters." + "description": "The scattered remnants of civilization, these lucky few managed to barricade themselves inside during the earliest stages of the Cataclysm. Although temporarily secure, they are short on supplies and lack the skills to obtain more. It's only a matter of time before they too become the prey of otherwordly creatures, or of all-too-human monsters." } ] diff --git a/data/mods/More_Locations/snippets.json b/data/mods/More_Locations/snippets.json index ba7ecb9aab5b0..8343b27e3b9e5 100644 --- a/data/mods/More_Locations/snippets.json +++ b/data/mods/More_Locations/snippets.json @@ -47,17 +47,17 @@ { "type": "snippet", "category": "raider_grave", - "text": "Here Lies . What a Jerk." + "text": "Here Lies . What a Jerk." }, { "type": "snippet", "category": "raider_grave", - "text": " . Eaten by wolves." + "text": " . Eaten by wolves." }, { "type": "snippet", "category": "raider_grave", - "text": " . Infected." + "text": " . Infected." }, { "type": "snippet", @@ -72,67 +72,67 @@ { "type": "snippet", "category": "raider_grave", - "text": " . Roasting in Hell." + "text": " . Roasting in Hell." }, { "type": "snippet", "category": "raider_grave", - "text": " . Fallen Soldier." + "text": " . Fallen Soldier." }, { "type": "snippet", "category": "raider_grave", - "text": " . Ripped apart by a gross tentacle thing in the woods." + "text": " . Ripped apart by a gross tentacle thing in the woods." }, { "type": "snippet", "category": "raider_grave", - "text": " . Died as he lived, drunk and on fire." + "text": " . Died as he lived, drunk and on fire." }, { "type": "snippet", "category": "raider_grave", - "text": " & . Crashed their motorcycles at 120mph. Buried the pieces together." + "text": " & . Crashed their motorcycles at 120mph. Buried the pieces together." }, { "type": "snippet", "category": "raider", - "text": " . Friend, Lover, Cannibal." + "text": " . Friend, Lover, Cannibal." }, { "type": "snippet", "category": "raider_grave", - "text": " . Vaporized by Tank Bot." + "text": " . Vaporized by Tank Bot." }, { "type": "snippet", "category": "raider_grave", - "text": " . Died in his sleep. Lucky Bastard." + "text": " . Died in his sleep. Lucky Bastard." }, { "type": "snippet", "category": "raider_grave.", - "text": " Here lies . No Smoking near Molotov storage!" + "text": " Here lies . No Smoking near Molotov storage!" }, { "type": "snippet", "category": "raider_grave", - "text": " . Gunned down in his prime." + "text": " . Gunned down in his prime." }, { "type": "snippet", "category": "raider_grave", - "text": " . Drank a mystery serum and mutated to death." + "text": " . Drank a mystery serum and mutated to death." }, { "type": "snippet", "category": "raider_grave", - "text": " . We'll never see another like him." + "text": " . We'll never see another like him." }, { "type": "snippet", "category": "raider_grave", - "text": " . Done in by mutant wasps." + "text": " . Done in by mutant wasps." }, { "type": "snippet", @@ -147,7 +147,7 @@ { "type": "snippet", "category": "refugee_help", - "text": "Rooms Available. Rent Negotiable." + "text": "Rooms Available. Rent Negotiable." }, { "type": "snippet", @@ -177,12 +177,12 @@ { "type": "snippet", "category": "refugee_help", - "text": "No Power. No Food. Send Airdrops Please!" + "text": "No Power. No Food. Send Airdrops Please!" }, { "type": "snippet", "category": "refugee_help", - "text": "No more FEMA camp refugees. You're already dying." + "text": "No more FEMA camp refugees. You're already dying." }, { "type": "snippet", diff --git a/data/mods/My_Sweet_Cataclysm/sweet_items.json b/data/mods/My_Sweet_Cataclysm/sweet_items.json index 5a59653a5d2f8..74fd379c86565 100644 --- a/data/mods/My_Sweet_Cataclysm/sweet_items.json +++ b/data/mods/My_Sweet_Cataclysm/sweet_items.json @@ -3,7 +3,7 @@ "id": "sugarkin_flyer", "type": "BOOK", "name": "SugarKin flyer", - "description": "A flyer for some kind of candy. It shows a picture of a gleaming human made of smooth candy looking at you in terror. \"SugarKin the first life-size human candy! Are you a real monster? Will you be able to devour it?\"\n On the back of the flyer you can see some hastily scribbled words:\n \"Hello, my child, welcome to this world. A world where you'll be able to thrive if you follow a few rules: \n1) Never ever get into contact with water, it would melt you! \n2) Avoid humans with clear eyes they are very dangerous! (You can ignore the ones with black eyes they are harmless to you.) \n3) Learn how to make caramel ointment, it's the only way to fix your body if you get hurt.\n There are many more things I'd like to tell you but I must leave before it's too late. I've made you a friend to keep you company, be kind to it. \n I love you,\n - F. \".", + "description": "A flyer for some kind of candy. It shows a picture of a gleaming human made of smooth candy looking at you in terror. \"SugarKin the first life-size human candy! Are you a real monster? Will you be able to devour it?\"\n On the back of the flyer you can see some hastily scribbled words:\n \"Hello, my child, welcome to this world. A world where you'll be able to thrive if you follow a few rules:\n1) Never ever get into contact with water, it would melt you!\n2) Avoid humans with clear eyes they are very dangerous! (You can ignore the ones with black eyes they are harmless to you.)\n3) Learn how to make caramel ointment, it's the only way to fix your body if you get hurt.\n There are many more things I'd like to tell you but I must leave before it's too late. I've made you a friend to keep you company, be kind to it.\n I love you,\n - F. \".", "weight": "3 g", "volume": 0, "price": 0, diff --git a/data/mods/NW_Pack/nw_books.json b/data/mods/NW_Pack/nw_books.json index 196d3265e47e9..b374f6e1c9eb2 100644 --- a/data/mods/NW_Pack/nw_books.json +++ b/data/mods/NW_Pack/nw_books.json @@ -2,8 +2,7 @@ { "type": "BOOK", "id": "book_asgard", - "name": "The Weapons of Asgard", - "name_plural": "The Weapons of Asgard", + "name": { "str": "The Weapons of Asgard", "str_pl": "copies of The Weapons of Asgard" }, "max_level": 10, "description": "This book is about creating replicas of the weapons used by the Norse Gods, such as the well-known Mjölnir. It is well illustrated with lots of pictures.", "weight": "654 g", diff --git a/data/mods/National_Guard_Camp/military.json b/data/mods/National_Guard_Camp/military.json index 806a1375bb8b9..3161a47cd4278 100644 --- a/data/mods/National_Guard_Camp/military.json +++ b/data/mods/National_Guard_Camp/military.json @@ -7,7 +7,8 @@ "default_faction": "military", "species": [ "ROBOT" ], "diff": 20, - "size": "MEDIUM", + "volume": "62500 ml", + "weight": "81500 g", "hp": 50, "speed": 90, "material": [ "steel" ], diff --git a/data/mods/Salvaged_Robots/corpses.json b/data/mods/Salvaged_Robots/corpses.json index 72d866dc13acf..920c4317c40ce 100644 --- a/data/mods/Salvaged_Robots/corpses.json +++ b/data/mods/Salvaged_Robots/corpses.json @@ -45,7 +45,7 @@ "symbol": ",", "color": "light_gray", "looks_like": "broken_tribot", - "name": "dead craftbuddy", + "name": { "str": "dead craftbuddy", "str_pl": "dead craftbuddies" }, "category": "other", "description": "A broken repair robot, now limp and unmoving. Could be gutted for parts or re-crafted into a functioning pal.", "material": [ "steel", "plastic" ], @@ -513,7 +513,7 @@ "id": "broken_advbot_glitter", "copy-from": "broken_advbot_disarmed", "color": "yellow", - "name": "broken glittering lady", + "name": { "str": "broken glittering lady", "str_pl": "broken glittering ladies" }, "description": "A broken salvaged robot. Could be stripped or recrafted." }, { diff --git a/data/mods/Salvaged_Robots/items.json b/data/mods/Salvaged_Robots/items.json index cd8337200ddcf..59f3a738993a0 100644 --- a/data/mods/Salvaged_Robots/items.json +++ b/data/mods/Salvaged_Robots/items.json @@ -62,8 +62,7 @@ { "id": "textbook_robots", "type": "BOOK", - "name": "Hacking Robots for Fun & Profit", - "name_plural": "Hacking Robots for Fun & Profit", + "name": { "str": "Hacking Robots for Fun & Profit", "str_pl": "copies of Hacking Robots for Fun & Profit" }, "description": "A book on illegally obtaining, reprogramming, and modifying robots. It has lots of helpful step-by-step guides and example blueprints.", "weight": "2063 g", "volume": "2 L", @@ -83,8 +82,7 @@ { "id": "mag_robotics", "type": "BOOK", - "name": "Popular Robotics", - "name_plural": "Popular Robotics", + "name": { "str": "Popular Robotics", "str_pl": "issues of Popular Robotics" }, "description": "A magazine about building and altering your own robots.", "weight": "45 g", "volume": "250 ml", @@ -137,7 +135,7 @@ "symbol": ";", "color": "light_gray", "looks_like": "mon_tripod", - "name": "inactive craftbuddy", + "name": { "str": "inactive craftbuddy", "str_pl": "inactive craftbuddies" }, "category": "other", "description": "A robot crafting assistant. Useable in its current state as a portable workbench, or deployable as a traveling companion.", "price": 1000000, @@ -310,7 +308,7 @@ "type": "place_monster", "monster_id": "mon_arson_hack", "friendly_msg": "The arson hack flies from your hand! Get clear!", - "hostile_msg": "You misprogram the arson hack! Run!", + "hostile_msg": "You misprogram the arson hack! Run!", "difficulty": 1, "moves": 60, "place_randomly": true, @@ -840,7 +838,7 @@ "id": "bot_advbot_glitter", "type": "TOOL", "copy-from": "bot_advbot_base", - "name": "inactive glittering lady", + "name": { "str": "inactive glittering lady", "str_pl": "inactive glittering ladies" }, "description": "A salvaged advanced robot transformed into a luminous beacon of destruction. It attacks hostile targets with its two integral lasers and blinding flashes. Activate this item to deploy the robot.", "color": "yellow", "use_action": { diff --git a/data/mods/Salvaged_Robots/monsters.json b/data/mods/Salvaged_Robots/monsters.json index 2cefef9242f74..46df1208da49c 100644 --- a/data/mods/Salvaged_Robots/monsters.json +++ b/data/mods/Salvaged_Robots/monsters.json @@ -12,7 +12,8 @@ "description": "A mobile crafting station used by workers in mines, on oil rigs, and in other remote locales. In it's active state, the craftbuddy merely follows its user. In it's deactivated state, the craft buddy is useable as a toolbench and multipurpose workstation.", "default_faction": "utility_bot", "species": [ "ROBOT" ], - "size": "SMALL", + "volume": "30000 ml", + "weight": "40750 g", "hp": 150, "armor_fire": 6, "armor_acid": 6, @@ -38,11 +39,12 @@ "id": "mon_autoarmor_base", "type": "MONSTER", "name": "automated armor", - "description": "A suit of power armor temporarily controlled by an attached AI-core. Originally intended as a way to retrieve dead or wounded operators from combat, it was more commonly used for transporting the suit itself. The AI is limited, and makes a poor combatant.", + "description": "A suit of power armor temporarily controlled by an attached AI-core. Originally intended as a way to retrieve dead or wounded operators from combat, it was more commonly used for transporting the suit itself. The AI is limited, and makes a poor combatant.", "default_faction": "military", "species": [ "ROBOT" ], "diff": 10, - "size": "LARGE", + "volume": "92500 ml", + "weight": "120 kg", "hp": 120, "speed": 100, "material": [ "superalloy", "plastic" ], @@ -150,7 +152,7 @@ "type": "MONSTER", "name": "arsonhack", "looks_like": "bot_manhack", - "description": "A salvaged drone repurposed to spread flame and cause property damage. It's almost as dangerous to its user as it is to the surroundings. The arsonhack cannot be recovered once activated. Only a reckless madman would dare to build this.", + "description": "A salvaged drone repurposed to spread flame and cause property damage. It's almost as dangerous to its user as it is to the surroundings. The arsonhack cannot be recovered once activated. Only a reckless madman would dare to build this.", "diff": 10, "speed": 250, "luminance": 5, @@ -197,7 +199,7 @@ "ammo_type": "water", "fake_skills": [ [ "gun", 2 ], [ "launcher", 2 ] ], "fake_dex": 9, - "no_ammo_sound": "drip. drip.", + "no_ammo_sound": "drip. drip.", "ranges": [ [ 0, 10, "BURST" ] ] } ] @@ -211,7 +213,8 @@ "default_faction": "cop_bot", "species": [ "ROBOT" ], "diff": 2, - "size": "SMALL", + "volume": "30000 ml", + "weight": "40750 g", "hp": 20, "speed": 120, "material": [ "steel" ], @@ -238,7 +241,7 @@ "color": "pink", "luminance": 8, "armor_fire": 10, - "description": "A salvaged eyebot repurposed into a floating space heater. It emits a constant jet of warm air to heat an enclosed space.", + "description": "A salvaged eyebot repurposed into a floating space heater. It emits a constant jet of warm air to heat an enclosed space.", "revert_to_itype": "bot_eyebot_heater", "fear_triggers": [ "HURT" ], "emit_fields": [ "emit_hot_air2_stream" ], @@ -267,7 +270,7 @@ "color": "red", "luminance": 100, "armor_fire": 12, - "description": "A salvaged eyebot refitted with a laser weapon. The lack of recoil allows the hovering robot to aim and fire without penalty. It has decent range and damage, but requires an extended recharge time between shots.", + "description": "A salvaged eyebot refitted with a laser weapon. The lack of recoil allows the hovering robot to aim and fire without penalty. It has decent range and damage, but requires an extended recharge time between shots.", "revert_to_itype": "bot_eyebot_burn", "special_attacks": [ { @@ -276,7 +279,6 @@ "gun_type": "robogun_laser", "fake_skills": [ [ "gun", 6 ], [ "rifle", 6 ] ], "fake_dex": 10, - "range": 20, "ranges": [ [ 0, 30, "DEFAULT" ] ], "require_targeting_player": true, "require_targeting_npc": true, @@ -295,7 +297,8 @@ "description": "One of the many models of utility robot formerly in use by government agencies, private corporations, and civilians alike.", "default_faction": "utility_bot", "species": [ "ROBOT" ], - "size": "MEDIUM", + "volume": "62500 ml", + "weight": "81500 g", "hp": 120, "speed": 70, "material": [ "steel" ], @@ -333,7 +336,7 @@ "type": "MONSTER", "copy-from": "mon_utilibot", "name": "construction robot", - "description": "One of the many models of construction robot formerly in use by government agencies and private corporations. It is equipped with an integrated welder, flashlight, nailgun, and jackhammer.", + "description": "One of the many models of construction robot formerly in use by government agencies and private corporations. It is equipped with an integrated welder, flashlight, nailgun, and jackhammer.", "color": "yellow", "luminance": 10, "melee_skill": 2, @@ -348,7 +351,6 @@ "gun_type": "robogun_nail", "fake_skills": [ [ "gun", 0 ], [ "pistol", 2 ] ], "fake_dex": 8, - "range": 3, "ranges": [ [ 0, 3, "BURST" ] ] } ] @@ -358,7 +360,7 @@ "type": "MONSTER", "copy-from": "mon_utilibot", "name": "firefighter robot", - "description": "One of the many models of fire-fighting robot formerly in use by local fire departments and emergency services. Designed for entering burning buildings and other situations deemed too dangerous for human firefighters.", + "description": "One of the many models of fire-fighting robot formerly in use by local fire departments and emergency services. Designed for entering burning buildings and other situations deemed too dangerous for human firefighters.", "color": "yellow", "luminance": 100, "melee_skill": 3, @@ -373,7 +375,6 @@ "gun_type": "watercannon", "fake_skills": [ [ "gun", 2 ], [ "launcher", 2 ] ], "fake_dex": 8, - "range": 5, "ranges": [ [ 0, 5, "BURST" ] ] } ], @@ -385,7 +386,7 @@ "copy-from": "mon_utilibot", "name": "blob breeder", "revert_to_itype": "bot_utilibot_blob", - "description": "A salvaged utility robot converted into a mobile incubator for the alien blob. It will intermittently release a group of living blobs. Why on Earth would you build this?", + "description": "A salvaged utility robot converted into a mobile incubator for the alien blob. It will intermittently release a group of living blobs. Why on Earth would you build this?", "armor_bash": 12, "reproduction": { "baby_monster": "mon_blob", "baby_count": 10, "baby_timer": 1 } }, @@ -404,7 +405,7 @@ "type": "MONSTER", "copy-from": "mon_utilibot", "name": "digestron", - "description": "A salvaged utility robot converted into an automated vacuum cleaner. It will suck stray items off the ground and dissolve them with its internal acid reserves. A useful helper for keeping your front lawn clean of debris… or corpses.", + "description": "A salvaged utility robot converted into an automated vacuum cleaner. It will suck stray items off the ground and dissolve them with its internal acid reserves. A useful helper for keeping your front lawn clean of debris… or corpses.", "speed": 100, "aggression": 10, "morale": 10, @@ -439,7 +440,6 @@ "fake_skills": [ [ "gun", 3 ], [ "archery", 3 ] ], "fake_dex": 8, "no_ammo_sound": "click!", - "range": 10, "ranges": [ [ 0, 10, "DEFAULT" ] ] } ], @@ -454,7 +454,8 @@ "description": "A free roaming medical robot capable of administering powerful anesthetics and performing complex surgical operations, usually in that order. Faulty bio-diagnostic programs resulted in numerous lawsuits before the Cataclysm.", "default_faction": "utility_bot", "species": [ "ROBOT" ], - "size": "MEDIUM", + "volume": "62500 ml", + "weight": "81500 g", "hp": 70, "speed": 80, "material": [ "steel", "plastic" ], @@ -482,7 +483,7 @@ "type": "MONSTER", "copy-from": "mon_medibot", "name": "assassination robot", - "description": "A salvaged medical robot repurposed into a murder machine. Its surgical tools have been replaced with a fearsome set of blades, and its hypodermic needle now delivers powerful toxins.", + "description": "A salvaged medical robot repurposed into a murder machine. Its surgical tools have been replaced with a fearsome set of blades, and its hypodermic needle now delivers powerful toxins.", "speed": 120, "color": "red", "aggression": 100, @@ -510,7 +511,7 @@ "type": "MONSTER", "copy-from": "mon_medibot", "name": "elixirator", - "description": "This doesn't work yet. Don't build it… A salvaged medibot with its internal pharma-fabricators repurposed to produce mutagen.", + "description": "This doesn't work yet. Don't build it… A salvaged medibot with its internal pharma-fabricators repurposed to produce mutagen.", "color": "light_green", "aggression": 10, "morale": 10, @@ -551,7 +552,8 @@ "default_faction": "defense_bot", "species": [ "ROBOT" ], "diff": 2, - "size": "SMALL", + "volume": "30000 ml", + "weight": "40750 g", "hp": 40, "speed": 130, "material": [ "steel" ], @@ -576,7 +578,7 @@ "type": "MONSTER", "copy-from": "mon_skitterbot", "name": "rat snatcher", - "description": "A salvaged skitterbot repurposed for hunting small game. It's faster than the original model but far less sturdy.", + "description": "A salvaged skitterbot repurposed for hunting small game. It's faster than the original model but far less sturdy.", "color": "light_gray", "speed": 250, "hp": 30, @@ -617,7 +619,7 @@ "type": "MONSTER", "copy-from": "mon_skitterbot", "name": "pest hunter", - "description": "A salvaged skitterbot refitted with an 8mm integrated firearm. The robot's small size precludes rapid fire, due to recoil, and requires the use of lightweight caseless ammo.", + "description": "A salvaged skitterbot refitted with an 8mm integrated firearm. The robot's small size precludes rapid fire, due to recoil, and requires the use of lightweight caseless ammo.", "color": "dark_gray", "aggression": 100, "speed": 200, @@ -637,7 +639,6 @@ "fake_skills": [ [ "gun", 5 ], [ "rifle", 6 ] ], "fake_dex": 10, "no_ammo_sound": "click!", - "range": 10, "ranges": [ [ 0, 10, "DEFAULT" ] ] } ] @@ -649,7 +650,8 @@ "description": "A robot body with the head of a human. All kinds of electronic wires and devices are implanted in its head. This cyborg moves erratically and has a confused and deranged look in its eyes.", "default_faction": "science", "species": [ "ROBOT" ], - "size": "MEDIUM", + "volume": "62500 ml", + "weight": "81500 g", "hp": 60, "speed": 90, "material": [ "steel" ], @@ -690,7 +692,7 @@ "type": "MONSTER", "copy-from": "mon_defbot_base", "name": "security robot", - "description": "An automated defense robot still active due to its internal power source. This one is equipped with an electric prod and an integrated shotgun.", + "description": "An automated defense robot still active due to its internal power source. This one is equipped with an electric prod and an integrated shotgun.", "melee_damage": [ { "damage_type": "electric", "amount": 6 } ], "starting_ammo": { "shot_00": 100 }, "special_attacks": [ @@ -703,7 +705,6 @@ "fake_skills": [ [ "gun", 2 ], [ "shotgun", 2 ] ], "fake_dex": 9, "no_ammo_sound": "click click!", - "range": 8, "ranges": [ [ 0, 8, "DEFAULT" ] ] } ] @@ -713,10 +714,11 @@ "type": "MONSTER", "looks_like": "mon_secubot", "name": "military robot", - "description": "A military robot still operating due to its internal power core. This one is armed with an electric prod and an integrated 5.56mm firearm.", + "description": "A military robot still operating due to its internal power core. This one is armed with an electric prod and an integrated 5.56mm firearm.", "default_faction": "military", "species": [ "ROBOT" ], - "size": "MEDIUM", + "volume": "62500 ml", + "weight": "81500 g", "hp": 80, "speed": 100, "material": [ "steel" ], @@ -764,7 +766,6 @@ "fake_skills": [ [ "gun", 4 ], [ "launcher", 4 ] ], "fake_dex": 9, "no_ammo_sound": "click!", - "range": 15, "ranges": [ [ 0, 15, "DEFAULT" ] ], "require_targeting_player": true, "require_targeting_npc": true, @@ -796,7 +797,6 @@ "fake_skills": [ [ "gun", 5 ], [ "rifle", 5 ] ], "fake_dex": 10, "no_ammo_sound": "click!", - "range": 18, "ranges": [ [ 0, 4, "BURST" ], [ 5, 8, "AUTO" ], [ 9, 16, "DEFAULT" ] ], "require_targeting_player": true, "require_targeting_npc": true, @@ -829,7 +829,6 @@ "fake_skills": [ [ "gun", 5 ], [ "rifle", 5 ] ], "fake_dex": 10, "no_ammo_sound": "click!", - "range": 20, "ranges": [ [ 0, 5, "DEFAULT" ], [ 6, 10, "BURST" ], [ 11, 20, "DEFAULT" ] ], "require_targeting_player": true, "require_targeting_npc": true, @@ -861,7 +860,6 @@ "fake_skills": [ [ "gun", 5 ], [ "rifle", 5 ] ], "fake_dex": 10, "no_ammo_sound": "click!", - "range": 20, "ranges": [ [ 0, 5, "DEFAULT" ], [ 6, 10, "BURST" ], [ 11, 20, "DEFAULT" ] ], "require_targeting_player": true, "require_targeting_npc": true, @@ -893,7 +891,6 @@ "fake_skills": [ [ "gun", 5 ], [ "rifle", 6 ] ], "fake_dex": 10, "no_ammo_sound": "whirrrr!", - "range": 24, "ranges": [ [ 0, 5, "BURST" ], [ 6, 10, "AUTO" ], [ 11, 24, "DEFAULT" ] ], "require_targeting_player": true, "require_targeting_npc": true, @@ -925,7 +922,6 @@ "fake_skills": [ [ "gun", 5 ], [ "rifle", 5 ] ], "fake_dex": 10, "no_ammo_sound": "click!", - "range": 18, "ranges": [ [ 0, 4, "BURST" ], [ 4, 8, "AUTO" ], [ 9, 16, "DEFAULT" ] ], "require_targeting_player": true, "require_targeting_npc": true, @@ -942,7 +938,7 @@ "type": "MONSTER", "copy-from": "mon_milbot_base", "name": "grenadier robot", - "description": "A military robot still operating due to its internal power core. This one is armed with an electric prod and an integrated 40mm grenade launcher.", + "description": "A military robot still operating due to its internal power core. This one is armed with an electric prod and an integrated 40mm grenade launcher.", "diff": 20, "melee_damage": [ { "damage_type": "electric", "amount": 6 } ], "color": "dark_gray_red", @@ -958,7 +954,6 @@ "fake_skills": [ [ "gun", 4 ], [ "launcher", 5 ] ], "fake_dex": 10, "no_ammo_sound": "click!", - "range": 30, "ranges": [ [ 6, 30, "DEFAULT" ] ], "require_targeting_player": true, "require_targeting_npc": true, @@ -975,7 +970,7 @@ "type": "MONSTER", "copy-from": "mon_milbot_base", "name": "military flame robot", - "description": "A military robot still operating due to its internal power core. This one is armed with an electric prod and an integrated flamethrower.", + "description": "A military robot still operating due to its internal power core. This one is armed with an electric prod and an integrated flamethrower.", "diff": 20, "melee_damage": [ { "damage_type": "electric", "amount": 6 } ], "starting_ammo": { "napalm": 200 }, @@ -989,7 +984,6 @@ "fake_skills": [ [ "gun", 4 ], [ "launcher", 5 ] ], "fake_dex": 10, "no_ammo_sound": "hiss!", - "range": 10, "ranges": [ [ 0, 10, "DEFAULT" ] ], "require_targeting_player": true, "require_targeting_npc": true, @@ -1007,7 +1001,7 @@ "copy-from": "mon_defbot_base", "looks_like": "mon_copbot", "name": "advanced robot", - "description": "An advanced robot still functioning due to its internal fusion core. This model is armed with a powerful laser-emitter.", + "description": "An advanced robot still functioning due to its internal fusion core. This model is armed with a powerful laser-emitter.", "default_faction": "science", "species": [ "ROBOT" ], "hp": 100, @@ -1027,7 +1021,7 @@ "type": "MONSTER", "copy-from": "mon_advbot_base", "name": "laser-emitting robot", - "description": "An advanced robot still functioning due to its internal fusion core. This model is furnished with a powerful laser-emitter.", + "description": "An advanced robot still functioning due to its internal fusion core. This model is furnished with a powerful laser-emitter.", "diff": 20, "luminance": 120, "special_attacks": [ @@ -1038,7 +1032,6 @@ "gun_type": "robogun_laser", "fake_skills": [ [ "gun", 5 ], [ "rifle", 5 ] ], "fake_dex": 10, - "range": 18, "ranges": [ [ 0, 8, "AUTO" ], [ 8, 16, "BURST" ] ], "require_targeting_player": true, "require_targeting_npc": true, @@ -1055,7 +1048,7 @@ "type": "MONSTER", "copy-from": "mon_advbot_base", "name": "plasma-ejecting robot", - "description": "An advanced robot still functioning due to its internal fusion core. This model is furnished with a powerful plasma-ejector.", + "description": "An advanced robot still functioning due to its internal fusion core. This model is furnished with a powerful plasma-ejector.", "diff": 20, "color": "magenta", "luminance": 200, @@ -1067,7 +1060,6 @@ "gun_type": "robogun_plasma", "fake_skills": [ [ "gun", 5 ], [ "rifle", 5 ] ], "fake_dex": 10, - "range": 18, "ranges": [ [ 4, 16, "DEFAULT" ] ], "require_targeting_player": true, "require_targeting_npc": true, @@ -1085,7 +1077,7 @@ "type": "MONSTER", "copy-from": "mon_advbot_base", "name": "railgun robot", - "description": "An advanced robot still functioning due to its internal fusion core. This model is furnished with a powerful railgun.", + "description": "An advanced robot still functioning due to its internal fusion core. This model is furnished with a powerful railgun.", "diff": 30, "special_attacks": [ { @@ -1096,7 +1088,6 @@ "fake_skills": [ [ "gun", 5 ], [ "rifle", 5 ] ], "fake_dex": 10, "no_ammo_sound": "buzz!", - "range": 18, "ranges": [ [ 0, 18, "DEFAULT" ] ], "require_targeting_player": true, "require_targeting_npc": true, @@ -1115,7 +1106,7 @@ "copy-from": "mon_advbot_base", "name": "electro-casting robot", "color": "white_cyan", - "description": "An advanced robot still functioning due to its internal fusion core. This model is furnished with a powerful electro-caster.", + "description": "An advanced robot still functioning due to its internal fusion core. This model is furnished with a powerful electro-caster.", "diff": 20, "luminance": 100, "special_attacks": [ @@ -1125,7 +1116,6 @@ "gun_type": "robogun_lightning", "fake_skills": [ [ "gun", 5 ], [ "rifle", 5 ] ], "fake_dex": 10, - "range": 12, "ranges": [ [ 0, 12, "DEFAULT" ] ], "require_targeting_player": true, "require_targeting_npc": true, @@ -1143,7 +1133,7 @@ "type": "MONSTER", "copy-from": "mon_advbot_base", "name": "EMP-projecting robot", - "description": "An advanced robot still functioning due to its internal fusion core. This model is furnished with a powerful EMP-projector.", + "description": "An advanced robot still functioning due to its internal fusion core. This model is furnished with a powerful EMP-projector.", "diff": 10, "luminance": 120, "special_attacks": [ @@ -1153,7 +1143,6 @@ "gun_type": "robogun_emp", "fake_skills": [ [ "gun", 5 ], [ "rifle", 5 ] ], "fake_dex": 10, - "range": 18, "ranges": [ [ 0, 4, "BURST" ], [ 4, 8, "AUTO" ], [ 9, 16, "DEFAULT" ] ], "require_targeting_player": true, "require_targeting_npc": true, @@ -1170,7 +1159,7 @@ "type": "MONSTER", "copy-from": "mon_defbot_base", "name": "junkyard cowboy", - "description": "A salvaged defense robot refitted with a shotgun and two circular buzzsaws. Due to bootleg targeting software, it can only attack nearby targets.", + "description": "A salvaged defense robot refitted with a shotgun and two circular buzzsaws. Due to bootleg targeting software, it can only attack nearby targets.", "speed": 100, "color": "brown", "luminance": 0, @@ -1192,7 +1181,6 @@ "fake_skills": [ [ "gun", 2 ], [ "shotgun", 2 ] ], "fake_dex": 9, "no_ammo_sound": "click!", - "range": 3, "ranges": [ [ 0, 3, "DEFAULT" ] ] } ] @@ -1226,7 +1214,7 @@ "type": "MONSTER", "copy-from": "mon_defbot_base", "name": "slapdash paladin", - "description": "A salvaged defense robot refitted with a homemade flamethrower and two searing hot blades. The burning fuel reserves make the robot noisy and smokey.", + "description": "A salvaged defense robot refitted with a homemade flamethrower and two searing hot blades. The burning fuel reserves make the robot noisy and smokey.", "speed": 100, "color": "red", "luminance": 30, @@ -1255,7 +1243,6 @@ "fake_skills": [ [ "gun", 4 ], [ "launcher", 5 ] ], "fake_dex": 10, "no_ammo_sound": "hiss!", - "range": 10, "ranges": [ [ 0, 10, "DEFAULT" ] ] } ], @@ -1266,7 +1253,7 @@ "type": "MONSTER", "copy-from": "mon_milbot_base", "name": "robo-guardian", - "description": "A salvaged military robot refitted with a pair of integrated 9mm firearms. Multiple weapons provide a high rate of fire, but jury-rigged sensors limit the effective range and accuracy. It makes for a good close range bodyguard.", + "description": "A salvaged military robot refitted with a pair of integrated 9mm firearms. Multiple weapons provide a high rate of fire, but jury-rigged sensors limit the effective range and accuracy. It makes for a good close range bodyguard.", "diff": 10, "speed": 70, "color": "green", @@ -1286,7 +1273,6 @@ "fake_skills": [ [ "gun", 3 ], [ "smg", 3 ] ], "fake_dex": 9, "no_ammo_sound": "click click!", - "range": "10", "ranges": [ [ 0, 10, "AUTO" ] ] } ] @@ -1306,7 +1292,7 @@ "type": "MONSTER", "copy-from": "mon_milbot_base", "name": "robo-protector", - "description": "A salvaged military robot refitted with an integrated 5.56mm rifle. The modified firearm is only capable of three round bursts, but range and accuracy are decent. It makes for a solid combat ally.", + "description": "A salvaged military robot refitted with an integrated 5.56mm rifle. The modified firearm is only capable of three round bursts, but range and accuracy are decent. It makes for a solid combat ally.", "diff": 20, "speed": 100, "color": "green", @@ -1325,7 +1311,6 @@ "fake_skills": [ [ "gun", 5 ], [ "rifle", 5 ] ], "fake_dex": 10, "no_ammo_sound": "click!", - "range": 18, "ranges": [ [ 0, 16, "BURST" ] ], "require_targeting_player": true } @@ -1336,7 +1321,7 @@ "type": "MONSTER", "copy-from": "mon_milbot_base", "name": "robo-defender", - "description": "A salvaged military robot refitted with an integrated 50bmg rifle. Improved optics provide nightvision and excellent range, but glitchy targeting software requires an extended pause between shots. It makes for a good long range sniper.", + "description": "A salvaged military robot refitted with an integrated 50bmg rifle. Improved optics provide nightvision and excellent range, but glitchy targeting software requires an extended pause between shots. It makes for a good long range sniper.", "diff": 30, "speed": 70, "color": "green", @@ -1357,7 +1342,6 @@ "fake_dex": 11, "fake_per": 10, "no_ammo_sound": "click!", - "range": 30, "ranges": [ [ 0, 30, "DEFAULT" ] ], "require_targeting_player": true, "require_targeting_npc": true, @@ -1391,7 +1375,6 @@ "gun_type": "robogun_laser", "fake_skills": [ [ "gun", 5 ], [ "rifle", 5 ] ], "fake_dex": 8, - "range": 5, "ranges": [ [ 0, 5, "AUTO" ] ] } ] @@ -1445,7 +1428,8 @@ "description": "The Northrup 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.", "default_faction": "military", "species": [ "ROBOT" ], - "size": "LARGE", + "volume": "92500 ml", + "weight": "120 kg", "hp": 90, "speed": 115, "material": [ "steel" ], @@ -1484,7 +1468,6 @@ "vision_day": 20, "vision_night": 10, "revert_to_itype": "bot_chickenbot_horror", - "remove:special_attack": [ "CHICKENBOT" ], "special_attacks": [ [ "SMASH", 30 ], [ "SHRIEK", 10 ], [ "SHRIEK_STUN", 10 ] ] }, { @@ -1492,7 +1475,7 @@ "type": "MONSTER", "name": "screeching terror", "copy-from": "mon_chickenbot_base", - "description": "A salvaged chickenwalker modified into a horrific monster adorned with skulls and spikes. It has traded its long range weapons for a set of piston-driven lances. A speaker system has been installed to blast terrifying shrieks of distorted music. No one in their right mind would craft such a hellish beast.", + "description": "A salvaged chickenwalker modified into a horrific monster adorned with skulls and spikes. It has traded its long range weapons for a set of piston-driven lances. A speaker system has been installed to blast terrifying shrieks of distorted music. No one in their right mind would craft such a hellish beast.", "diff": 5, "hp": 90, "speed": 115, @@ -1503,7 +1486,6 @@ "vision_day": 20, "vision_night": 10, "revert_to_itype": "bot_chickenbot_terror", - "remove:special_attack": [ "CHICKENBOT" ], "special_attacks": [ [ "SMASH", 30 ], [ "SHRIEK", 10 ], [ "SHRIEK_STUN", 10 ] ] }, { @@ -1511,7 +1493,7 @@ "type": "MONSTER", "name": "hooked nightmare", "copy-from": "mon_chickenbot_base", - "description": "A salvaged chickenwalker modified into a horrific monster adorned with skulls and spikes. It has traded its long range weapons for a set of spinning chains terminating in bloody hooks. A speaker system has been installed to blast terrifying shrieks of distorted music. No one in their right mind would craft such a twisted abomination.", + "description": "A salvaged chickenwalker modified into a horrific monster adorned with skulls and spikes. It has traded its long range weapons for a set of spinning chains terminating in bloody hooks. A speaker system has been installed to blast terrifying shrieks of distorted music. No one in their right mind would craft such a twisted abomination.", "diff": 5, "hp": 90, "speed": 115, @@ -1522,7 +1504,6 @@ "vision_day": 20, "vision_night": 10, "revert_to_itype": "bot_chickenbot_nightmare", - "remove:special_attack": [ "CHICKENBOT" ], "special_attacks": [ [ "SMASH", 30 ], [ "SHRIEK", 10 ], [ "SHRIEK_STUN", 10 ], [ "RANGED_PULL", 10 ], [ "GRAB_DRAG", 10 ] ], "extend": { "flags": [ "GRABS" ] } }, @@ -1542,7 +1523,8 @@ "description": "The Northrup Beagle is a refrigerator-sized urban warfare UGV. Sporting an anti-tank missile launcher, 40mm grenade launcher, and numerous anti-infantry weapons, it's designed for high-risk urban fighting.", "default_faction": "military", "species": [ "ROBOT" ], - "size": "HUGE", + "volume": "875000 ml", + "weight": "200 kg", "hp": 240, "speed": 75, "material": [ "steel" ], @@ -1583,7 +1565,6 @@ "attack_effs": [ { "id": "downed", "chance": 20, "duration": 10 }, { "id": "stunned", "chance": 20, "duration": 10 } ], "vision_day": 20, "revert_to_itype": "bot_tankbot_king", - "remove:special_attack": [ "MULTI_ROBOT" ], "special_attacks": [ [ "SMASH", 15 ] ] }, { @@ -1606,7 +1587,6 @@ "vision_day": 20, "revert_to_itype": "bot_tankbot_sultan", "emit_fields": [ "emit_nuclear_trail" ], - "remove:special_attack": [ "MULTI_ROBOT" ], "special_attacks": [ [ "SMASH", 30 ], [ "GRAB", 20 ] ], "extend": { "flags": [ "STUMBLES", "GRABS" ] } } diff --git a/data/mods/Salvaged_Robots/recipe.json b/data/mods/Salvaged_Robots/recipe.json index 2e51080582a10..720c3dd4443b4 100644 --- a/data/mods/Salvaged_Robots/recipe.json +++ b/data/mods/Salvaged_Robots/recipe.json @@ -9,7 +9,7 @@ "difficulty": 8, "time": 2500, "reversible": true, - "auto_learn": true, + "autolearn": true, "tools": [ [ [ "electrohack", 20 ] ] ], "using": [ [ "soldering_standard", 20 ], [ "welding_standard", 5 ] ], "qualities": [ { "id": "SCREW", "level": 1 }, { "id": "WRENCH", "level": 1 } ], @@ -33,7 +33,7 @@ "difficulty": 3, "time": 2500, "reversible": true, - "auto_learn": true, + "autolearn": true, "tools": [ [ [ "electrohack", 20 ] ] ], "qualities": [ { "id": "SCREW", "level": 1 } ] }, @@ -68,7 +68,7 @@ "difficulty": 6, "time": 25000, "reversible": false, - "auto_learn": true, + "autolearn": true, "tools": [ [ [ "electrohack", 20 ] ] ], "using": [ [ "soldering_standard", 20 ], [ "welding_standard", 5 ] ], "qualities": [ { "id": "SCREW", "level": 1 }, { "id": "WRENCH", "level": 1 } ] diff --git a/data/mods/Salvaged_Robots/speech.json b/data/mods/Salvaged_Robots/speech.json index 9ac2e4dfca90f..9c71c9e5601b5 100644 --- a/data/mods/Salvaged_Robots/speech.json +++ b/data/mods/Salvaged_Robots/speech.json @@ -170,19 +170,19 @@ { "type": "speech", "speaker": "mon_craftbuddy", - "sound": "\"Bedeep. Whurrrrrmmmm.\"", + "sound": "\"Bedeep. Whurrrrrmmmm.\"", "volume": 10 }, { "type": "speech", "speaker": "mon_craftbuddy", - "sound": "\"Pwwowm. Fsht fshrrrr.\"", + "sound": "\"Pwwowm. Fsht fshrrrr.\"", "volume": 10 }, { "type": "speech", "speaker": "mon_craftbuddy", - "sound": "\"Click. Clicliclick. Vrnnnk.\"", + "sound": "\"Click. Clicliclick. Vrnnnk.\"", "volume": 10 }, { @@ -212,7 +212,7 @@ { "type": "speech", "speaker": "mon_defbot_paladin", - "sound": "\"Creak! Clang clang.\"", + "sound": "\"Creak! Clang clang.\"", "volume": 50 }, { diff --git a/data/mods/Tanks/items.json b/data/mods/Tanks/items.json index c4b2fafc8f548..ce43d124d2be9 100644 --- a/data/mods/Tanks/items.json +++ b/data/mods/Tanks/items.json @@ -495,8 +495,7 @@ { "type": "BOOK", "id": "textbook_launcher", - "name": "Artillery and Field Gunnery", - "name_plural": "copies of Artillery and Field Gunnery", + "name": { "str": "Artillery and Field Gunnery", "str_pl": "copies of Artillery and Field Gunnery" }, "max_level": 6, "description": "A textbook on the history of modern artillery, with a number of illustrations and excerpts from various field manuals. A competent handloader or mechanic might find additional uses for the more technical parts of the text.", "weight": "1120 g", diff --git a/data/mods/blazemod/blaze_blob_monster.json b/data/mods/blazemod/blaze_blob_monster.json index 94cbccaaa4f2b..4447bd5afa78e 100644 --- a/data/mods/blazemod/blaze_blob_monster.json +++ b/data/mods/blazemod/blaze_blob_monster.json @@ -24,7 +24,8 @@ "description": "An escaping noisy blob, catch it before it brings in every zombie for miles!", "default_faction": "blob", "species": [ "BLOB" ], - "size": "SMALL", + "volume": "30000 ml", + "weight": "40750 g", "hp": 1, "speed": 60, "material": [ "flesh" ], @@ -53,7 +54,8 @@ "description": "An escaping noisy blob, catch it before it brings in every zombie for miles!", "default_faction": "blob", "species": [ "BLOB" ], - "size": "HUGE", + "volume": "875000 ml", + "weight": "200 kg", "hp": 1, "speed": 60, "material": [ "flesh" ], @@ -82,7 +84,8 @@ "description": "An escaping noisy blob, catch it before it brings in every zombie for miles!", "default_faction": "blob", "species": [ "BLOB" ], - "size": "LARGE", + "volume": "92500 ml", + "weight": "120 kg", "hp": 1, "speed": 60, "material": [ "flesh" ], diff --git a/data/mods/necromancy/necronimicron.json b/data/mods/necromancy/necronimicron.json index 29b3591d3e153..63e4145f1b35e 100644 --- a/data/mods/necromancy/necronimicron.json +++ b/data/mods/necromancy/necronimicron.json @@ -87,7 +87,7 @@ { "type": "BOOK", "id": "abdul_necro", - "name": "Principles of Postmortem Mind Control", + "name": { "str": "Principles of Postmortem Mind Control", "str_pl": "copies of Principles of Postmortem Mind Control" }, "max_level": 5, "description": "A thick book containing research notes of a mad scientist. It describes various methods of reanimating and controlling the dead. There's a lot of gory details and technical language mixed in, so it's not easy to read.", "weight": "2330 g", diff --git a/doc/JSON_INFO.md b/doc/JSON_INFO.md index 3c7bb47759715..3573abe7a8a44 100644 --- a/doc/JSON_INFO.md +++ b/doc/JSON_INFO.md @@ -1342,6 +1342,19 @@ Alternately, every item (tool, gun, even food) can be used as book if it has boo } ``` +Since many book names are proper names, it's often necessary to explicitly specify +the plural forms. The following is the game's convention on plural names of books: + +1. For non-periodical books (textbooks, manuals, spellbooks, etc.), + 1. If the book's singular name is a proper name, then the plural name is `copies of (singular name)`. For example, the plural name of `Lessons for the Novice Bowhunter` is `copies of Lessons for the Novice Bowhunter`. + 2. Otherwise, the plural name is the usual plural of the singular name. For example, the plural name of `tactical baton defense manual` is `tactical baton defense manuals` +2. For periodicals (magazines and journals), + 1. If the periodical's singular name is a proper name, and doesn't end with "Magazine", "Weekly", "Monthly", etc., the plural name is `issues of (singular name)`. For example, the plural name of `Archery for Kids` is `issues of Archery for Kids`. + 2. Otherwise, the periodical's plural name is the usual plural of the singular name. For example, the plural name of `Crafty Crafter's Quarterly` is `Crafty Crafter's Quarterlies`. +3. For board games (represented internally as book items), + 1. If the board game's singular name is a proper name, the plural is `sets of (singular name)`. For example, the plural name of `Picturesque` is `sets of Picturesque`. + 2. Otherwise the plural name is the usual plural. For example, the plural of `deck of cards` is `decks of cards`. + #### Conditional Naming The `conditional_names` field allows defining alternate names for items that will be displayed instead of (or in addition to) the default name, when specific conditions are met. Take the following (incomplete) definition for `sausage` as an example of the syntax: @@ -1851,6 +1864,13 @@ The contents of use_action fields can either be a string indicating a built-in f "skill2": "unarmed", // Another id, just like the skill1. Both entries are optional. "moves": 60 // how many move points the action takes. }, +"use_action": { + "type": "place_npc", // place npc of specific class on the map + "npc_class_id": "true_foodperson", // npc class id, see npcs/classes.json + "summon_msg": "You summon a food hero!", // (optional) message when summoning the npc. + "place_randomly": true, // if true: places npc randomly around the player, if false: let the player decide where to put it (default: false) + "moves": 50 // how many move points the action takes. +}, "use_action": { "type": "ups_based_armor", // Armor that can be activated and uses power from an UPS, needs additional json code to work "activate_msg": "You activate your foo.", // Message when the player activates the item. diff --git a/lang/CMakeLists.txt b/lang/CMakeLists.txt index d5dbaa1a2297e..2c7c51f6f2b6e 100644 --- a/lang/CMakeLists.txt +++ b/lang/CMakeLists.txt @@ -1,88 +1,88 @@ -MESSAGE(STATUS "Process LINGUAS variable --\n") +MESSAGE(STATUS "Process LANGUAGES variable --\n") FIND_PACKAGE(Gettext) IF (NOT GETTEXT_FOUND) - MESSAGE(FATAL_ERROR - "Gettext not found. Install gettext package or diable - localization with: -DLOCALIZE=OFF \nSee INSTALL file for details and more info\n" - ) + MESSAGE(FATAL_ERROR + "Gettext not found. Install gettext package or disable + localization with: -DLOCALIZE=OFF \nSee INSTALL file for details and more info\n" + ) ENDIF (NOT GETTEXT_FOUND) foreach (LANG ${LANGUAGES}) - MESSAGE(STATUS "Add translation for ${LANG}: ${LANG}.po") + MESSAGE(STATUS "Add translation for ${LANG}: ${LANG}.po") endforeach () MESSAGE("\n") # Extract json strings add_custom_target ( - extract_string - COMMAND python lang/extract_json_strings.py - WORKING_DIRECTORY ${CMAKE_SOURCE_DIR} + extract_string + COMMAND python lang/extract_json_strings.py + WORKING_DIRECTORY ${CMAKE_SOURCE_DIR} ) # Generate cataclysm-dda.pot add_custom_target ( - translations - COMMAND xgettext --default-domain="cataclysm-dda" - --sort-by-file - --add-comments="~" - --output="${CMAKE_SOURCE_DIR}/lang/po/cataclysm-dda.pot" - --keyword="_" - --keyword="pgettext:1c,2" - --keyword="ngettext:1,2" - --from-code="UTF-8" - ${CMAKE_SOURCE_DIR}/src/*.cpp - ${CMAKE_SOURCE_DIR}/src/*.h - ${CMAKE_SOURCE_DIR}/lang/json/*.py - WORKING_DIRECTORY ${CMAKE_SOURCE_DIR} - DEPENDS extract_string + translations + COMMAND xgettext --default-domain="cataclysm-dda" + --sort-by-file + --add-comments="~" + --output="${CMAKE_SOURCE_DIR}/lang/po/cataclysm-dda.pot" + --keyword="_" + --keyword="pgettext:1c,2" + --keyword="ngettext:1,2" + --from-code="UTF-8" + ${CMAKE_SOURCE_DIR}/src/*.cpp + ${CMAKE_SOURCE_DIR}/src/*.h + ${CMAKE_SOURCE_DIR}/lang/json/*.py + WORKING_DIRECTORY ${CMAKE_SOURCE_DIR} + DEPENDS extract_string ) add_custom_target ( - translations_prepare - WORKING_DIRECTORY ${CMAKE_SOURCE_DIR} + translations_prepare + WORKING_DIRECTORY ${CMAKE_SOURCE_DIR} ) # Auto-Compile translation on release builds only IF (RELEASE) - add_custom_target ( - translations_compile - ALL - WORKING_DIRECTORY ${CMAKE_SOURCE_DIR} - DEPENDS translations_prepare - ) + add_custom_target ( + translations_compile + ALL + WORKING_DIRECTORY ${CMAKE_SOURCE_DIR} + DEPENDS translations_prepare + ) ELSE (RELEASE) - add_custom_target ( - translations_compile - WORKING_DIRECTORY ${CMAKE_SOURCE_DIR} - DEPENDS translations_prepare - ) + add_custom_target ( + translations_compile + WORKING_DIRECTORY ${CMAKE_SOURCE_DIR} + DEPENDS translations_prepare + ) ENDIF (RELEASE) foreach (LANG ${LANGUAGES}) - add_custom_command ( - TARGET translations_prepare - PRE_BUILD - COMMAND ${CMAKE_COMMAND} - -E make_directory ${CMAKE_SOURCE_DIR}/lang/mo/${LANG}/LC_MESSAGES - WORKING_DIRECTORY ${CMAKE_SOURCE_DIR} - ) - add_custom_command ( - TARGET translations_compile - PRE_BUILD - COMMAND - ${GETTEXT_MSGFMT_EXECUTABLE} -f ${CMAKE_SOURCE_DIR}/lang/po/${LANG}.po - -o ${CMAKE_SOURCE_DIR}/lang/mo/${LANG}/LC_MESSAGES/cataclysm-dda.mo - WORKING_DIRECTORY ${CMAKE_SOURCE_DIR} - ) - IF(RELEASE) - IF (${CMAKE_SYSTEM_NAME} MATCHES Windows) - #install(DIRECTORY ${CMAKE_SOURCE_DIR}/lang/mo/${LANG} DESTINATION ${DATA_PREFIX}) - ELSE (${CMAKE_SYSTEM_NAME} MATCHES Windows) - install(DIRECTORY ${CMAKE_SOURCE_DIR}/lang/mo/${LANG} DESTINATION ${LOCALE_DIR}) - ENDIF (${CMAKE_SYSTEM_NAME} MATCHES Windows) - ENDIF(RELEASE) + add_custom_command ( + TARGET translations_prepare + PRE_BUILD + COMMAND ${CMAKE_COMMAND} + -E make_directory ${CMAKE_SOURCE_DIR}/lang/mo/${LANG}/LC_MESSAGES + WORKING_DIRECTORY ${CMAKE_SOURCE_DIR} + ) + add_custom_command ( + TARGET translations_compile + PRE_BUILD + COMMAND + ${GETTEXT_MSGFMT_EXECUTABLE} -f ${CMAKE_SOURCE_DIR}/lang/po/${LANG}.po + -o ${CMAKE_SOURCE_DIR}/lang/mo/${LANG}/LC_MESSAGES/cataclysm-dda.mo + WORKING_DIRECTORY ${CMAKE_SOURCE_DIR} + ) + IF(RELEASE) + IF (${CMAKE_SYSTEM_NAME} MATCHES Windows) + #install(DIRECTORY ${CMAKE_SOURCE_DIR}/lang/mo/${LANG} DESTINATION ${DATA_PREFIX}) + ELSE (${CMAKE_SYSTEM_NAME} MATCHES Windows) + install(DIRECTORY ${CMAKE_SOURCE_DIR}/lang/mo/${LANG} DESTINATION ${LOCALE_DIR}) + ENDIF (${CMAKE_SYSTEM_NAME} MATCHES Windows) + ENDIF(RELEASE) endforeach() diff --git a/lang/extract_json_strings.py b/lang/extract_json_strings.py index 63bc4e9c82fc4..97b86632a1184 100755 --- a/lang/extract_json_strings.py +++ b/lang/extract_json_strings.py @@ -167,13 +167,17 @@ def warning_supressed(filename): "BIONIC_ITEM", "BOOK", "CONTAINER", + "ENGINE", "GENERIC", "GUN", "GUNMOD", + "MAGAZINE", "MONSTER", + "PET_ARMOR", "TOOL", "TOOLMOD", "TOOL_ARMOR", + "WHEEL", } # these objects can be automatically converted, but use format strings diff --git a/src/CMakeLists.txt b/src/CMakeLists.txt index 81c3622f0e3b5..9f738828d1ba8 100644 --- a/src/CMakeLists.txt +++ b/src/CMakeLists.txt @@ -1,291 +1,286 @@ # Cataclysm DDA client -cmake_minimum_required(VERSION 3.0.0) +cmake_minimum_required(VERSION 3.1.4) SET(MAIN_CPP ${CMAKE_SOURCE_DIR}/src/main.cpp) SET(RESOURCE_RC ${CMAKE_SOURCE_DIR}/src/resource.rc) FILE(GLOB CATACLYSM_DDA_SOURCES - ${CMAKE_SOURCE_DIR}/src/*.cpp) + ${CMAKE_SOURCE_DIR}/src/*.cpp +) LIST(REMOVE_ITEM CATACLYSM_DDA_SOURCES ${MAIN_CPP}) FILE(GLOB CATACLYSM_DDA_HEADERS - ${CMAKE_SOURCE_DIR}/src/*.h) + ${CMAKE_SOURCE_DIR}/src/*.h +) # Get GIT version strings ADD_CUSTOM_TARGET( - get_version - DEPENDS ${CMAKE_SOURCE_DIR}/src/version.h - WORKING_DIRECTORY ${CMAKE_SOURCE_DIR} + get_version + DEPENDS ${CMAKE_SOURCE_DIR}/src/version.h + WORKING_DIRECTORY ${CMAKE_SOURCE_DIR} ) ADD_CUSTOM_COMMAND ( - OUTPUT ${CMAKE_SOURCE_DIR}/src/version.h - COMMAND ${CMAKE_COMMAND} - -D SRC=${CMAKE_SOURCE_DIR}/src/version.h.in - -D DST=${CMAKE_SOURCE_DIR}/src/version.h - -D GIT_EXECUTABLE=${GIT_EXECUTABLE} - -P ${CMAKE_SOURCE_DIR}/src/version.cmake - WORKING_DIRECTORY ${CMAKE_SOURCE_DIR} + OUTPUT ${CMAKE_SOURCE_DIR}/src/version.h + COMMAND ${CMAKE_COMMAND} + -D SRC=${CMAKE_SOURCE_DIR}/src/version.h.in + -D DST=${CMAKE_SOURCE_DIR}/src/version.h + -D GIT_EXECUTABLE=${GIT_EXECUTABLE} + -P ${CMAKE_SOURCE_DIR}/src/version.cmake + WORKING_DIRECTORY ${CMAKE_SOURCE_DIR} ) # Build tiles version if requested IF(TILES) - add_library(libcataclysm-tiles STATIC - ${CATACLYSM_DDA_SOURCES} - ${CATACLYSM_DDA_HEADERS} - ) - - target_include_directories(libcataclysm-tiles INTERFACE ${CMAKE_SOURCE_DIR}/src) - - IF(WIN32) - ADD_DEFINITIONS(-DUSE_WINMAIN) - ADD_EXECUTABLE(cataclysm-tiles WIN32 - ${MAIN_CPP} - ${RESOURCE_RC} - ) - ELSE(WIN32) - ADD_EXECUTABLE(cataclysm-tiles - ${MAIN_CPP} - ) - ENDIF(WIN32) - - ADD_DEPENDENCIES(libcataclysm-tiles get_version) - - target_link_libraries(cataclysm-tiles libcataclysm-tiles) - target_compile_definitions(libcataclysm-tiles PUBLIC TILES ) - - IF (LOCALIZE) - target_include_directories(libcataclysm-tiles PUBLIC - ${LIBINTL_INCLUDE_DIR} - ${ICONV_INCLUDE_DIR} - ) - target_link_libraries(libcataclysm-tiles - ${LIBINTL_LIBRARIES} - ${ICONV_LIBRARIES} - ) - ENDIF (LOCALIZE) - - IF(CMAKE_USE_PTHREADS_INIT) - target_compile_options(libcataclysm-tiles PUBLIC "-pthread") - ENDIF(CMAKE_USE_PTHREADS_INIT) - - IF(CMAKE_THREAD_LIBS_INIT) - target_link_libraries(libcataclysm-tiles ${CMAKE_THREAD_LIBS_INIT}) - ENDIF(CMAKE_THREAD_LIBS_INIT) - - IF (NOT DYNAMIC_LINKING) - # SDL, SDL_Image, SDL_ttf deps are required for static build - target_include_directories(libcataclysm-tiles PUBLIC - ${FREETYPE_INCLUDE_DIRS} - ${PNG_INCLUDE_DIRS} - ${JPEG_INCLUDE_DIR} - ${ZLIB_INCLUDE_DIRS} - ${BZIP2_INCLUDE_DIR} - ) - target_link_libraries(libcataclysm-tiles - ${FREETYPE_LIBRARIES} - ${PNG_LIBRARIES} - ${JPEG_LIBRARIES} - ${ZLIB_LIBRARIES} - ${BZIP2_LIBRARIES} - ) - ENDIF (NOT DYNAMIC_LINKING) - - target_include_directories(libcataclysm-tiles PUBLIC - ${SDL2_INCLUDE_DIR} - ${SDL2_IMAGE_INCLUDE_DIRS} - ${SDL2_TTF_INCLUDE_DIRS} - ) - target_link_libraries(libcataclysm-tiles - ${SDL2_LIBRARY} - ${SDL2_IMAGE_LIBRARIES} - ${SDL2_TTF_LIBRARIES} - ) - - IF(SOUND) - target_compile_definitions(libcataclysm-tiles PUBLIC SDL_SOUND ) - - target_include_directories(libcataclysm-tiles PUBLIC ${OGGVORBIS_INCLUDE_DIR}) - target_link_libraries(libcataclysm-tiles ${OGG_LIBRARY}) - target_link_libraries(libcataclysm-tiles ${VORBIS_LIBRARY}) - target_link_libraries(libcataclysm-tiles ${VORBISFILE_LIBRARY}) - - target_include_directories(libcataclysm-tiles PUBLIC ${SDL2_MIXER_INCLUDE_DIRS}) - target_link_libraries(libcataclysm-tiles ${SDL2_MIXER_LIBRARIES}) - ENDIF(SOUND) - - IF(WIN32) - # Global settings for Windows targets (at end) - target_link_libraries(libcataclysm-tiles gdi32.lib) - target_link_libraries(libcataclysm-tiles winmm.lib) - target_link_libraries(libcataclysm-tiles imm32.lib) - target_link_libraries(libcataclysm-tiles ole32.lib) - target_link_libraries(libcataclysm-tiles oleaut32.lib) - target_link_libraries(libcataclysm-tiles version.lib) - IF (BACKTRACE) - target_link_libraries(libcataclysm-tiles dbghelp.lib) - ENDIF(BACKTRACE) - ENDIF(WIN32) - - IF(RELEASE) - install(TARGETS cataclysm-tiles DESTINATION ${BIN_PREFIX}) - ENDIF(RELEASE) + add_library(libcataclysm-tiles STATIC + ${CATACLYSM_DDA_SOURCES} + ${CATACLYSM_DDA_HEADERS} + ) + target_include_directories(libcataclysm-tiles INTERFACE ${CMAKE_SOURCE_DIR}/src) + + IF(WIN32) + ADD_DEFINITIONS(-DUSE_WINMAIN) + ADD_EXECUTABLE(cataclysm-tiles WIN32 + ${MAIN_CPP} + ${RESOURCE_RC} + ) + ELSE(WIN32) + ADD_EXECUTABLE(cataclysm-tiles + ${MAIN_CPP} + ) + ENDIF(WIN32) + + ADD_DEPENDENCIES(libcataclysm-tiles get_version) + + target_link_libraries(cataclysm-tiles libcataclysm-tiles) + target_compile_definitions(libcataclysm-tiles PUBLIC TILES ) + + IF (LOCALIZE) + target_include_directories(libcataclysm-tiles PUBLIC + ${LIBINTL_INCLUDE_DIR} + ${ICONV_INCLUDE_DIR} + ) + target_link_libraries(libcataclysm-tiles + ${LIBINTL_LIBRARIES} + ${ICONV_LIBRARIES} + ) + ENDIF (LOCALIZE) + + IF(CMAKE_USE_PTHREADS_INIT) + target_compile_options(libcataclysm-tiles PUBLIC "-pthread") + ENDIF(CMAKE_USE_PTHREADS_INIT) + + IF(CMAKE_THREAD_LIBS_INIT) + target_link_libraries(libcataclysm-tiles ${CMAKE_THREAD_LIBS_INIT}) + ENDIF(CMAKE_THREAD_LIBS_INIT) + + IF (NOT DYNAMIC_LINKING) + # SDL, SDL_Image, SDL_ttf deps are required for static build + target_include_directories(libcataclysm-tiles PUBLIC + ${FREETYPE_INCLUDE_DIRS} + ${PNG_INCLUDE_DIRS} + ${JPEG_INCLUDE_DIR} + ${ZLIB_INCLUDE_DIRS} + ${BZIP2_INCLUDE_DIR} + ) + target_link_libraries(libcataclysm-tiles + ${FREETYPE_LIBRARIES} + ${PNG_LIBRARIES} + ${JPEG_LIBRARIES} + ${ZLIB_LIBRARIES} + ${BZIP2_LIBRARIES} + ) + ENDIF (NOT DYNAMIC_LINKING) + target_include_directories(libcataclysm-tiles PUBLIC + ${SDL2_INCLUDE_DIR} + ${SDL2_IMAGE_INCLUDE_DIRS} + ${SDL2_TTF_INCLUDE_DIRS} + ) + target_link_libraries(libcataclysm-tiles + ${SDL2_LIBRARY} + ${SDL2_IMAGE_LIBRARIES} + ${SDL2_TTF_LIBRARIES} + ) + + IF(SOUND) + target_compile_definitions(libcataclysm-tiles PUBLIC SDL_SOUND ) + target_include_directories(libcataclysm-tiles PUBLIC ${OGGVORBIS_INCLUDE_DIR}) + target_link_libraries(libcataclysm-tiles ${OGG_LIBRARY}) + target_link_libraries(libcataclysm-tiles ${VORBIS_LIBRARY}) + target_link_libraries(libcataclysm-tiles ${VORBISFILE_LIBRARY}) + target_include_directories(libcataclysm-tiles PUBLIC ${SDL2_MIXER_INCLUDE_DIRS}) + target_link_libraries(libcataclysm-tiles ${SDL2_MIXER_LIBRARIES}) + ENDIF(SOUND) + + IF(WIN32) + # Global settings for Windows targets (at end) + target_link_libraries(libcataclysm-tiles gdi32.lib) + target_link_libraries(libcataclysm-tiles winmm.lib) + target_link_libraries(libcataclysm-tiles imm32.lib) + target_link_libraries(libcataclysm-tiles ole32.lib) + target_link_libraries(libcataclysm-tiles oleaut32.lib) + target_link_libraries(libcataclysm-tiles version.lib) + IF (BACKTRACE) + target_link_libraries(libcataclysm-tiles dbghelp.lib) + ENDIF(BACKTRACE) + ENDIF(WIN32) + + IF(RELEASE) + install(TARGETS cataclysm-tiles DESTINATION ${BIN_PREFIX}) + ENDIF(RELEASE) ENDIF(TILES) # Build curses version if requested IF(CURSES) - add_library(libcataclysm STATIC - ${CATACLYSM_DDA_SOURCES} - ${CATACLYSM_DDA_HEADERS} - ) - - target_include_directories(libcataclysm INTERFACE ${CMAKE_SOURCE_DIR}/src) - - IF(WIN32) - ADD_EXECUTABLE(cataclysm - ${MAIN_CPP} - ${RESOURCE_RC} - ) - ELSE(WIN32) - ADD_EXECUTABLE(cataclysm - ${MAIN_CPP} - ) - ENDIF(WIN32) - - ADD_DEPENDENCIES(libcataclysm get_version) - - target_link_libraries(cataclysm libcataclysm) - - IF (LOCALIZE) - target_include_directories(libcataclysm PUBLIC - ${LIBINTL_INCLUDE_DIR} - ${ICONV_INCLUDE_DIR} - ) - target_link_libraries(libcataclysm - ${LIBINTL_LIBRARIES} - ${ICONV_LIBRARIES} - ) - ENDIF (LOCALIZE) - - target_include_directories(libcataclysm PUBLIC ${CURSES_INCLUDE_DIR}) - target_link_libraries(libcataclysm ${CURSES_LIBRARIES}) - - IF(CMAKE_USE_PTHREADS_INIT) - target_compile_options(libcataclysm PUBLIC "-pthread") - ENDIF(CMAKE_USE_PTHREADS_INIT) - - IF(CMAKE_THREAD_LIBS_INIT) - target_link_libraries(libcataclysm ${CMAKE_THREAD_LIBS_INIT}) - ENDIF(CMAKE_THREAD_LIBS_INIT) - - IF(WIN32) - # Global settings for Windows targets (at end) - target_link_libraries(libcataclysm gdi32.lib) - target_link_libraries(libcataclysm winmm.lib) - target_link_libraries(libcataclysm imm32.lib) - target_link_libraries(libcataclysm ole32.lib) - target_link_libraries(libcataclysm oleaut32.lib) - target_link_libraries(libcataclysm version.lib) - IF (BACKTRACE) - target_link_libraries(libcataclysm dbghelp.lib) - ENDIF(BACKTRACE) - ENDIF(WIN32) - - IF(RELEASE) - install(TARGETS cataclysm DESTINATION ${BIN_PREFIX}) - ENDIF(RELEASE) + add_library(libcataclysm STATIC + ${CATACLYSM_DDA_SOURCES} + ${CATACLYSM_DDA_HEADERS} + ) + target_include_directories(libcataclysm INTERFACE ${CMAKE_SOURCE_DIR}/src) + + IF(WIN32) + ADD_EXECUTABLE(cataclysm + ${MAIN_CPP} + ${RESOURCE_RC} + ) + ELSE(WIN32) + ADD_EXECUTABLE(cataclysm + ${MAIN_CPP} + ) + ENDIF(WIN32) + + ADD_DEPENDENCIES(libcataclysm get_version) + target_link_libraries(cataclysm libcataclysm) + + IF (LOCALIZE) + target_include_directories(libcataclysm PUBLIC + ${LIBINTL_INCLUDE_DIR} + ${ICONV_INCLUDE_DIR} + ) + target_link_libraries(libcataclysm + ${LIBINTL_LIBRARIES} + ${ICONV_LIBRARIES} + ) + ENDIF (LOCALIZE) + + target_include_directories(libcataclysm PUBLIC ${CURSES_INCLUDE_DIR}) + target_link_libraries(libcataclysm ${CURSES_LIBRARIES}) + + IF(CMAKE_USE_PTHREADS_INIT) + target_compile_options(libcataclysm PUBLIC "-pthread") + ENDIF(CMAKE_USE_PTHREADS_INIT) + + IF(CMAKE_THREAD_LIBS_INIT) + target_link_libraries(libcataclysm ${CMAKE_THREAD_LIBS_INIT}) + ENDIF(CMAKE_THREAD_LIBS_INIT) + + IF(WIN32) + # Global settings for Windows targets (at end) + target_link_libraries(libcataclysm gdi32.lib) + target_link_libraries(libcataclysm winmm.lib) + target_link_libraries(libcataclysm imm32.lib) + target_link_libraries(libcataclysm ole32.lib) + target_link_libraries(libcataclysm oleaut32.lib) + target_link_libraries(libcataclysm version.lib) + IF (BACKTRACE) + target_link_libraries(libcataclysm dbghelp.lib) + ENDIF(BACKTRACE) + ENDIF(WIN32) + + IF(RELEASE) + install(TARGETS cataclysm DESTINATION ${BIN_PREFIX}) + ENDIF(RELEASE) ENDIF(CURSES) IF(MINGW AND NOT RELEASE) - # Try to Install shared libraries for dev builds - # - # Note: It is specific to MSYS2 and uses hardcoded versions so - # probly it will fail if you run it :) - - # GCC-specific libraries - find_library(RuntimeLib_GCC_S_DW2_1 "gcc_s_dw2-1") - find_library(RuntimeLib_STDC_PP_6 "stdc++-6") - find_library(RuntimeLib_WINPTHREAD_1 "winpthread-1") - SET(RuntimeLib_GCC_ALL - ${RuntimeLib_GCC_S_DW2_1} - ${RuntimeLib_STDC_PP_6} - ${RuntimeLib_WINPTHREAD_1} - ) - IF (LOCALIZE) - find_library(RuntimeLib_iconv "libiconv-2") - find_library(RuntimeLib_intl "libintl-8") - SET(RuntimeLib_LOCALIZE - ${RuntimeLib_iconv} - ${RuntimeLib_intl} - ) - ENDIF (LOCALIZE) - IF (TILES) - # SDL2 can have a varoius deps. Here you are the MSYS2 ones... - find_library(RuntimeLib_SDL2 "SDL2") - find_library(RuntimeLib_SDL2_IMG "SDL2_image") - find_library(RuntimeLib_png "libpng16-16") - find_library(RuntimeLib_jpeg "libjpeg-8") - find_library(RuntimeLib_jbig "libjbig-0") - find_library(RuntimeLib_tiff "libtiff-5") - find_library(RuntimeLib_webp "libwebp-5") - find_library(RuntimeLib_lzma "liblzma-5") - find_library(RuntimeLib_bz2 "libbz2-1") - find_library(RuntimeLib_zlib "zlib1") - find_library(RuntimeLib_hb "libharfbuzz-0") - find_library(RuntimeLib_SDL2_TTF "SDL2_ttf") - find_library(RuntimeLib_ft "libfreetype-6") - find_library(RuntimeLib_glib "libglib-2.0-0") - SET(RuntimeLib_SDL - ${RuntimeLib_SDL2} - ${RuntimeLib_SDL2_IMG} - ${RuntimeLib_png} - ${RuntimeLib_jpeg} - ${RuntimeLib_jbig} - ${RuntimeLib_tiff} - ${RuntimeLib_webp} - ${RuntimeLib_lzma} - ${RuntimeLib_bz2} - ${RuntimeLib_zlib} - ${RuntimeLib_hb} - ${RuntimeLib_SDL2_TTF} - ${RuntimeLib_ft} - ${RuntimeLib_glib} - ) - IF(SOUND) - find_library(RuntimeLib_SDL_SND "SDL2_mixer") - find_library(RuntimeLib_flak "libFLAC-8") - find_library(RuntimeLib_ogg "libogg-0") - find_library(RuntimeLib_flu "libfluidsynth-1") - find_library(RuntimeLib_port "libportaudio-2") - find_library(RuntimeLib_snd "libsndfile-1") - find_library(RuntimeLib_vorb "libvorbis-0") - find_library(RuntimeLib_vorb_enc "libvorbisenc-2") - find_library(RuntimeLib_vorb_f "libvorbisfile-3") - find_library(RuntimeLib_mod "libmodplug-1") - find_library(RuntimeLib_mpeg "smpeg2") - SET(RuntimeLib_SDL_SOUND - ${RuntimeLib_SDL_SND} - ${RuntimeLib_flak} - ${RuntimeLib_ogg} - ${RuntimeLib_flu} - ${RuntimeLib_port} - ${RuntimeLib_snd} - ${RuntimeLib_vorb} - ${RuntimeLib_vorb_enc} - ${RuntimeLib_vorb_f} - ${RuntimeLib_mod} - ${RuntimeLib_mpeg} - ) - ENDIF(SOUND) - ENDIF (TILES) - install(FILES ${RuntimeLib_GCC_ALL} - ${RuntimeLib_LOCALIZE} - ${RuntimeLib_SDL} - ${RuntimeLib_SDL_SOUND} - DESTINATION ${BIN_PREFIX} - ) + # Try to Install shared libraries for dev builds + # Note: It is specific to MSYS2 and uses hardcoded versions so + # probably it will fail if you run it :) + + # GCC-specific libraries + find_library(RuntimeLib_GCC_S_DW2_1 "gcc_s_dw2-1") + find_library(RuntimeLib_STDC_PP_6 "stdc++-6") + find_library(RuntimeLib_WINPTHREAD_1 "winpthread-1") + SET(RuntimeLib_GCC_ALL + ${RuntimeLib_GCC_S_DW2_1} + ${RuntimeLib_STDC_PP_6} + ${RuntimeLib_WINPTHREAD_1} + ) + IF (LOCALIZE) + find_library(RuntimeLib_iconv "libiconv-2") + find_library(RuntimeLib_intl "libintl-8") + SET(RuntimeLib_LOCALIZE + ${RuntimeLib_iconv} + ${RuntimeLib_intl} + ) + ENDIF (LOCALIZE) + IF (TILES) + # SDL2 can have a varius deps. Here you are the MSYS2 ones... + find_library(RuntimeLib_SDL2 "SDL2") + find_library(RuntimeLib_SDL2_IMG "SDL2_image") + find_library(RuntimeLib_png "libpng16-16") + find_library(RuntimeLib_jpeg "libjpeg-8") + find_library(RuntimeLib_jbig "libjbig-0") + find_library(RuntimeLib_tiff "libtiff-5") + find_library(RuntimeLib_webp "libwebp-5") + find_library(RuntimeLib_lzma "liblzma-5") + find_library(RuntimeLib_bz2 "libbz2-1") + find_library(RuntimeLib_zlib "zlib1") + find_library(RuntimeLib_hb "libharfbuzz-0") + find_library(RuntimeLib_SDL2_TTF "SDL2_ttf") + find_library(RuntimeLib_ft "libfreetype-6") + find_library(RuntimeLib_glib "libglib-2.0-0") + SET(RuntimeLib_SDL + ${RuntimeLib_SDL2} + ${RuntimeLib_SDL2_IMG} + ${RuntimeLib_png} + ${RuntimeLib_jpeg} + ${RuntimeLib_jbig} + ${RuntimeLib_tiff} + ${RuntimeLib_webp} + ${RuntimeLib_lzma} + ${RuntimeLib_bz2} + ${RuntimeLib_zlib} + ${RuntimeLib_hb} + ${RuntimeLib_SDL2_TTF} + ${RuntimeLib_ft} + ${RuntimeLib_glib} + ) + IF(SOUND) + find_library(RuntimeLib_SDL_SND "SDL2_mixer") + find_library(RuntimeLib_flak "libFLAC-8") + find_library(RuntimeLib_ogg "libogg-0") + find_library(RuntimeLib_flu "libfluidsynth-1") + find_library(RuntimeLib_port "libportaudio-2") + find_library(RuntimeLib_snd "libsndfile-1") + find_library(RuntimeLib_vorb "libvorbis-0") + find_library(RuntimeLib_vorb_enc "libvorbisenc-2") + find_library(RuntimeLib_vorb_f "libvorbisfile-3") + find_library(RuntimeLib_mod "libmodplug-1") + find_library(RuntimeLib_mpeg "smpeg2") + SET(RuntimeLib_SDL_SOUND + ${RuntimeLib_SDL_SND} + ${RuntimeLib_flak} + ${RuntimeLib_ogg} + ${RuntimeLib_flu} + ${RuntimeLib_port} + ${RuntimeLib_snd} + ${RuntimeLib_vorb} + ${RuntimeLib_vorb_enc} + ${RuntimeLib_vorb_f} + ${RuntimeLib_mod} + ${RuntimeLib_mpeg} + ) + ENDIF(SOUND) + ENDIF (TILES) + install(FILES ${RuntimeLib_GCC_ALL} + ${RuntimeLib_LOCALIZE} + ${RuntimeLib_SDL} + ${RuntimeLib_SDL_SOUND} + DESTINATION ${BIN_PREFIX} + ) ENDIF(MINGW AND NOT RELEASE) # vim:noet diff --git a/src/activity_handlers.cpp b/src/activity_handlers.cpp index f377962df64f5..23dfeef0e0d57 100644 --- a/src/activity_handlers.cpp +++ b/src/activity_handlers.cpp @@ -4440,14 +4440,19 @@ void activity_handlers::spellcasting_finish( player_activity *act, player *p ) } } while( !target_is_valid ); } else if( casting.has_flag( RANDOM_TARGET ) ) { - target = casting.random_valid_target( *p, p->pos() ); + const cata::optional target_ = casting.random_valid_target( *p, p->pos() ); + if( !target_ ) { + p->add_msg_if_player( m_bad, _( "Your spell can't find a suitable target." ) ); + return; + } + target = *target_; } // no turning back now. it's all said and done. bool success = no_fail || rng_float( 0.0f, 1.0f ) >= casting.spell_fail( *p ); int exp_gained = casting.casting_exp( *p ); if( !success ) { - p->add_msg_if_player( m_bad, "You lose your concentration!" ); + p->add_msg_if_player( m_bad, _( "You lose your concentration!" ) ); if( !casting.is_max_level() && level_override == -1 ) { // still get some experience for trying casting.gain_exp( exp_gained / 5 ); diff --git a/src/auto_pickup.cpp b/src/auto_pickup.cpp index b17d31723e38d..94fd78e676704 100644 --- a/src/auto_pickup.cpp +++ b/src/auto_pickup.cpp @@ -795,7 +795,7 @@ void rule_list::load_legacy_rules( std::istream &fin ) const int iNum = std::count( sLine.begin(), sLine.end(), ';' ); if( iNum != 2 ) { - DebugLog( D_ERROR, DC_ALL ) << "Bad Rule: " << sLine; + debugmsg( "Bad Rule: %s (will be skipped)", sLine ); } else { std::string sRule; bool bActive = true; diff --git a/src/character.cpp b/src/character.cpp index 8488082f42ab7..5d2f75985b3f6 100644 --- a/src/character.cpp +++ b/src/character.cpp @@ -210,8 +210,6 @@ static const species_id HUMAN( "HUMAN" ); Character::Character() : visitable(), - hp_cur( {{ 0 }} ), - hp_max( {{ 0 }} ), damage_bandaged( {{ 0 }} ), damage_disinfected( {{ 0 }} ), cached_time( calendar::before_time_starts ), @@ -219,6 +217,8 @@ Character::Character() : next_climate_control_check( calendar::before_time_starts ), last_climate_control_ret( false ) { + hp_cur.fill( 0 ); + hp_max.fill( 1 ); str_max = 0; dex_max = 0; per_max = 0; @@ -1111,10 +1111,8 @@ void Character::recalc_hp() if( new_max_hp[i] == hp_max[i] ) { continue; } - // Avoid NaN because converting NaN to int is undefined behavior. - if( hp_max[i] == 0 ) { - continue; - } + // hp_max must be positive to avoiud undefined behavior. + hp_max[i] = std::max( hp_max[i], 1 ); float max_hp_ratio = static_cast( new_max_hp[i] ) / static_cast( hp_max[i] ); hp_cur[i] = std::ceil( static_cast( hp_cur[i] ) * max_hp_ratio ); @@ -1268,10 +1266,10 @@ void Character::check_item_encumbrance_flag() { bool update_required = check_encumbrance; for( auto &i : worn ) { - if( !update_required && i.has_flag( "ENCUMBRANCE_UPDATE" ) ) { + if( !update_required && i.encumbrance_update_ ) { update_required = true; } - i.unset_flag( "ENCUMBRANCE_UPDATE" ); + i.encumbrance_update_ = false; } if( update_required ) { @@ -4042,6 +4040,7 @@ int Character::blood_loss( body_part bp ) const } hp_cur_sum = std::min( hp_max_sum, std::max( 0, hp_cur_sum ) ); + hp_max_sum = std::max( hp_max_sum, 1 ); return 100 - ( 100 * hp_cur_sum ) / hp_max_sum; } diff --git a/src/color.cpp b/src/color.cpp index eb065c27e14b7..e5c4824eb6af0 100644 --- a/src/color.cpp +++ b/src/color.cpp @@ -99,7 +99,7 @@ color_id color_manager::name_to_id( const std::string &name ) const { auto iter = name_map.find( name ); if( iter == name_map.end() ) { - DebugLog( D_ERROR, DC_ALL ) << "couldn't parse color: " << name ; + debugmsg( "couldn't parse color: %s", name ); return def_c_unset; } @@ -559,8 +559,8 @@ nc_color color_from_string( const std::string &color ) while( ( pos = new_color.find( i.second, pos ) ) != std::string::npos ) { new_color.replace( pos, i.second.length(), i.first ); pos += i.first.length(); - DebugLog( D_WARNING, DC_ALL ) << "Deprecated foreground color suffix was used: (" << - i.second << ") in (" << color << "). Please update mod that uses that."; + debugmsg( "Deprecated foreground color suffix was used: (%d) in (%s). Please update mod that uses that.", + i.second, color ); } } @@ -604,8 +604,8 @@ nc_color bgcolor_from_string( const std::string &color ) while( ( pos = new_color.find( i.second, pos ) ) != std::string::npos ) { new_color.replace( pos, i.second.length(), i.first ); pos += i.first.length(); - DebugLog( D_WARNING, DC_ALL ) << "Deprecated background color suffix was used: (" << - i.second << ") in (" << color << "). Please update mod that uses that."; + debugmsg( "Deprecated background color suffix was used: (%s) in (%s). Please update mod that uses that.", + i.second, color ); } } diff --git a/src/color_loader.h b/src/color_loader.h index 9c9d3c8695bd2..9099f6b9ab59e 100644 --- a/src/color_loader.h +++ b/src/color_loader.h @@ -71,8 +71,7 @@ class color_loader try { load_colorfile( custom_path ); } catch( const JsonError &err ) { - DebugLog( D_ERROR, D_SDL ) << "Failed to load color data from " << custom_path << ": " << - err.what(); + debugmsg( "Failed to load color data from \"%s\": %s", custom_path, err.what() ); // this should succeed, otherwise the installation is botched load_colorfile( default_path ); diff --git a/src/condition.cpp b/src/condition.cpp index 8a196f95fb223..6a1de477b1789 100644 --- a/src/condition.cpp +++ b/src/condition.cpp @@ -1030,7 +1030,7 @@ conditional_t::conditional_t( const JsonObject &jo ) set_npc_role_nearby( jo ); } else if( jo.has_int( "npc_allies" ) ) { set_npc_allies( jo ); - } else if( jo.has_int( "npc_service" ) ) { + } else if( jo.get_bool( "npc_service", false ) ) { set_npc_available(); } else if( jo.has_int( "u_has_cash" ) ) { set_u_has_cash( jo ); diff --git a/src/flag.cpp b/src/flag.cpp index a39b617ad5e21..611ccb45aac55 100644 --- a/src/flag.cpp +++ b/src/flag.cpp @@ -28,7 +28,7 @@ void json_flag::load( const JsonObject &jo ) // FIXME: most flags have a "context" field that isn't used for anything // Test for it here to avoid errors about unvisited members - jo.has_member( "context" ); + jo.get_member( "context" ); } void json_flag::check_consistency() diff --git a/src/item.cpp b/src/item.cpp index 0569205198a34..4d5d3a848a292 100644 --- a/src/item.cpp +++ b/src/item.cpp @@ -3697,7 +3697,7 @@ void item::on_contents_changed() convert( type->container->unseals_into ); } - set_flag( "ENCUMBRANCE_UPDATE" ); + encumbrance_update_ = true; } void item::on_damage( int, damage_type ) @@ -4127,6 +4127,13 @@ units::mass item::weight( bool include_contents, bool integral ) const ret *= 0.75; } + // if this is a gun apply all of its gunmods' weight multipliers + if( type->gun ) { + for( const item *mod : gunmods() ) { + ret *= mod->type->gunmod->weight_multiplier; + } + } + if( count_by_charges() ) { ret *= charges; diff --git a/src/item.h b/src/item.h index f0ac233d5ef52..b1a5017b510bc 100644 --- a/src/item.h +++ b/src/item.h @@ -2138,6 +2138,11 @@ class item : public visitable int mission_id = -1; // Refers to a mission in game's master list int player_id = -1; // Only give a mission to the right player! + // Set when the item / its content changes. Used for worn item with + // encumbrance depending on their content. + // This not part serialized or compared on purpose! + bool encumbrance_update_ = false; + private: /** * Accumulated rot, expressed as time the item has been in standard temperature. diff --git a/src/item_factory.cpp b/src/item_factory.cpp index 513e76b70619b..df038d0bab068 100644 --- a/src/item_factory.cpp +++ b/src/item_factory.cpp @@ -795,6 +795,7 @@ void Item_factory::init() add_actor( std::make_unique() ); add_actor( std::make_unique() ); add_actor( std::make_unique() ); + add_actor( std::make_unique() ); add_actor( std::make_unique() ); add_actor( std::make_unique() ); add_actor( std::make_unique() ); @@ -1713,19 +1714,19 @@ void Item_factory::load( islot_comestible &slot, const JsonObject &jo, const std bool got_calories = false; - if( jo.has_int( "calories" ) ) { + if( jo.has_member( "calories" ) ) { slot.default_nutrition.kcal = jo.get_int( "calories" ); got_calories = true; - } else if( relative.has_int( "calories" ) ) { + } else if( relative.has_member( "calories" ) ) { slot.default_nutrition.kcal += relative.get_int( "calories" ); got_calories = true; - } else if( proportional.has_float( "calories" ) ) { + } else if( proportional.has_member( "calories" ) ) { slot.default_nutrition.kcal *= proportional.get_float( "calories" ); got_calories = true; - } else if( jo.has_int( "nutrition" ) ) { + } else if( jo.has_member( "nutrition" ) ) { slot.default_nutrition.kcal = jo.get_int( "nutrition" ) * islot_comestible::kcal_per_nutr; } @@ -1825,6 +1826,7 @@ void Item_factory::load( islot_gunmod &slot, const JsonObject &jo, const std::st assign( jo, "consume_divisor", slot.consume_divisor ); assign( jo, "ammo_effects", slot.ammo_effects, strict ); assign( jo, "ups_charges_multiplier", slot.ups_charges_multiplier ); + assign( jo, "weight_multiplier", slot.weight_multiplier ); if( jo.has_int( "time" ) ) { slot.install_time = jo.get_int( "time" ); } else if( jo.has_string( "time" ) ) { @@ -2165,9 +2167,7 @@ void Item_factory::load_basic_info( const JsonObject &jo, itype &def, const std: def.drop_action = usage_from_object( tmp ).second; } - if( jo.has_string( "looks_like" ) ) { - def.looks_like = jo.get_string( "looks_like" ); - } + jo.read( "looks_like", def.looks_like ); if( jo.has_member( "conditional_names" ) ) { def.conditional_names.clear(); diff --git a/src/itype.h b/src/itype.h index 40a2c6186ce42..7679669a24035 100644 --- a/src/itype.h +++ b/src/itype.h @@ -590,6 +590,8 @@ struct islot_gunmod : common_ranged_data { /** Increases base gun UPS consumption by this many times per shot */ float ups_charges_multiplier = 1.0f; + /** Increases gun weight by this many times */ + float weight_multiplier = 1.0f; /** Firing modes added to or replacing those of the base gun */ std::map mode_modifier; diff --git a/src/iuse_actor.cpp b/src/iuse_actor.cpp index 11d0f9db113fc..ced80ef91af46 100644 --- a/src/iuse_actor.cpp +++ b/src/iuse_actor.cpp @@ -859,6 +859,45 @@ std::unique_ptr ups_based_armor_actor::clone() const return std::make_unique( *this ); } +std::unique_ptr place_npc_iuse::clone() const +{ + return std::make_unique( *this ); +} + +void place_npc_iuse::load( const JsonObject &obj ) +{ + npc_class_id = string_id( obj.get_string( "npc_class_id" ) ); + obj.read( "summon_msg", summon_msg ); + obj.read( "moves", moves ); + obj.read( "place_randomly", place_randomly ); +} + +int place_npc_iuse::use( player &p, item &, bool, const tripoint & ) const +{ + cata::optional target_pos; + if( place_randomly ) { + const tripoint_range target_range = points_in_radius( p.pos(), 1 ); + target_pos = random_point( target_range, []( const tripoint & t ) { + return !g->m.passable( t ); + } ); + } else { + const std::string query = _( "Place npc where?" ); + target_pos = choose_adjacent( _( "Place npc where?" ) ); + } + if( !target_pos ) { + return 0; + } + if( !g->m.passable( target_pos.value() ) ) { + p.add_msg_if_player( m_info, _( "There is no square to spawn npc in!" ) ); + return 0; + } + + g->m.place_npc( target_pos.value().xy(), npc_class_id ); + p.mod_moves( -moves ); + p.add_msg_if_player( m_info, "%s", _( summon_msg ) ); + return 1; +} + void ups_based_armor_actor::load( const JsonObject &obj ) { obj.read( "activate_msg", activate_msg ); diff --git a/src/iuse_actor.h b/src/iuse_actor.h index 914830a8682fc..4b72ccb685c58 100644 --- a/src/iuse_actor.h +++ b/src/iuse_actor.h @@ -15,6 +15,7 @@ #include "explosion.h" #include "game_constants.h" #include "iuse.h" +class npc_template; #include "ret_val.h" #include "string_id.h" #include "translations.h" @@ -310,6 +311,24 @@ class place_monster_iuse : public iuse_actor std::unique_ptr clone() const override; }; +/** + * This iuse contains the logic to summon an npc on the map. + */ +class place_npc_iuse : public iuse_actor +{ + public: + string_id npc_class_id; + bool place_randomly = false; + int moves = 100; + std::string summon_msg; + + place_npc_iuse() : iuse_actor( "place_npc" ) { } + ~place_npc_iuse() override = default; + void load( const JsonObject &obj ) override; + int use( player &, item &, bool, const tripoint & ) const override; + std::unique_ptr clone() const override; +}; + /** * Items that can be worn and can be activated to consume energy from UPS. * Note that the energy consumption is done in @ref player::process_active_items, it is diff --git a/src/json.cpp b/src/json.cpp index 02a6592fa97ca..5c6a1b95d3eeb 100644 --- a/src/json.cpp +++ b/src/json.cpp @@ -156,13 +156,11 @@ int JsonObject::verify_position( const std::string &name, // so it will never indicate a valid member position return 0; } - visited_members.insert( name ); return iter->second; } bool JsonObject::has_member( const std::string &name ) const { - visited_members.insert( name ); return positions.count( name ) > 0; } @@ -233,6 +231,7 @@ void JsonObject::throw_error( std::string err ) const JsonIn *JsonObject::get_raw( const std::string &name ) const { int pos = verify_position( name ); + visited_members.insert( name ); jsin->seek( pos ); return jsin; } @@ -241,9 +240,7 @@ JsonIn *JsonObject::get_raw( const std::string &name ) const bool JsonObject::get_bool( const std::string &name ) const { - int pos = verify_position( name ); - jsin->seek( pos ); - return jsin->get_bool(); + return get_member( name ).get_bool(); } bool JsonObject::get_bool( const std::string &name, const bool fallback ) const @@ -252,15 +249,14 @@ bool JsonObject::get_bool( const std::string &name, const bool fallback ) const if( !pos ) { return fallback; } + visited_members.insert( name ); jsin->seek( pos ); return jsin->get_bool(); } int JsonObject::get_int( const std::string &name ) const { - int pos = verify_position( name ); - jsin->seek( pos ); - return jsin->get_int(); + return get_member( name ).get_int(); } int JsonObject::get_int( const std::string &name, const int fallback ) const @@ -269,15 +265,14 @@ int JsonObject::get_int( const std::string &name, const int fallback ) const if( !pos ) { return fallback; } + visited_members.insert( name ); jsin->seek( pos ); return jsin->get_int(); } double JsonObject::get_float( const std::string &name ) const { - int pos = verify_position( name ); - jsin->seek( pos ); - return jsin->get_float(); + return get_member( name ).get_float(); } double JsonObject::get_float( const std::string &name, const double fallback ) const @@ -286,15 +281,14 @@ double JsonObject::get_float( const std::string &name, const double fallback ) c if( !pos ) { return fallback; } + visited_members.insert( name ); jsin->seek( pos ); return jsin->get_float(); } std::string JsonObject::get_string( const std::string &name ) const { - int pos = verify_position( name ); - jsin->seek( pos ); - return jsin->get_string(); + return get_member( name ).get_string(); } std::string JsonObject::get_string( const std::string &name, const std::string &fallback ) const @@ -303,6 +297,7 @@ std::string JsonObject::get_string( const std::string &name, const std::string & if( !pos ) { return fallback; } + visited_members.insert( name ); jsin->seek( pos ); return jsin->get_string(); } @@ -315,6 +310,7 @@ JsonArray JsonObject::get_array( const std::string &name ) const if( !pos ) { return JsonArray(); } + visited_members.insert( name ); jsin->seek( pos ); return JsonArray( *jsin ); } @@ -343,6 +339,7 @@ JsonObject JsonObject::get_object( const std::string &name ) const if( !pos ) { return JsonObject(); } + visited_members.insert( name ); jsin->seek( pos ); return jsin->get_object(); } @@ -355,6 +352,7 @@ bool JsonObject::has_null( const std::string &name ) const if( !pos ) { return false; } + visited_members.insert( name ); jsin->seek( pos ); return jsin->test_null(); } diff --git a/src/json.h b/src/json.h index a6597cafe85bd..5fc6f9d64fb0e 100644 --- a/src/json.h +++ b/src/json.h @@ -856,11 +856,13 @@ class JsonObject if( !has_member( name ) ) { return fallback; } + visited_members.insert( name ); jsin->seek( verify_position( name ) ); return jsin->get_enum_value(); } template::value>::type> E get_enum_value( const std::string &name ) const { + visited_members.insert( name ); jsin->seek( verify_position( name ) ); return jsin->get_enum_value(); } @@ -904,6 +906,7 @@ class JsonObject if( !pos ) { return false; } + visited_members.insert( name ); jsin->seek( pos ); return jsin->read( t, throw_on_error ); } @@ -1290,6 +1293,7 @@ std::set JsonObject::get_tags( const std::string &name ) const if( !pos ) { return res; } + visited_members.insert( name ); jsin->seek( pos ); // allow single string as tag diff --git a/src/magic.cpp b/src/magic.cpp index 47ad78291b9f8..ad0641717a34c 100644 --- a/src/magic.cpp +++ b/src/magic.cpp @@ -1092,10 +1092,9 @@ void spell::cast_all_effects( Creature &source, const tripoint &target ) const source.add_msg_if_player( sp.message() ); if( sp.has_flag( RANDOM_TARGET ) ) { - if( _self ) { - sp.cast_all_effects( source, sp.random_valid_target( source, source.pos() ) ); - } else { - sp.cast_all_effects( source, sp.random_valid_target( source, target ) ); + if( const cata::optional new_target = sp.random_valid_target( source, + _self ? source.pos() : target ) ) { + sp.cast_all_effects( source, *new_target ); } } else { if( _self ) { @@ -1111,10 +1110,9 @@ void spell::cast_all_effects( Creature &source, const tripoint &target ) const for( const fake_spell &extra_spell : type->additional_spells ) { spell sp = extra_spell.get_spell( get_level() ); if( sp.has_flag( RANDOM_TARGET ) ) { - if( extra_spell.self ) { - sp.cast_all_effects( source, sp.random_valid_target( source, source.pos() ) ); - } else { - sp.cast_all_effects( source, sp.random_valid_target( source, target ) ); + if( const cata::optional new_target = sp.random_valid_target( source, + extra_spell.self ? source.pos() : target ) ) { + sp.cast_all_effects( source, *new_target ); } } else { if( extra_spell.self ) { @@ -1127,20 +1125,20 @@ void spell::cast_all_effects( Creature &source, const tripoint &target ) const } } -tripoint spell::random_valid_target( const Creature &caster, const tripoint &caster_pos ) const +cata::optional spell::random_valid_target( const Creature &caster, + const tripoint &caster_pos ) const { - const std::set area = spell_effect::spell_effect_blast( *this, caster_pos, caster_pos, - range(), false ); std::set valid_area; - for( const tripoint &target : area ) { + for( const tripoint &target : spell_effect::spell_effect_blast( *this, caster_pos, caster_pos, + range(), false ) ) { if( is_valid_target( caster, target ) ) { valid_area.emplace( target ); } } - size_t rand_i = rng( 0, valid_area.size() - 1 ); - auto iter = valid_area.begin(); - std::advance( iter, rand_i ); - return *iter; + if( valid_area.empty() ) { + return cata::nullopt; + } + return random_entry( valid_area ); } // player diff --git a/src/magic.h b/src/magic.h index d57ef3d6e6bae..32dc8d1e86328 100644 --- a/src/magic.h +++ b/src/magic.h @@ -402,7 +402,8 @@ class spell bool is_valid_effect_target( valid_target t ) const; // picks a random valid tripoint from @area - tripoint random_valid_target( const Creature &caster, const tripoint &caster_pos ) const; + cata::optional random_valid_target( const Creature &caster, + const tripoint &caster_pos ) const; }; class known_magic diff --git a/src/main_menu.cpp b/src/main_menu.cpp index 0eb408b35fa3b..f398b07f228bd 100644 --- a/src/main_menu.cpp +++ b/src/main_menu.cpp @@ -41,7 +41,7 @@ #define dbg(x) DebugLog((DebugLevel)(x),D_GAME) << __FILE__ << ":" << __LINE__ << ": " -static const holiday current_holiday = holiday::christmas; +static const holiday current_holiday = holiday::new_year; void main_menu::on_move() const { @@ -302,7 +302,7 @@ void main_menu::init_strings() std::string line; while( std::getline( stream, line ) ) { if( line[0] != '#' ) { - mmenu_credits + ( line.empty() ? " " : line ) + "\n"; + mmenu_credits += ( line.empty() ? " " : line ) + "\n"; } } } ); diff --git a/src/mapdata.cpp b/src/mapdata.cpp index 51908adb959e0..6ac4e396e74cb 100644 --- a/src/mapdata.cpp +++ b/src/mapdata.cpp @@ -376,9 +376,7 @@ void map_data_common_t::load_symbol( const JsonObject &jo ) if( jo.has_member( "copy-from" ) && looks_like.empty() ) { looks_like = jo.get_string( "copy-from" ); } - if( jo.has_member( "looks_like" ) ) { - looks_like = jo.get_string( "looks_like" ); - } + jo.read( "looks_like", looks_like ); load_season_array( jo, "symbol", symbol_, [&jo]( const std::string & str ) { if( str == "LINE_XOXO" ) { diff --git a/src/mapgen.cpp b/src/mapgen.cpp index dcb2210f5c8c9..f4b5f8c7eb289 100644 --- a/src/mapgen.cpp +++ b/src/mapgen.cpp @@ -628,6 +628,7 @@ void mapgen_function_json_base::setup_setmap( const JsonArray &parray ) tmp_x2 = jmapgen_int( pjo, "x2" ); tmp_y2 = jmapgen_int( pjo, "y2" ); if( !check_inbounds( tmp_x2, tmp_y2, pjo ) ) { + pjo.allow_omitted_members(); continue; } } @@ -2085,7 +2086,7 @@ mapgen_palette mapgen_palette::load_internal( const JsonObject &jo, const std::s // mandatory: every character in rows must have matching entry, unless fill_ter is set // "terrain": { "a": "t_grass", "b": "t_lava" } - if( jo.has_object( "terrain" ) ) { + if( jo.has_member( "terrain" ) ) { JsonObject pjo = jo.get_object( "terrain" ); for( const auto &key : pjo.get_member_names() ) { if( key.size() != 1 ) { diff --git a/src/material.cpp b/src/material.cpp index 629c910fc8ad9..ffc29bfd67944 100644 --- a/src/material.cpp +++ b/src/material.cpp @@ -93,7 +93,7 @@ void material_type::load( const JsonObject &jsobj, const std::string & ) for( JsonObject brn : jsobj.get_array( "burn_data" ) ) { _burn_data.emplace_back( load_mat_burn_data( brn ) ); } - } + } if( _burn_data.empty() ) { // If not specified, supply default mat_burn_data mbd; diff --git a/src/mission_util.cpp b/src/mission_util.cpp index 105ec3306d78d..18f1c889605ed 100644 --- a/src/mission_util.cpp +++ b/src/mission_util.cpp @@ -359,56 +359,56 @@ tripoint mission_util::target_om_ter_random( const std::string &omter, int revea mission_target_params mission_util::parse_mission_om_target( const JsonObject &jo ) { mission_target_params p; - if( jo.has_string( "om_terrain" ) ) { + if( jo.has_member( "om_terrain" ) ) { p.overmap_terrain = jo.get_string( "om_terrain" ); } - if( jo.has_string( "om_terrain_match_type" ) ) { + if( jo.has_member( "om_terrain_match_type" ) ) { p.overmap_terrain_match_type = jo.get_enum_value( "om_terrain_match_type" ); } - if( jo.has_bool( "origin_npc" ) ) { + if( jo.get_bool( "origin_npc", false ) ) { p.origin_u = false; } - if( jo.has_string( "om_terrain_replace" ) ) { + if( jo.has_member( "om_terrain_replace" ) ) { p.replaceable_overmap_terrain = jo.get_string( "om_terrain_replace" ); } - if( jo.has_string( "om_special" ) ) { + if( jo.has_member( "om_special" ) ) { p.overmap_special = overmap_special_id( jo.get_string( "om_special" ) ); } - if( jo.has_int( "reveal_radius" ) ) { + if( jo.has_member( "reveal_radius" ) ) { p.reveal_radius = std::max( 1, jo.get_int( "reveal_radius" ) ); } - if( jo.has_bool( "must_see" ) ) { + if( jo.has_member( "must_see" ) ) { p.must_see = jo.get_bool( "must_see" ); } - if( jo.has_bool( "cant_see" ) ) { + if( jo.has_member( "cant_see" ) ) { p.cant_see = jo.get_bool( "cant_see" ); } - if( jo.has_bool( "exclude_seen" ) ) { + if( jo.has_member( "exclude_seen" ) ) { p.random = jo.get_bool( "exclude" ); } - if( jo.has_bool( "random" ) ) { + if( jo.has_member( "random" ) ) { p.random = jo.get_bool( "random" ); } - if( jo.has_int( "search_range" ) ) { + if( jo.has_member( "search_range" ) ) { p.search_range = std::max( 1, jo.get_int( "search_range" ) ); } - if( jo.has_int( "min_distance" ) ) { + if( jo.has_member( "min_distance" ) ) { p.min_distance = std::max( 1, jo.get_int( "min_distance" ) ); } - if( jo.has_int( "offset_x" ) || jo.has_int( "offset_y" ) || jo.has_int( "offset_z" ) ) { + if( jo.has_member( "offset_x" ) || jo.has_member( "offset_y" ) || jo.has_member( "offset_z" ) ) { tripoint offset; - if( jo.has_int( "offset_x" ) ) { + if( jo.has_member( "offset_x" ) ) { offset.x = jo.get_int( "offset_x" ); } - if( jo.has_int( "offset_y" ) ) { + if( jo.has_member( "offset_y" ) ) { offset.y = jo.get_int( "offset_y" ); } - if( jo.has_int( "offset_z" ) ) { + if( jo.has_member( "offset_z" ) ) { offset.z = jo.get_int( "offset_z" ); } p.offset = offset; } - if( jo.has_int( "z" ) ) { + if( jo.has_member( "z" ) ) { p.z = jo.get_int( "z" ); } return p; @@ -439,9 +439,6 @@ void mission_util::set_reveal_any( const JsonArray &ja, void mission_util::set_assign_om_target( const JsonObject &jo, std::vector> &funcs ) { - if( !jo.has_string( "om_terrain" ) ) { - jo.throw_error( "'om_terrain' is required for assign_mission_target" ); - } mission_target_params p = parse_mission_om_target( jo ); const auto mission_func = [p]( mission * miss ) { mission_target_params mtp = p; @@ -461,7 +458,7 @@ bool mission_util::set_update_mapgen( const JsonObject &jo, return false; } - if( jo.has_string( "om_special" ) && jo.has_string( "om_terrain" ) ) { + if( jo.has_member( "om_terrain" ) ) { const std::string om_terrain = jo.get_string( "om_terrain" ); const auto mission_func = [update_map, om_terrain]( mission * miss ) { tripoint update_pos3 = mission_util::reveal_om_ter( om_terrain, 1, false ); @@ -484,9 +481,9 @@ bool mission_util::load_funcs( const JsonObject &jo, if( jo.has_string( "reveal_om_ter" ) ) { const std::string target_terrain = jo.get_string( "reveal_om_ter" ); set_reveal( target_terrain, funcs ); - } else if( jo.has_array( "reveal_om_ter" ) ) { + } else if( jo.has_member( "reveal_om_ter" ) ) { set_reveal_any( jo.get_array( "reveal_om_ter" ), funcs ); - } else if( jo.has_object( "assign_mission_target" ) ) { + } else if( jo.has_member( "assign_mission_target" ) ) { JsonObject mission_target = jo.get_object( "assign_mission_target" ); set_assign_om_target( mission_target, funcs ); } @@ -496,7 +493,7 @@ bool mission_util::load_funcs( const JsonObject &jo, if( !set_update_mapgen( update_mapgen, funcs ) ) { return false; } - } else if( jo.has_array( "update_mapgen" ) ) { + } else { for( JsonObject update_mapgen : jo.get_array( "update_mapgen" ) ) { if( !set_update_mapgen( update_mapgen, funcs ) ) { return false; diff --git a/src/mod_tileset.cpp b/src/mod_tileset.cpp index 09c27d76c7a60..3c0fa9a9ef9f3 100644 --- a/src/mod_tileset.cpp +++ b/src/mod_tileset.cpp @@ -24,6 +24,11 @@ void load_mod_tileset( const JsonObject &jsobj, const std::string &, const std:: for( const std::string &compatible_tileset_id : compatibility ) { all_mod_tilesets.back().add_compatible_tileset( compatible_tileset_id ); } + if( jsobj.has_member( "tiles-new" ) ) { + // tiles-new is read when initializing graphics, inside `tileset_loader::load`. + // calling get_array here to suppress warnings in the unit test. + jsobj.get_array( "tiles-new" ); + } } void reset_mod_tileset() diff --git a/src/monstergenerator.cpp b/src/monstergenerator.cpp index a03e930232131..fd50a23330c26 100644 --- a/src/monstergenerator.cpp +++ b/src/monstergenerator.cpp @@ -629,9 +629,7 @@ void mtype::load( const JsonObject &jo, const std::string &src ) if( was_loaded && jo.has_member( "copy-from" ) && looks_like.empty() ) { looks_like = jo.get_string( "copy-from" ); } - if( jo.has_member( "looks_like" ) ) { - looks_like = jo.get_string( "looks_like" ); - } + jo.read( "looks_like", looks_like ); assign( jo, "bodytype", bodytype ); assign( jo, "color", color ); diff --git a/src/npctalk.cpp b/src/npctalk.cpp index 454c47dd500a3..b0fa2e0c49064 100644 --- a/src/npctalk.cpp +++ b/src/npctalk.cpp @@ -1778,7 +1778,7 @@ talk_trial::talk_trial( const JsonObject &jo ) read_condition( jo, "condition", condition, false ); - if( jo.has_array( "mod" ) ) { + if( jo.has_member( "mod" ) ) { for( JsonArray jmod : jo.get_array( "mod" ) ) { trial_mod this_modifier; this_modifier.first = jmod.next_string(); @@ -2886,11 +2886,11 @@ dynamic_line_t::dynamic_line_t( const JsonObject &jo ) } return all_lines; }; - } else if( jo.has_member( "give_hint" ) ) { + } else if( jo.get_bool( "give_hint", false ) ) { function = [&]( const dialogue & ) { return get_hint(); }; - } else if( jo.has_member( "use_reason" ) ) { + } else if( jo.get_bool( "use_reason", false ) ) { function = [&]( const dialogue & d ) { std::string tmp = d.reason; d.reason.clear(); @@ -2918,6 +2918,10 @@ dynamic_line_t::dynamic_line_t( const JsonObject &jo ) const dynamic_line_t no = from_member( jo, "no" ); for( const std::string &sub_member : dialogue_data::simple_string_conds ) { if( jo.has_bool( sub_member ) ) { + // This also marks the member as visited. + if( !jo.get_bool( sub_member ) ) { + jo.throw_error( "value must be true", sub_member ); + } dcondition = conditional_t( sub_member ); function = [dcondition, yes, no]( const dialogue & d ) { return ( dcondition( d ) ? yes : no )( d ); diff --git a/src/npctrade.cpp b/src/npctrade.cpp index 2f7e6c1c6cd34..5ad8634d524e3 100644 --- a/src/npctrade.cpp +++ b/src/npctrade.cpp @@ -63,9 +63,6 @@ void npc_trading::transfer_items( std::vector &stuff, player &give } 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 ) { diff --git a/src/options.cpp b/src/options.cpp index 7131ef7e88121..1f8c6a6a81e59 100644 --- a/src/options.cpp +++ b/src/options.cpp @@ -884,8 +884,8 @@ static std::vector build_resource_list( resource_names.emplace_back( resource_name, view_name.empty() ? no_translation( resource_name ) : to_translation( view_name ) ); if( resource_option.count( resource_name ) != 0 ) { - DebugLog( D_ERROR, DC_ALL ) << "Found " << operation_name << " duplicate with name " << - resource_name; + debugmsg( "Found \"%s\" duplicate with name \"%s\" (new definition will be ignored)", + operation_name, resource_name ); } else { resource_option.insert( std::pair( resource_name, resource_dir ) ); } @@ -1245,11 +1245,6 @@ void options_manager::add_options_general() "ask" ); - add( "MAP_UI_SEARCH_RADIUS", "general", translate_marker( "Map search radius" ), - translate_marker( "Radius around the cursor to search in the map UI. Setting very high may be slow." ), - 10, 4000, 100 - ); - mOptionsSort["general"]++; add( "SOUND_ENABLED", "general", translate_marker( "Sound Enabled" ), @@ -2820,16 +2815,12 @@ void options_manager::deserialize( JsonIn &jsin ) jsin.start_array(); while( !jsin.end_array() ) { JsonObject joOptions = jsin.get_object(); + joOptions.allow_omitted_members(); const std::string name = migrateOptionName( joOptions.get_string( "name" ) ); const std::string value = migrateOptionValue( joOptions.get_string( "name" ), joOptions.get_string( "value" ) ); - // Verify format of options file - if( !joOptions.has_string( "info" ) || !joOptions.has_string( "default" ) ) { - dbg( D_ERROR ) << "options object " << name << " was missing info or default"; - } - add_retry( name, value ); options[ name ].setValue( value ); } diff --git a/src/overmap.cpp b/src/overmap.cpp index a87882c4e145a..1aeed0c2eedec 100644 --- a/src/overmap.cpp +++ b/src/overmap.cpp @@ -582,8 +582,8 @@ void oter_type_t::load( const JsonObject &jo, const std::string &src ) << id.c_str() << " (" << name << ")"; } if( !jo.has_string( "sym" ) && jo.has_number( "sym" ) ) { - DebugLog( D_ERROR, D_MAP_GEN ) << "sym is defined as number instead of string for overmap_terrain: " - << id.c_str() << " (" << name << ")"; + debugmsg( "sym is defined as number instead of string for overmap_terrain %s (%s)", id.c_str(), + name ); } load_overmap_terrain_mapgens( jo, id.str() ); } diff --git a/src/overmap_ui.cpp b/src/overmap_ui.cpp index 47f5577928f83..15bad3645c8d0 100644 --- a/src/overmap_ui.cpp +++ b/src/overmap_ui.cpp @@ -1089,14 +1089,9 @@ void create_note( const tripoint &curs ) static bool search( tripoint &curs, const tripoint &orig, const bool show_explored, const bool fast_scroll, std::string &action ) { - const int radius = get_option( "MAP_UI_SEARCH_RADIUS" ); - std::string term = string_input_popup() .title( _( "Search term:" ) ) - .description( string_format( - _( "Multiple entries separated with comma (,). Excludes starting with hyphen (-)\n" - "Current search radius is %d. It can be changed in options." ), - radius ) ) + .description( _( "Multiple entries separated with comma (,). Excludes starting with hyphen (-)." ) ) .query_string(); if( term.empty() ) { return false; @@ -1105,6 +1100,7 @@ static bool search( tripoint &curs, const tripoint &orig, const bool show_explor std::vector locations; std::vector overmap_checked; + const int radius = OMAPX / 2; // arbitrary for( const tripoint &p : points_in_radius( curs, radius ) ) { overmap_with_local_coords om_loc = overmap_buffer.get_existing_om_global( p ); diff --git a/src/player.cpp b/src/player.cpp index f4aae4b9a3969..fbfe23d0c5b07 100644 --- a/src/player.cpp +++ b/src/player.cpp @@ -3318,10 +3318,10 @@ void player::process_items() } else if( identifier == "adv_UPS_off" ) { ch_UPS += w.ammo_remaining() / 0.6; } - if( !update_required && w.has_flag( "ENCUMBRANCE_UPDATE" ) ) { + if( !update_required && w.encumbrance_update_ ) { update_required = true; } - w.unset_flag( "ENCUMBRANCE_UPDATE" ); + w.encumbrance_update_ = false; } if( update_required ) { reset_encumbrance(); @@ -5780,7 +5780,7 @@ comfort_level player::base_comfort_value( const tripoint &p ) const } else if( plantsleep ) { if( vp || furn_at_pos != f_null ) { // Sleep ain't happening in a vehicle or on furniture - comfort = static_cast( comfort_level::uncomfortable ); + comfort = static_cast( comfort_level::impossible ); } else { // It's very easy for Chloromorphs to get to sleep on soil! if( ter_at_pos == t_dirt || ter_at_pos == t_pit || ter_at_pos == t_dirtmound || @@ -5793,7 +5793,7 @@ comfort_level player::base_comfort_value( const tripoint &p ) const } // Sleep ain't happening else { - comfort = static_cast( comfort_level::uncomfortable ); + comfort = static_cast( comfort_level::impossible ); } } // Has webforce @@ -5802,7 +5802,7 @@ comfort_level player::base_comfort_value( const tripoint &p ) const // Thick Web and you're good to go comfort += static_cast( comfort_level::very_comfortable ); } else { - comfort = static_cast( comfort_level::uncomfortable ); + comfort = static_cast( comfort_level::impossible ); } } diff --git a/src/player.h b/src/player.h index 47eefb8e821fa..81f548d5dbdb8 100644 --- a/src/player.h +++ b/src/player.h @@ -122,7 +122,8 @@ enum class rechargeable_cbm { }; enum class comfort_level { - uncomfortable = -999, + impossible = -999, + uncomfortable = -7, neutral = 0, slightly_comfortable = 3, comfortable = 5, diff --git a/src/safemode_ui.cpp b/src/safemode_ui.cpp index ae03647b6a93f..d4b1fdbee119e 100644 --- a/src/safemode_ui.cpp +++ b/src/safemode_ui.cpp @@ -682,7 +682,7 @@ void safemode::load( const bool is_character_in ) JsonIn jsin( fin ); deserialize( jsin ); } catch( const JsonError &e ) { - DebugLog( D_ERROR, DC_ALL ) << "safemode::load: " << e; + debugmsg( "Error while loading safemode settings: %s", e.what() ); } } diff --git a/src/veh_type.cpp b/src/veh_type.cpp index 6d62cfdcb1be9..1c47cbb693e45 100644 --- a/src/veh_type.cpp +++ b/src/veh_type.cpp @@ -376,9 +376,7 @@ void vpart_info::load( const JsonObject &jo, const std::string &src ) if( jo.has_member( "broken_symbol" ) ) { def.sym_broken = jo.get_string( "broken_symbol" )[ 0 ]; } - if( jo.has_member( "looks_like" ) ) { - def.looks_like = jo.get_string( "looks_like" ); - } + jo.read( "looks_like", def.looks_like ); if( jo.has_member( "color" ) ) { def.color = color_from_string( jo.get_string( "color" ) ); diff --git a/src/weather.cpp b/src/weather.cpp index 3ff7296a31b88..2cdbac5932c84 100644 --- a/src/weather.cpp +++ b/src/weather.cpp @@ -715,8 +715,14 @@ int get_local_windchill( double temperature, double humidity, double windpower ) tmpwind = tmpwind * 0.44704; tmptemp = temp_to_celsius( tmptemp ); - windchill = 0.33 * ( humidity / 100.00 * 6.105 * exp( 17.27 * tmptemp / - ( 237.70 + tmptemp ) ) ) - 0.70 * tmpwind - 4.00; + // Cap the vapor pressure term to 50C of extra heat, as this term + // otherwise grows logistically to an asymptotic value of about 2e7 + // for large values of temperature. This is presumably due to the + // model being designed for reasonable ambient temperature values, + // rather than extremely high ones. + windchill = 0.33 * std::min( 150.00, humidity / 100.00 * 6.105 * + exp( 17.27 * tmptemp / ( 237.70 + tmptemp ) ) ) - 0.70 * + tmpwind - 4.00; // Convert to Fahrenheit, but omit the '+ 32' because we are only dealing with a piece of the felt air temperature equation. windchill = windchill * 9 / 5; } diff --git a/src/worldfactory.cpp b/src/worldfactory.cpp index 1b43684991eae..a4fb5c973b0ba 100644 --- a/src/worldfactory.cpp +++ b/src/worldfactory.cpp @@ -1332,15 +1332,11 @@ void WORLD::load_options( JsonIn &jsin ) jsin.start_array(); while( !jsin.end_array() ) { JsonObject jo = jsin.get_object(); + jo.allow_omitted_members(); const std::string name = opts.migrateOptionName( jo.get_string( "name" ) ); const std::string value = opts.migrateOptionValue( jo.get_string( "name" ), jo.get_string( "value" ) ); - // Verify format of options file - if( !jo.has_string( "info" ) || !jo.has_string( "default" ) ) { - dbg( D_ERROR ) << "options object " << name << " was missing info or default"; - } - if( name == "CORE_VERSION" ) { version = std::max( std::atoi( value.c_str() ), 0 ); continue; diff --git a/tests/vehicle_efficiency.cpp b/tests/vehicle_efficiency.cpp index e45c978e21c2c..890846a0dab99 100644 --- a/tests/vehicle_efficiency.cpp +++ b/tests/vehicle_efficiency.cpp @@ -429,22 +429,22 @@ TEST_CASE( "vehicle_make_efficiency_case", "[.]" ) // Fix test for electric vehicles TEST_CASE( "vehicle_efficiency", "[vehicle] [engine]" ) { - test_vehicle( "beetle", 745101, 294587, 242197, 79708, 60855 ); - test_vehicle( "car", 1050050, 522175, 313125, 48143, 29452 ); - test_vehicle( "car_sports", 1083646, 456200, 320929, 39494, 24378 ); - test_vehicle( "electric_car", 1055519, 215663, 125341, 18172, 9614 ); - test_vehicle( "suv", 1249718, 988969, 499869, 73538, 35070 ); + test_vehicle( "beetle", 745101, 297500, 244600, 80500, 61460 ); + test_vehicle( "car", 1050050, 527300, 316200, 48620, 29740 ); + test_vehicle( "car_sports", 1083646, 456200, 324100, 39880, 24620 ); + test_vehicle( "electric_car", 1055519, 217800, 126500, 18350, 9710 ); + test_vehicle( "suv", 1249718, 998800, 504800, 74270, 35420 ); test_vehicle( "motorcycle", 163085, 77300, 63120, 47530, 39030 ); test_vehicle( "quad_bike", 265345, 75950, 75950, 35190, 35190 ); test_vehicle( "scooter", 62587, 266900, 258300, 195200, 184400 ); test_vehicle( "superbike", 242085, 72120, 46820, 34580, 21610 ); - test_vehicle( "ambulance", 1751089, 432000, 356896, 65848, 50876 ); - test_vehicle( "fire_engine", 2540401, 1169000, 972534, 246049, 216909 ); - test_vehicle( "fire_truck", 6226393, 308500, 199989, 19950, 4747 ); + test_vehicle( "ambulance", 1751089, 435300, 360400, 66500, 51380 ); + test_vehicle( "fire_engine", 2540401, 1174000, 982200, 248500, 219000 ); + test_vehicle( "fire_truck", 6226393, 308500, 201900, 19950, 4747 ); test_vehicle( "truck_swat", 5959334, 505800, 348000, 30060, 7719 ); test_vehicle( "tractor_plow", 723658, 528000, 528000, 117000, 117000 ); test_vehicle( "apc", 5801619, 1100000, 948300, 132800, 86880 ); - test_vehicle( "humvee", 5499145, 607600, 341100, 25880, 9263 ); - test_vehicle( "road_roller", 8705726, 359830, 414037, 22990, 6996 ); - test_vehicle( "golf_cart", 444630, 52800, 105591, 27250, 14207 ); + test_vehicle( "humvee", 5501345, 607600, 341100, 25880, 9263 ); + test_vehicle( "road_roller", 8705726, 363400, 418100, 22990, 6996 ); + test_vehicle( "golf_cart", 444630, 52460, 105500, 27250, 14200 ); }